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