There is no official way to do this kind of thing between arbitrary extensions. When extensions that are written to share this information, they typically export an XXX_API function that you can link against to fetch the data.
What you've done works, so that's fine, although there is a risk of crashing if someone passes the wrong type of resource in. If you're thinking of distributing your extension, we could add a more official API for you to use, although that doesn't exist in older versions of the extension, etc. etc. Some time back, I proposed a framework (and even a patch IIRC) that allowed this kind of thing at run-time; despite "we the extension developers" liking the idea, there was some negative feedback from andi/zeev so it never went further. Search the php-dev archives for my name and "interfaces" for more on that if you're interesting in this seeing light in PHP 5.2. --Wez. On Thu, 03 Feb 2005 17:03:45 -0500, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > 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 > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php