summaryrefslogtreecommitdiff
path: root/ext/sqlite/sqlite.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-06-06 19:00:16 +0000
committerMarcus Boerger <helly@php.net>2003-06-06 19:00:16 +0000
commit797654bde76935200a2402c25637b68e4ff7d0b6 (patch)
tree199fdfc80fe244b31581675723942f3753f7866d /ext/sqlite/sqlite.c
parentbd2f381edf10e2a01684f3b9c7f5004908d76116 (diff)
downloadphp-git-797654bde76935200a2402c25637b68e4ff7d0b6.tar.gz
New fetch_all() an fetch optimization reworked (original idea by ilia)
Diffstat (limited to 'ext/sqlite/sqlite.c')
-rw-r--r--ext/sqlite/sqlite.c79
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;
}