Re: how to make nasty code less nasty (obtaining sqlite db handle)

From: Date: Fri, 04 Feb 2005 01:36:58 +0000
Subject: Re: how to make nasty code less nasty (obtaining sqlite db handle)
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-14628@lists.php.net to get a copy of this message
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, Derrell.Lipman@unwireduniverse.com <Derrell.Lipman@unwireduniverse.com> 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 > >

« previous php.internals (#14628) next »