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

Reply via email to