1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Authors: Georg Richter <georg@php.net> |
16 : | Andrey Hristov <andrey@php.net> |
17 : | Ulf Wendel <uw@php.net> |
18 : +----------------------------------------------------------------------+
19 :
20 : $Id: mysqli_nonapi.c 290573 2009-11-12 08:20:57Z rasmus $
21 : */
22 :
23 : #ifdef HAVE_CONFIG_H
24 : #include "config.h"
25 : #endif
26 :
27 : #include <signal.h>
28 :
29 : #include "php.h"
30 : #include "php_ini.h"
31 : #include "ext/standard/info.h"
32 : #include "php_mysqli_structs.h"
33 :
34 : #define SAFE_STR(a) ((a)?a:"")
35 :
36 : /* {{{ php_mysqli_set_error
37 : */
38 : static void php_mysqli_set_error(long mysql_errno, char *mysql_err TSRMLS_DC)
39 1021 : {
40 1021 : MyG(error_no) = mysql_errno;
41 1021 : if (MyG(error_msg)) {
42 16 : efree(MyG(error_msg));
43 : }
44 1044 : if(mysql_err && *mysql_err) {
45 23 : MyG(error_msg) = estrdup(mysql_err);
46 : } else {
47 998 : MyG(error_msg) = NULL;
48 : }
49 1021 : }
50 : /* }}} */
51 :
52 :
53 : void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor)
54 1096 : {
55 1096 : MY_MYSQL *mysql = NULL;
56 1096 : MYSQLI_RESOURCE *mysqli_resource = NULL;
57 1096 : zval *object = getThis();
58 1096 : char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
59 1096 : unsigned int hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
60 1096 : zend_bool persistent = FALSE;
61 1096 : long port = 0, flags = 0;
62 : uint hash_len;
63 1096 : char *hash_key = NULL;
64 1096 : zend_bool new_connection = FALSE;
65 : zend_rsrc_list_entry *le;
66 1096 : mysqli_plist_entry *plist = NULL;
67 :
68 :
69 : #if !defined(MYSQL_USE_MYSQLND)
70 : if ((MYSQL_VERSION_ID / 100) != (mysql_get_client_version() / 100)) {
71 : php_error_docref(NULL TSRMLS_CC, E_WARNING,
72 : "Headers and client library minor version mismatch. Headers:%d Library:%ld",
73 : MYSQL_VERSION_ID, mysql_get_client_version());
74 : }
75 : #endif
76 :
77 1096 : if (getThis() && !ZEND_NUM_ARGS() && in_ctor) {
78 14 : RETURN_NULL();
79 : }
80 1082 : hostname = username = dbname = passwd = socket = NULL;
81 :
82 1082 : if (!is_real_connect) {
83 64 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&s&s&s&ls&", &hostname, &hostname_len, UG(utf8_conv),
84 : &username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv),
85 : &dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv)) == FAILURE) {
86 1 : return;
87 : }
88 :
89 63 : if (object && instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
90 38 : mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr;
91 38 : if (mysqli_resource && mysqli_resource->ptr) {
92 6 : mysql = (MY_MYSQL*) mysqli_resource->ptr;
93 : }
94 : }
95 63 : if (!mysql) {
96 57 : mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL));
97 : }
98 63 : flags |= CLIENT_MULTI_RESULTS; /* needed for mysql_multi_query() */
99 : } else {
100 : /* We have flags too */
101 1018 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|s&s&s&s&ls&l", &object, mysqli_link_class_entry,
102 : &hostname, &hostname_len, UG(utf8_conv), &username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv),
103 : &dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv), &flags) == FAILURE) {
104 8 : return;
105 : }
106 :
107 1010 : mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr;
108 1010 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &object, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
109 :
110 : /* set some required options */
111 1009 : flags |= CLIENT_MULTI_RESULTS; /* needed for mysql_multi_query() */
112 : /* remove some insecure options */
113 1009 : flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */
114 1009 : if (PG(open_basedir) && PG(open_basedir)[0] != '\0') {
115 3 : flags &= ~CLIENT_LOCAL_FILES;
116 : }
117 : }
118 1072 : if (mysql->mysql && mysqli_resource && mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) {
119 : /* already connected, we should close the connection */
120 13 : php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT TSRMLS_CC);
121 : }
122 :
123 1072 : if (!socket_len || !socket) {
124 1072 : socket = MyG(default_socket);
125 : }
126 1072 : if (!port){
127 38 : port = MyG(default_port);
128 : }
129 1072 : if (!passwd) {
130 26 : passwd = MyG(default_pw);
131 26 : passwd_len = strlen(SAFE_STR(passwd));
132 : }
133 1072 : if (!username){
134 19 : username = MyG(default_user);
135 : }
136 1072 : if (!hostname || !hostname_len) {
137 17 : hostname = MyG(default_host);
138 : }
139 :
140 1072 : if (strlen(SAFE_STR(hostname)) > 2 && !strncasecmp(hostname, "p:", 2)) {
141 82 : hostname += 2;
142 82 : if (!MyG(allow_persistent)) {
143 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Persistent connections are disabled. Downgrading to normal");
144 : } else {
145 82 : mysql->persistent = persistent = TRUE;
146 :
147 82 : hash_len = spprintf(&hash_key, 0, "mysqli_%s_%s%ld%s%s%s", SAFE_STR(hostname), SAFE_STR(socket),
148 : port, SAFE_STR(username), SAFE_STR(dbname),
149 : SAFE_STR(passwd));
150 :
151 82 : mysql->hash_key = hash_key;
152 :
153 : /* check if we can reuse exisiting connection ... */
154 82 : if (zend_hash_find(&EG(persistent_list), hash_key, hash_len + 1, (void **)&le) == SUCCESS) {
155 71 : if (Z_TYPE_P(le) == php_le_pmysqli()) {
156 71 : plist = (mysqli_plist_entry *) le->ptr;
157 :
158 : do {
159 71 : if (zend_ptr_stack_num_elements(&plist->free_links)) {
160 47 : mysql->mysql = zend_ptr_stack_pop(&plist->free_links);
161 :
162 47 : MyG(num_inactive_persistent)--;
163 : #if defined(MYSQLI_USE_MYSQLND)
164 47 : mysqlnd_end_psession(mysql->mysql);
165 : #endif
166 : /* reset variables */
167 :
168 : #ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT
169 47 : if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname)) {
170 : #else
171 : if (!mysql_ping(mysql->mysql)) {
172 : #endif
173 : #ifdef MYSQLI_USE_MYSQLND
174 46 : mysqlnd_restart_psession(mysql->mysql, MyG(mysqlnd_thd_zval_cache));
175 : #endif
176 46 : MyG(num_active_persistent)++;
177 46 : goto end;
178 : } else {
179 : #if defined(MYSQLI_USE_MYSQLND)
180 1 : mysqlnd_end_psession(mysql->mysql);
181 : #endif
182 1 : mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
183 1 : mysql->mysql = NULL;
184 : }
185 : }
186 : } while (0);
187 : }
188 : } else {
189 : zend_rsrc_list_entry le;
190 11 : le.type = php_le_pmysqli();
191 11 : le.ptr = plist = calloc(1, sizeof(mysqli_plist_entry));
192 :
193 11 : zend_ptr_stack_init_ex(&plist->free_links, 1);
194 11 : zend_hash_update(&EG(persistent_list), hash_key, hash_len + 1, (void *)&le, sizeof(le), NULL);
195 : }
196 : }
197 : }
198 :
199 1026 : if (MyG(max_links) != -1 && MyG(num_links) >= MyG(max_links)) {
200 5 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MyG(num_links));
201 5 : goto err;
202 : }
203 1021 : if (persistent && MyG(max_persistent) != -1 &&
204 : (MyG(num_active_persistent) + MyG(num_inactive_persistent))>= MyG(max_persistent))
205 : {
206 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)",
207 : MyG(num_active_persistent) + MyG(num_inactive_persistent));
208 0 : goto err;
209 : }
210 1021 : if (!mysql->mysql) {
211 : #if !defined(MYSQLI_USE_MYSQLND)
212 : if (!(mysql->mysql = mysql_init(NULL))) {
213 : #else
214 63 : if (!(mysql->mysql = mysqlnd_init(persistent))) {
215 : #endif
216 0 : goto err;
217 : }
218 63 : new_connection = TRUE;
219 : }
220 :
221 1021 : mysql_options(mysql->mysql, MYSQL_SET_CHARSET_NAME, "utf8");
222 :
223 : #ifdef HAVE_EMBEDDED_MYSQLI
224 : if (hostname_len) {
225 : unsigned int external=1;
226 : mysql_options(mysql->mysql, MYSQL_OPT_USE_REMOTE_CONNECTION, (char *)&external);
227 : } else {
228 : mysql_options(mysql->mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, 0);
229 : }
230 : #endif
231 :
232 : #if !defined(MYSQLI_USE_MYSQLND)
233 : if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, CLIENT_MULTI_RESULTS) == NULL)
234 : #else
235 1021 : if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
236 : port, socket, flags, MyG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
237 : #endif
238 : {
239 : /* Save error messages - for mysqli_connect_error() & mysqli_connect_errno() */
240 23 : php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
241 23 : php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
242 : "%s", mysql_error(mysql->mysql));
243 23 : if (!is_real_connect) {
244 : /* free mysql structure */
245 11 : mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED);
246 : }
247 23 : goto err;
248 : }
249 :
250 : /* when PHP runs in unicode, set default character set to utf8 */
251 998 : mysql->conv = UG(utf8_conv);
252 :
253 : /* clear error */
254 998 : php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
255 :
256 : #if !defined(MYSQLI_USE_MYSQLND)
257 : mysql->mysql->reconnect = MyG(reconnect);
258 :
259 : /* set our own local_infile handler */
260 : php_set_local_infile_handler_default(mysql);
261 : #endif
262 :
263 998 : mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&MyG(allow_local_infile));
264 :
265 1044 : end:
266 1044 : if (!mysqli_resource) {
267 46 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
268 46 : mysqli_resource->ptr = (void *)mysql;
269 : }
270 1044 : mysqli_resource->status = MYSQLI_STATUS_VALID;
271 :
272 : /* store persistent connection */
273 1044 : if (persistent && (new_connection || is_real_connect)) {
274 77 : MyG(num_active_persistent)++;
275 : }
276 :
277 1044 : MyG(num_links)++;
278 :
279 1044 : mysql->multi_query = 0;
280 :
281 1060 : if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
282 16 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
283 : } else {
284 1028 : ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
285 : }
286 1044 : if (!is_real_connect) {
287 52 : return;
288 : } else {
289 992 : RETURN_TRUE;
290 : }
291 :
292 28 : err:
293 28 : if (mysql->hash_key) {
294 1 : efree(mysql->hash_key);
295 1 : mysql->hash_key = NULL;
296 1 : mysql->persistent = FALSE;
297 : }
298 28 : if (!is_real_connect) {
299 11 : efree(mysql);
300 : }
301 28 : RETVAL_FALSE;
302 : }
303 :
304 :
305 : /* {{{ proto object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])
306 : Open a connection to a mysql server */
307 : PHP_FUNCTION(mysqli_connect)
308 39 : {
309 39 : mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, FALSE);
310 39 : }
311 : /* }}} */
312 :
313 :
314 : /* {{{ proto object mysqli_link_construct()
315 : */
316 : PHP_FUNCTION(mysqli_link_construct)
317 39 : {
318 39 : mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, TRUE);
319 39 : }
320 : /* }}} */
321 :
322 :
323 : /* {{{ proto int mysqli_connect_errno(void) U
324 : Returns the numerical value of the error message from last connect command */
325 : PHP_FUNCTION(mysqli_connect_errno)
326 15 : {
327 15 : RETURN_LONG(MyG(error_no));
328 : }
329 : /* }}} */
330 :
331 : /* {{{ proto string mysqli_connect_error(void) U
332 : Returns the text of the error message from previous MySQL operation */
333 : PHP_FUNCTION(mysqli_connect_error)
334 6 : {
335 6 : if (MyG(error_msg)) {
336 1 : RETURN_UTF8_STRING((char *)MyG(error_msg), ZSTR_DUPLICATE);
337 : } else {
338 5 : RETURN_NULL();
339 : }
340 : }
341 : /* }}} */
342 :
343 :
344 : /* {{{ proto mixed mysqli_fetch_array (object result [,int resulttype]) U
345 : Fetch a result row as an associative array, a numeric array, or both */
346 : PHP_FUNCTION(mysqli_fetch_array)
347 11271 : {
348 : #if !defined(MYSQLI_USE_MYSQLND)
349 : php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
350 : #else
351 : MYSQL_RES *result;
352 : zval *mysql_result;
353 11271 : long mode = MYSQLND_FETCH_BOTH;
354 :
355 11271 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
356 2 : return;
357 : }
358 11269 : MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
359 :
360 11263 : if (mode < MYSQLI_ASSOC || mode > MYSQLI_BOTH) {
361 4 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH");
362 4 : RETURN_FALSE;
363 : }
364 :
365 11259 : mysqlnd_fetch_into(result, mode, return_value, MYSQLND_MYSQLI);
366 : #endif
367 : }
368 : /* }}} */
369 :
370 : /* {{{ proto mixed mysqli_fetch_assoc (object result) U
371 : Fetch a result row as an associative array */
372 : PHP_FUNCTION(mysqli_fetch_assoc)
373 5591 : {
374 : #if !defined(MYSQLI_USE_MYSQLND)
375 : php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 0);
376 : #else
377 : MYSQL_RES *result;
378 : zval *mysql_result;
379 :
380 5591 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
381 3 : return;
382 : }
383 5588 : MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
384 5585 : mysqlnd_fetch_into(result, MYSQLND_FETCH_ASSOC, return_value, MYSQLND_MYSQLI);
385 :
386 : #endif
387 : }
388 : /* }}} */
389 :
390 :
391 : /* {{{ proto mixed mysqli_fetch_all (object result [,int resulttype]) U
392 : Fetches all result rows as an associative array, a numeric array, or both */
393 : #if defined(MYSQLI_USE_MYSQLND)
394 : PHP_FUNCTION(mysqli_fetch_all)
395 209 : {
396 : MYSQL_RES *result;
397 : zval *mysql_result;
398 209 : long mode = MYSQLND_FETCH_NUM;
399 :
400 209 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
401 2 : return;
402 : }
403 207 : MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
404 :
405 207 : if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) {
406 2 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode can be only MYSQLI_FETCH_NUM, "
407 : "MYSQLI_FETCH_ASSOC or MYSQLI_FETCH_BOTH");
408 2 : RETURN_FALSE;
409 : }
410 :
411 205 : mysqlnd_fetch_all(result, mode, return_value);
412 : }
413 : /* }}} */
414 :
415 :
416 : /* {{{ proto array mysqli_cache_stats(void) U
417 : Returns statistics about the zval cache */
418 : PHP_FUNCTION(mysqli_get_cache_stats)
419 14 : {
420 14 : if (zend_parse_parameters_none() == FAILURE) {
421 1 : return;
422 : }
423 13 : mysqlnd_palloc_stats(mysqli_mysqlnd_zval_cache, return_value);
424 : }
425 : /* }}} */
426 :
427 :
428 : /* {{{ proto array mysqli_get_client_stats(void)
429 : Returns statistics about the zval cache */
430 : PHP_FUNCTION(mysqli_get_client_stats)
431 53 : {
432 53 : if (zend_parse_parameters_none() == FAILURE) {
433 1 : return;
434 : }
435 52 : mysqlnd_get_client_stats(return_value);
436 : }
437 : /* }}} */
438 :
439 :
440 : /* {{{ proto array mysqli_get_connection_stats(void)
441 : Returns statistics about the zval cache */
442 : PHP_FUNCTION(mysqli_get_connection_stats)
443 7 : {
444 : MY_MYSQL *mysql;
445 : zval *mysql_link;
446 :
447 7 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
448 : &mysql_link, mysqli_link_class_entry) == FAILURE) {
449 2 : return;
450 : }
451 5 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
452 :
453 5 : mysqlnd_get_connection_stats(mysql->mysql, return_value);
454 : }
455 : #endif
456 : /* }}} */
457 :
458 :
459 : /* {{{ proto mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]]) U
460 : Fetch a result row as an object */
461 : PHP_FUNCTION(mysqli_fetch_object)
462 32 : {
463 32 : php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1);
464 : /* todo: mysqlnd support */
465 30 : }
466 : /* }}} */
467 :
468 : /* {{{ proto bool mysqli_multi_query(object link, string query) U
469 : allows to execute multiple queries */
470 : PHP_FUNCTION(mysqli_multi_query)
471 26 : {
472 : MY_MYSQL *mysql;
473 : zval *mysql_link;
474 26 : char *query = NULL;
475 : unsigned int query_len;
476 :
477 26 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry,
478 : &query, &query_len, UG(utf8_conv)) == FAILURE) {
479 2 : return;
480 : }
481 24 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
482 :
483 23 : MYSQLI_ENABLE_MQ;
484 23 : if (mysql_real_query(mysql->mysql, query, query_len)) {
485 : #ifndef MYSQLI_USE_MYSQLND
486 : char s_error[MYSQL_ERRMSG_SIZE], s_sqlstate[SQLSTATE_LENGTH+1];
487 : unsigned int s_errno;
488 : /* we have to save error information, cause
489 : MYSQLI_DISABLE_MQ will reset error information */
490 : strcpy(s_error, mysql_error(mysql->mysql));
491 : strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql));
492 : s_errno = mysql_errno(mysql->mysql);
493 : #else
494 6 : mysqlnd_error_info error_info = mysql->mysql->error_info;
495 : #endif
496 6 : MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
497 6 : MYSQLI_DISABLE_MQ;
498 :
499 : #ifndef MYSQLI_USE_MYSQLND
500 : /* restore error information */
501 : strcpy(mysql->mysql->net.last_error, s_error);
502 : strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
503 : mysql->mysql->net.last_errno = s_errno;
504 : #else
505 6 : mysql->mysql->error_info = error_info;
506 : #endif
507 6 : RETURN_FALSE;
508 : }
509 17 : RETURN_TRUE;
510 : }
511 : /* }}} */
512 :
513 : /* {{{ proto mixed mysqli_query(object link, string query [,int resultmode]) U */
514 : PHP_FUNCTION(mysqli_query)
515 11166 : {
516 : MY_MYSQL *mysql;
517 : zval *mysql_link;
518 : MYSQLI_RESOURCE *mysqli_resource;
519 : MYSQL_RES *result;
520 11166 : char *query = NULL;
521 : unsigned int query_len;
522 11166 : unsigned long resultmode = MYSQLI_STORE_RESULT;
523 :
524 11166 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&|l", &mysql_link, mysqli_link_class_entry,
525 : &query, &query_len, UG(utf8_conv), &resultmode) == FAILURE) {
526 11 : return;
527 : }
528 :
529 11155 : if (!query_len) {
530 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty query");
531 1 : RETURN_FALSE;
532 : }
533 11154 : if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT
534 : #if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED)
535 : && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_BG_STORE_RESULT
536 : #endif
537 : ) {
538 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode");
539 1 : RETURN_FALSE;
540 : }
541 :
542 11153 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
543 :
544 11146 : MYSQLI_DISABLE_MQ;
545 :
546 :
547 : #ifdef MYSQLI_USE_MYSQLND
548 11146 : if (resultmode & MYSQLI_ASYNC) {
549 27 : if (mysqli_async_query(mysql->mysql, query, query_len)) {
550 2 : MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
551 2 : RETURN_FALSE;
552 : }
553 25 : mysql->async_result_fetch_type = resultmode & ~MYSQLI_ASYNC;
554 25 : RETURN_TRUE;
555 : }
556 : #endif
557 :
558 11119 : if (mysql_real_query(mysql->mysql, query, query_len)) {
559 50 : MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
560 50 : RETURN_FALSE;
561 : }
562 :
563 11069 : if (!mysql_field_count(mysql->mysql)) {
564 : /* no result set - not a SELECT */
565 7963 : if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
566 0 : php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
567 : }
568 7963 : RETURN_TRUE;
569 : }
570 :
571 3106 : switch (resultmode) {
572 : case MYSQLI_STORE_RESULT:
573 3095 : result = mysql_store_result(mysql->mysql);
574 3095 : break;
575 : case MYSQLI_USE_RESULT:
576 11 : result = mysql_use_result(mysql->mysql);
577 : break;
578 : #if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED)
579 : case MYSQLI_BG_STORE_RESULT:
580 : result = mysqli_bg_store_result(mysql->mysql);
581 : break;
582 : #endif
583 : }
584 3106 : if (!result) {
585 0 : php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
586 : "%s", mysql_error(mysql->mysql));
587 0 : RETURN_FALSE;
588 : }
589 :
590 3106 : if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
591 1 : php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
592 : }
593 :
594 3106 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
595 3106 : mysqli_resource->ptr = (void *)result;
596 3106 : mysqli_resource->status = MYSQLI_STATUS_VALID;
597 3106 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
598 : }
599 : /* }}} */
600 :
601 :
602 : #if defined(MYSQLI_USE_MYSQLND)
603 : #include "php_network.h"
604 : /* {{{ mysqlnd_zval_array_to_mysqlnd_array functions */
605 : static int mysqlnd_zval_array_to_mysqlnd_array(zval *in_array, MYSQLND ***out_array TSRMLS_DC)
606 58 : {
607 : zval **elem;
608 58 : int i = 0, current = 0;
609 :
610 58 : if (Z_TYPE_P(in_array) != IS_ARRAY) {
611 0 : return 0;
612 : }
613 58 : *out_array = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(in_array)) + 1, sizeof(MYSQLND *));
614 58 : for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(in_array));
615 233 : zend_hash_get_current_data(Z_ARRVAL_P(in_array), (void **) &elem) == SUCCESS;
616 117 : zend_hash_move_forward(Z_ARRVAL_P(in_array))) {
617 117 : i++;
618 117 : if (Z_TYPE_PP(elem) != IS_OBJECT ||
619 : !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
620 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d not a mysqli object", i);
621 : } else {
622 : MY_MYSQL *mysql;
623 : MYSQLI_RESOURCE *my_res;
624 117 : mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
625 117 : if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
626 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %v", i, intern->zo.ce->name);
627 0 : continue;
628 : }
629 117 : mysql = (MY_MYSQL*) my_res->ptr;
630 117 : if (MYSQLI_STATUS_VALID && my_res->status < MYSQLI_STATUS_VALID) {
631 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object %d or resource %v", i, intern->zo.ce->name);
632 0 : continue;
633 : }
634 117 : (*out_array)[current++] = mysql->mysql;
635 : }
636 : }
637 58 : return 0;
638 : }
639 : /* }}} */
640 :
641 :
642 : /* {{{ mysqlnd_zval_array_from_mysqlnd_array */
643 : static int mysqlnd_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *out_array TSRMLS_DC)
644 58 : {
645 58 : MYSQLND **p = in_array;
646 : HashTable *new_hash;
647 : zval **elem, **dest_elem;
648 58 : int ret = 0;
649 :
650 58 : ALLOC_HASHTABLE(new_hash);
651 58 : zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(out_array)), NULL, ZVAL_PTR_DTOR, 0);
652 :
653 58 : for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(out_array));
654 233 : zend_hash_get_current_data(Z_ARRVAL_P(out_array), (void **) &elem) == SUCCESS;
655 117 : zend_hash_move_forward(Z_ARRVAL_P(out_array)))
656 : {
657 117 : if (Z_TYPE_PP(elem) != IS_OBJECT || !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
658 : continue;
659 : }
660 : {
661 : MY_MYSQL *mysql;
662 117 : mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
663 117 : mysql = (MY_MYSQL *) ((MYSQLI_RESOURCE *)intern->ptr)->ptr;
664 117 : if (mysql->mysql == *p) {
665 26 : zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem);
666 26 : if (dest_elem) {
667 26 : zval_add_ref(dest_elem);
668 : }
669 26 : ret++;
670 26 : p++;
671 : }
672 : }
673 : }
674 :
675 : /* destroy old array and add new one */
676 58 : zend_hash_destroy(Z_ARRVAL_P(out_array));
677 58 : efree(Z_ARRVAL_P(out_array));
678 :
679 58 : zend_hash_internal_pointer_reset(new_hash);
680 58 : Z_ARRVAL_P(out_array) = new_hash;
681 :
682 58 : return 0;
683 : }
684 : /* }}} */
685 :
686 :
687 : /* {{{ mysqlnd_dont_poll_zval_array_from_mysqlnd_array */
688 : static int mysqlnd_dont_poll_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *in_zval_array, zval *out_array TSRMLS_DC)
689 29 : {
690 29 : MYSQLND **p = in_array;
691 : HashTable *new_hash;
692 : zval **elem, **dest_elem;
693 29 : int ret = 0;
694 :
695 29 : ALLOC_HASHTABLE(new_hash);
696 29 : zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(in_zval_array)), NULL, ZVAL_PTR_DTOR, 0);
697 29 : if (in_array) {
698 17 : for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(in_zval_array));
699 62 : zend_hash_get_current_data(Z_ARRVAL_P(in_zval_array), (void **) &elem) == SUCCESS;
700 28 : zend_hash_move_forward(Z_ARRVAL_P(in_zval_array)))
701 : {
702 : MY_MYSQL *mysql;
703 28 : mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
704 28 : mysql = (MY_MYSQL *) ((MYSQLI_RESOURCE *)intern->ptr)->ptr;
705 28 : if (mysql->mysql == *p) {
706 19 : zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem);
707 19 : if (dest_elem) {
708 19 : zval_add_ref(dest_elem);
709 : }
710 19 : ret++;
711 19 : p++;
712 : }
713 : }
714 : }
715 :
716 : /* destroy old array and add new one */
717 29 : zend_hash_destroy(Z_ARRVAL_P(out_array));
718 29 : efree(Z_ARRVAL_P(out_array));
719 :
720 29 : zend_hash_internal_pointer_reset(new_hash);
721 29 : Z_ARRVAL_P(out_array) = new_hash;
722 :
723 29 : return 0;
724 : }
725 : /* }}} */
726 :
727 :
728 : /* {{{ proto int mysqli_poll(array read, array write, array error, long sec [, long usec]) U
729 : Poll connections */
730 : PHP_FUNCTION(mysqli_poll)
731 35 : {
732 : zval *r_array, *e_array, *dont_poll_array;
733 35 : MYSQLND **new_r_array = NULL, **new_e_array = NULL, **new_dont_poll_array = NULL;
734 35 : long sec = 0, usec = 0;
735 : enum_func_status ret;
736 : uint desc_num;
737 :
738 35 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!a!al|l", &r_array, &e_array, &dont_poll_array, &sec, &usec) == FAILURE) {
739 6 : return;
740 : }
741 29 : if (sec < 0 || usec < 0) {
742 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Negative values passed for sec and/or usec");
743 0 : RETURN_FALSE;
744 : }
745 :
746 29 : if (r_array != NULL) {
747 29 : mysqlnd_zval_array_to_mysqlnd_array(r_array, &new_r_array TSRMLS_CC);
748 : }
749 29 : if (e_array != NULL) {
750 29 : mysqlnd_zval_array_to_mysqlnd_array(e_array, &new_e_array TSRMLS_CC);
751 : }
752 :
753 29 : ret = mysqlnd_poll(new_r_array, new_e_array, &new_dont_poll_array, sec, usec, &desc_num);
754 :
755 29 : mysqlnd_dont_poll_zval_array_from_mysqlnd_array(r_array != NULL ? new_dont_poll_array:NULL, r_array, dont_poll_array TSRMLS_CC);
756 :
757 29 : if (r_array != NULL) {
758 29 : mysqlnd_zval_array_from_mysqlnd_array(new_r_array, r_array TSRMLS_CC);
759 : }
760 29 : if (e_array != NULL) {
761 29 : mysqlnd_zval_array_from_mysqlnd_array(new_e_array, e_array TSRMLS_CC);
762 : }
763 :
764 29 : if (new_dont_poll_array) {
765 17 : efree(new_dont_poll_array);
766 : }
767 29 : if (new_r_array) {
768 29 : efree(new_r_array);
769 : }
770 29 : if (new_e_array) {
771 29 : efree(new_e_array);
772 : }
773 29 : if (ret == PASS) {
774 28 : RETURN_LONG(desc_num);
775 : } else {
776 1 : RETURN_FALSE;
777 : }
778 : }
779 : /* }}} */
780 :
781 :
782 : /* {{{ proto int mysqli_reap_async_query(object link) U
783 : Poll connections */
784 : PHP_FUNCTION(mysqli_reap_async_query)
785 25 : {
786 : MY_MYSQL *mysql;
787 : zval *mysql_link;
788 : MYSQLI_RESOURCE *mysqli_resource;
789 : MYSQL_RES *result;
790 :
791 25 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
792 0 : return;
793 : }
794 :
795 25 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
796 :
797 25 : if (FAIL == mysqlnd_reap_async_query(mysql->mysql)) {
798 5 : RETURN_FALSE;
799 : }
800 :
801 20 : if (!mysql_field_count(mysql->mysql)) {
802 : /* no result set - not a SELECT */
803 7 : if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
804 : /* php_mysqli_report_index("n/a", mysqli_server_status(mysql->mysql) TSRMLS_CC); */
805 : }
806 7 : RETURN_TRUE;
807 : }
808 :
809 13 : switch (mysql->async_result_fetch_type) {
810 : case MYSQLI_STORE_RESULT:
811 0 : result = mysql_store_result(mysql->mysql);
812 0 : break;
813 : case MYSQLI_USE_RESULT:
814 13 : result = mysql_use_result(mysql->mysql);
815 : break;
816 : #if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED)
817 : case MYSQLI_BG_STORE_RESULT:
818 : result = mysqli_bg_store_result(mysql->mysql);
819 : break;
820 : #endif
821 : }
822 :
823 13 : if (!result) {
824 0 : php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
825 : "%s", mysql_error(mysql->mysql));
826 0 : RETURN_FALSE;
827 : }
828 :
829 13 : if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
830 : /* php_mysqli_report_index("n/a", mysqli_server_status(mysql->mysql) TSRMLS_CC);*/
831 : }
832 :
833 13 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
834 13 : mysqli_resource->ptr = (void *)result;
835 13 : mysqli_resource->status = MYSQLI_STATUS_VALID;
836 13 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
837 : }
838 : /* }}} */
839 :
840 :
841 : /* {{{ proto object mysqli_stmt_get_result(object link) U
842 : Buffer result set on client */
843 : PHP_FUNCTION(mysqli_stmt_get_result)
844 591 : {
845 : MYSQL_RES *result;
846 : MYSQLI_RESOURCE *mysqli_resource;
847 : MY_STMT *stmt;
848 : zval *mysql_stmt;
849 :
850 591 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
851 5 : return;
852 : }
853 586 : MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
854 :
855 584 : if (!(result = mysqlnd_stmt_get_result(stmt->stmt))) {
856 6 : MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
857 6 : RETURN_FALSE;
858 : }
859 :
860 578 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
861 578 : mysqli_resource->ptr = (void *)result;
862 578 : mysqli_resource->status = MYSQLI_STATUS_VALID;
863 578 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
864 : }
865 : /* }}} */
866 : #endif
867 :
868 :
869 : /* {{{ proto object mysqli_get_warnings(object link) U */
870 : PHP_FUNCTION(mysqli_get_warnings)
871 3 : {
872 : MY_MYSQL *mysql;
873 : zval *mysql_link;
874 : MYSQLI_RESOURCE *mysqli_resource;
875 : MYSQLI_WARNING *w;
876 :
877 3 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
878 0 : return;
879 : }
880 3 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
881 :
882 3 : if (mysql_warning_count(mysql->mysql)) {
883 3 : w = php_get_warnings(mysql->mysql TSRMLS_CC);
884 : } else {
885 0 : RETURN_FALSE;
886 : }
887 3 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
888 3 : mysqli_resource->ptr = mysqli_resource->info = (void *)w;
889 3 : mysqli_resource->status = MYSQLI_STATUS_VALID;
890 3 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
891 : }
892 : /* }}} */
893 :
894 : /* {{{ proto object mysqli_stmt_get_warnings(object link) U */
895 : PHP_FUNCTION(mysqli_stmt_get_warnings)
896 7 : {
897 : MY_STMT *stmt;
898 : zval *stmt_link;
899 : MYSQLI_RESOURCE *mysqli_resource;
900 : MYSQLI_WARNING *w;
901 :
902 7 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &stmt_link, mysqli_stmt_class_entry) == FAILURE) {
903 2 : return;
904 : }
905 5 : MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt", MYSQLI_STATUS_VALID);
906 :
907 3 : if (mysqli_stmt_warning_count(stmt->stmt)) {
908 1 : w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC);
909 : } else {
910 2 : RETURN_FALSE;
911 : }
912 1 : mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
913 1 : mysqli_resource->ptr = mysqli_resource->info = (void *)w;
914 1 : mysqli_resource->status = MYSQLI_STATUS_VALID;
915 1 : MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
916 : }
917 : /* }}} */
918 :
919 : #ifdef HAVE_MYSQLI_SET_CHARSET
920 : /* {{{ proto bool mysqli_set_charset(object link, string csname) U
921 : sets client character set */
922 : PHP_FUNCTION(mysqli_set_charset)
923 3 : {
924 : MY_MYSQL *mysql;
925 : zval *mysql_link;
926 : char *cs_name;
927 : int csname_len;
928 :
929 3 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry,
930 : &cs_name, &csname_len, UG(utf8_conv)) == FAILURE) {
931 1 : return;
932 : }
933 2 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
934 :
935 : /* check unicode modus */
936 : /* todo: we need also to support UCS2. This will not work when using SET NAMES */
937 1 : if (csname_len != 4 || strncasecmp(cs_name, "utf8", 4)) {
938 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Character set %s is not supported when running PHP with unicode.semantics=On.", cs_name);
939 0 : RETURN_FALSE;
940 : }
941 :
942 1 : if (mysql_set_character_set(mysql->mysql, cs_name)) {
943 0 : RETURN_FALSE;
944 : }
945 1 : RETURN_TRUE;
946 : }
947 : /* }}} */
948 : #endif
949 :
950 : #ifdef HAVE_MYSQLI_GET_CHARSET
951 : /* {{{ proto object mysqli_get_charset(object link) U
952 : returns a character set object */
953 : PHP_FUNCTION(mysqli_get_charset)
954 5 : {
955 : MY_MYSQL *mysql;
956 : zval *mysql_link;
957 5 : const char *name = NULL, *collation = NULL, *dir = NULL, *comment = NULL;
958 : uint minlength, maxlength, number, state;
959 : #if !defined(MYSQLI_USE_MYSQLND)
960 : MY_CHARSET_INFO cs;
961 : #else
962 : const MYSQLND_CHARSET *cs;
963 : #endif
964 :
965 5 : if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
966 2 : return;
967 : }
968 3 : MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
969 :
970 2 : object_init(return_value);
971 :
972 : #if !defined(MYSQLI_USE_MYSQLND)
973 : mysql_get_character_set_info(mysql->mysql, &cs);
974 : name = (char *)cs.csname;
975 : collation = (char *)cs.name;
976 : dir = (char *)cs.dir;
977 : minlength = cs.mbminlen;
978 : maxlength = cs.mbmaxlen;
979 : number = cs.number;
980 : state = cs.state;
981 : comment = cs.comment;
982 : #else
983 2 : cs = mysql->mysql->charset;
984 2 : name = cs->name;
985 2 : collation = cs->collation;
986 2 : minlength = cs->char_minlen;
987 2 : maxlength = cs->char_maxlen;
988 2 : number = cs->nr;
989 2 : comment = cs->comment;
990 2 : state = 1; /* all charsets are compiled in */
991 : #endif
992 :
993 2 : add_property_utf8_string(return_value, "charset", (name) ? (char *)name : "", 1);
994 2 : add_property_utf8_string(return_value, "collation", (collation) ? (char *)collation : "", 1);
995 2 : add_property_utf8_string(return_value, "dir", (dir) ? (char *)dir : "", 1);
996 2 : add_property_long(return_value, "min_length", minlength);
997 2 : add_property_long(return_value, "max_length", maxlength);
998 2 : add_property_long(return_value, "number", number);
999 2 : add_property_long(return_value, "state", state);
1000 2 : add_property_utf8_string(return_value, "comment", (comment) ? (char *)comment : "", 1);
1001 : }
1002 : /* }}} */
1003 : #endif
1004 :
1005 : /*
1006 : * Local variables:
1007 : * tab-width: 4
1008 : * c-basic-offset: 4
1009 : * End:
1010 : * vim600: noet sw=4 ts=4 fdm=marker
1011 : * vim<600: noet sw=4 ts=4
1012 : */
|