@@ -103,19 +103,60 @@ ZEND_GET_MODULE(dba)
103
103
/* these are used to get the standard arguments */
104
104
105
105
#define DBA_GET1 \
106
- if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
106
+ if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
107
107
WRONG_PARAM_COUNT; \
108
108
}
109
109
110
+ /* {{{ php_dba_myke_key */
111
+ static size_t php_dba_make_key (zval * * key , char * * key_str , char * * key_free TSRMLS_DC )
112
+ {
113
+ if (Z_TYPE_PP (key ) == IS_ARRAY ) {
114
+ zval * * group , * * name ;
115
+ HashPosition pos ;
116
+ size_t len ;
117
+
118
+ if (zend_hash_num_elements (Z_ARRVAL_PP (key )) != 2 ) {
119
+ php_error_docref (NULL TSRMLS_CC , E_ERROR , "Key does not have exactly two elements: (key, name)" );
120
+ return -1 ;
121
+ }
122
+ zend_hash_internal_pointer_reset_ex (Z_ARRVAL_PP (key ), & pos );
123
+ zend_hash_get_current_data_ex (Z_ARRVAL_PP (key ), (void * * ) & group , & pos );
124
+ zend_hash_move_forward_ex (Z_ARRVAL_PP (key ), & pos );
125
+ zend_hash_get_current_data_ex (Z_ARRVAL_PP (key ), (void * * ) & name , & pos );
126
+ convert_to_string_ex (group );
127
+ convert_to_string_ex (name );
128
+ if (Z_STRLEN_PP (group ) == 0 ) {
129
+ * key_str = Z_STRVAL_PP (name );
130
+ * key_free = NULL ;
131
+ return Z_STRLEN_PP (name );
132
+ }
133
+ len = spprintf (key_str , 0 , "[%s]%s" , Z_STRVAL_PP (group ), Z_STRVAL_PP (name ));
134
+ * key_free = * key_str ;
135
+ return len ;
136
+ } else {
137
+ convert_to_string_ex (key );
138
+ * key_str = Z_STRVAL_PP (key );
139
+ * key_free = NULL ;
140
+ return Z_STRLEN_PP (key );
141
+ }
142
+ }
143
+ /* }}} */
144
+
110
145
#define DBA_GET2 \
111
146
zval **key; \
147
+ char *key_str, *key_free; \
148
+ size_t key_len; \
112
149
if(ac != 2 || zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
113
150
WRONG_PARAM_COUNT; \
114
151
} \
115
- convert_to_string_ex(key)
152
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
153
+ RETURN_FALSE; \
154
+ }
116
155
117
156
#define DBA_GET2_3 \
118
157
zval **key; \
158
+ char *key_str, *key_free; \
159
+ size_t key_len; \
119
160
zval **tmp; \
120
161
int skip = 0; \
121
162
switch(ac) { \
@@ -134,15 +175,32 @@ ZEND_GET_MODULE(dba)
134
175
default: \
135
176
WRONG_PARAM_COUNT; \
136
177
} \
137
- convert_to_string_ex(key)
178
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
179
+ RETURN_FALSE; \
180
+ }
181
+
182
+ #define DBA_GET3 \
183
+ zval **key, **val; \
184
+ char *key_str, *key_free; \
185
+ size_t key_len; \
186
+ if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) { \
187
+ WRONG_PARAM_COUNT; \
188
+ } \
189
+ convert_to_string_ex(val); \
190
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
191
+ RETURN_FALSE; \
192
+ }
138
193
139
194
#define DBA_ID_GET \
140
195
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db, le_pdb);
141
196
142
197
#define DBA_ID_GET1 DBA_ID_PARS; DBA_GET1; DBA_ID_GET
143
198
#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_ID_GET
144
199
#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_ID_GET
200
+ #define DBA_ID_GET3 DBA_ID_PARS; DBA_GET3; DBA_ID_GET
145
201
202
+ #define DBA_ID_DONE \
203
+ if (key_free) efree(key_free)
146
204
/* a DBA handler must have specific routines */
147
205
148
206
#define DBA_NAMED_HND (alias , name , flags ) \
@@ -233,6 +291,25 @@ ZEND_DECLARE_MODULE_GLOBALS(dba)
233
291
234
292
static int le_db ;
235
293
static int le_pdb ;
294
+
295
+ /* {{{ dba_fetch_resource
296
+ PHPAPI void dba_fetch_resource(dba_info **pinfo, zval **id TSRMLS_DC)
297
+ {
298
+ dba_info *info;
299
+ DBA_ID_FETCH
300
+ *pinfo = info;
301
+ }
302
+ */
303
+ /* }}} */
304
+
305
+ /* {{{ dba_get_handler
306
+ PHPAPI dba_handler *dba_get_handler(const char* handler_name)
307
+ {
308
+ dba_handler *hptr;
309
+ for (hptr = handler; hptr->name && strcasecmp(hptr->name, handler_name); hptr++);
310
+ return hptr;
311
+ }
312
+ */
236
313
/* }}} */
237
314
238
315
/* {{{ dba_close
@@ -350,33 +427,30 @@ PHP_MINFO_FUNCTION(dba)
350
427
*/
351
428
static void php_dba_update (INTERNAL_FUNCTION_PARAMETERS , int mode )
352
429
{
353
- DBA_ID_PARS ;
354
- zval * * val , * * key ;
355
430
char * v ;
356
431
int len ;
357
-
358
- if (ac != 3 || zend_get_parameters_ex (ac , & key , & val , & id ) != SUCCESS ) {
359
- WRONG_PARAM_COUNT ;
360
- }
361
- convert_to_string_ex (key );
362
- convert_to_string_ex (val );
363
- DBA_ID_GET ;
432
+ DBA_ID_GET3 ;
364
433
365
434
DBA_WRITE_CHECK ;
366
435
367
436
if (PG (magic_quotes_runtime )) {
368
437
len = Z_STRLEN_PP (val );
369
438
v = estrndup (Z_STRVAL_PP (val ), len );
370
439
php_stripslashes (v , & len TSRMLS_CC );
371
- if (info -> hnd -> update (info , VALLEN ( key ) , v , len , mode TSRMLS_CC ) == SUCCESS ) {
440
+ if (info -> hnd -> update (info , key_str , key_len , v , len , mode TSRMLS_CC ) == SUCCESS ) {
372
441
efree (v );
442
+ DBA_ID_DONE ;
373
443
RETURN_TRUE ;
374
444
}
375
445
efree (v );
376
446
} else {
377
- if (info -> hnd -> update (info , VALLEN (key ), VALLEN (val ), mode TSRMLS_CC ) == SUCCESS )
447
+ if (info -> hnd -> update (info , key_str , key_len , VALLEN (val ), mode TSRMLS_CC ) == SUCCESS )
448
+ {
449
+ DBA_ID_DONE ;
378
450
RETURN_TRUE ;
451
+ }
379
452
}
453
+ DBA_ID_DONE ;
380
454
RETURN_FALSE ;
381
455
}
382
456
/* }}} */
@@ -719,9 +793,11 @@ PHP_FUNCTION(dba_exists)
719
793
{
720
794
DBA_ID_GET2 ;
721
795
722
- if (info -> hnd -> exists (info , VALLEN (key ) TSRMLS_CC ) == SUCCESS ) {
796
+ if (info -> hnd -> exists (info , key_str , key_len TSRMLS_CC ) == SUCCESS ) {
797
+ DBA_ID_DONE ;
723
798
RETURN_TRUE ;
724
799
}
800
+ DBA_ID_DONE ;
725
801
RETURN_FALSE ;
726
802
}
727
803
/* }}} */
@@ -758,12 +834,14 @@ PHP_FUNCTION(dba_fetch)
758
834
} else {
759
835
skip = 0 ;
760
836
}
761
- if ((val = info -> hnd -> fetch (info , VALLEN ( key ) , skip , & len TSRMLS_CC )) != NULL ) {
837
+ if ((val = info -> hnd -> fetch (info , key_str , key_len , skip , & len TSRMLS_CC )) != NULL ) {
762
838
if (val && PG (magic_quotes_runtime )) {
763
839
val = php_addslashes (val , len , & len , 1 TSRMLS_CC );
764
840
}
841
+ DBA_ID_DONE ;
765
842
RETURN_STRINGL (val , len , 0 );
766
843
}
844
+ DBA_ID_DONE ;
767
845
RETURN_FALSE ;
768
846
}
769
847
/* }}} */
@@ -807,8 +885,12 @@ PHP_FUNCTION(dba_delete)
807
885
808
886
DBA_WRITE_CHECK ;
809
887
810
- if (info -> hnd -> delete (info , VALLEN (key ) TSRMLS_CC ) == SUCCESS )
888
+ if (info -> hnd -> delete (info , key_str , key_len TSRMLS_CC ) == SUCCESS )
889
+ {
890
+ DBA_ID_DONE ;
811
891
RETURN_TRUE ;
892
+ }
893
+ DBA_ID_DONE ;
812
894
RETURN_FALSE ;
813
895
}
814
896
/* }}} */
0 commit comments