diff options
Diffstat (limited to 'ext/sqlite/sqlite.c')
| -rw-r--r-- | ext/sqlite/sqlite.c | 79 | 
1 files changed, 53 insertions, 26 deletions
diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c index 7d5d1b382c..657b0badc2 100644 --- a/ext/sqlite/sqlite.c +++ b/ext/sqlite/sqlite.c @@ -120,6 +120,7 @@ function_entry sqlite_functions[] = {  	PHP_FE(sqlite_query, NULL)  	PHP_FE(sqlite_fetch_array, NULL)  	PHP_FE(sqlite_fetch_string, NULL) +	PHP_FE(sqlite_fetch_all, NULL)  	PHP_FE(sqlite_current, NULL)  	PHP_FE(sqlite_column, NULL)  	PHP_FE(sqlite_libversion, NULL) @@ -1046,40 +1047,31 @@ static void php_sqlite_fetch_array(struct php_sqlite_result *res, int mode, zend  	array_init(return_value);  	for (j = 0; j < res->ncolumns; j++) { -		char *decoded = NULL; -		int decoded_len; +		zval *decoded; +		MAKE_STD_ZVAL(decoded);  		if (decode_binary && rowdata[j] != NULL && rowdata[j][0] == '\x01') {  			int l = strlen(rowdata[j]); -			decoded = do_alloca(l); -			decoded_len = sqlite_decode_binary(rowdata[j]+1, decoded); +			Z_STRVAL_P(decoded) = emalloc(l); +			Z_STRLEN_P(decoded) = l = sqlite_decode_binary(rowdata[j]+1, Z_STRVAL_P(decoded)); +			Z_STRVAL_P(decoded)[l] = '\0'; +			Z_TYPE_P(decoded) = IS_STRING;  		} else { -			decoded = (char*)rowdata[j]; -			if (decoded) { -				decoded_len = strlen(decoded); +			if ((char*)rowdata[j]) { +				ZVAL_STRING(decoded, (char*)rowdata[j], 1);  			} else { -				decoded_len = 0; +				ZVAL_NULL(decoded);  			}  		} -		 +  		if (mode & PHPSQLITE_NUM) { -			if (decoded == NULL) { -				add_index_null(return_value, j); -			} else { -				add_index_stringl(return_value, j, decoded, decoded_len, 1); +			add_index_zval(return_value, j, decoded); +			if (mode & PHPSQLITE_ASSOC) { +				ZVAL_ADDREF(decoded); +				add_assoc_zval(return_value, (char*)colnames[j], decoded);  			} -		} -		if (mode & PHPSQLITE_ASSOC) { -			/* Lets see if we need to change case of the assoc key */ -			if (decoded == NULL) { -				add_assoc_null(return_value, (char*)colnames[j]); -			} else { -				add_assoc_stringl(return_value, (char*)colnames[j], decoded, decoded_len, 1); -			} -		} - -		if (decode_binary && rowdata[j] != NULL && rowdata[j][0] == '\x01') { -			free_alloca(decoded); +		} else { +			add_assoc_zval(return_value, (char*)colnames[j], decoded);  		}  	} @@ -1154,6 +1146,41 @@ static void php_sqlite_fetch_column(struct php_sqlite_result *res, zval *which,  }  /* }}} */ +/* {{{ proto array sqlite_fetch_all(resource result [, int result_type, bool decode_binary]) +   Fetches all rows from a result set as an array */ +PHP_FUNCTION(sqlite_fetch_all) +{ +	zval *zres, *ent; +	int mode = PHPSQLITE_BOTH; +	zend_bool decode_binary = 1; +	struct php_sqlite_result *res; + +	if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|lb", &zres, &mode, &decode_binary)) { +		return; +	} +	ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result); +	if (ZEND_NUM_ARGS() < 2) { +		mode = res->mode; +	} + +	if (res->curr_row >= res->nrows && res->nrows) { +		if (!res->buffered) { +			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "One or more rowsets were already returned"); +		} else { +			res->curr_row = 0; +		} +	} + +	array_init(return_value); + +	while (res->curr_row < res->nrows) { +		MAKE_STD_ZVAL(ent); +		php_sqlite_fetch_array(res, mode, decode_binary, 1, ent TSRMLS_CC); +		add_next_index_zval(return_value, ent); +	} +} +/* }}} */ +  /* {{{ proto array sqlite_fetch_array(resource result [, int result_type, bool decode_binary])     Fetches the next row from a result set as an array */  PHP_FUNCTION(sqlite_fetch_array) @@ -1445,7 +1472,7 @@ PHP_FUNCTION(sqlite_rewind)  	}  	if (!res->nrows) { -		php_error_docref(NULL TSRMLS_CC, E_WARNING, "no rows received"); +		php_error_docref(NULL TSRMLS_CC, E_NOTICE, "no rows received");  		RETURN_FALSE;  	}  | 
