I've written an extension which needs to accept a Resource which is an SQLite
database handle, and call a C function which will be using that db handle to
issue queries.  What I've done works, but is kinda nasty because there doesn't
appear to be a clean way to obtain that database handle nor, from what I can
tell, determine the resource type to expect.  Is there a nicer way of doing
this?

PHP_FUNCTION(my_PHP_function)
{
    int             id;
    int             dataLen;
    int             resourceType;
    char *          pData;
    zval *          zdb;
    void *          hDB;
    void **         phDB;

    /* Ensure we got the correct number of parameters */
    if (ZEND_NUM_ARGS() != 2)
    {
        WRONG_PARAM_COUNT;
    }

    /* Retrieve the parameters */
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
                              "rs",
                              &zdb, &pData, &dataLen) == FAILURE)
    {
        return;
    }

    /*
     * Voodoo to retrieve the sqlite database handle from the resource.
     * How do I validate that resourceType is reasonable?
     */
    id = zdb->value.lval;
    if ((phDB = zend_list_find(id, &resourceType)) == NULL)
    {
        return;
    }

    /*
     * This is nasty too.  We "know" that the first field in the private
     * structure is the database handle.  Just extract it.
     */
    hDB = *phDB;

    RETURN_STRING(my_C_function(hDB, pData), TRUE);
}


Thanks,

Derrell

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to