summaryrefslogtreecommitdiff
path: root/ext/oci8
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>2002-01-17 18:40:59 +0000
committerThies C. Arntzen <thies@php.net>2002-01-17 18:40:59 +0000
commitdadf411b8d2d5b0d1b246133687b4fa9da1fa71c (patch)
tree18c064f0597319606e1ef8a0c8b9e1b7e92e87ef /ext/oci8
parent2e2d1d356cb3dd70cdcd5864e0d73a4b6f459225 (diff)
downloadphp-git-dadf411b8d2d5b0d1b246133687b4fa9da1fa71c.tar.gz
@ - Added 3 new optional parameters to OCIFetchStatement(). They control
@ the number of rows to skip at the beginning of the cursor, the @ maximun numer of rows that should be fetched and the format of the @ returned array. (Thies) # sorry, no time to write the docs for this right now...
Diffstat (limited to 'ext/oci8')
-rw-r--r--ext/oci8/oci8.c135
1 files changed, 105 insertions, 30 deletions
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index 13a70db18f..98c9dd8783 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -300,6 +300,10 @@ PHP_FUNCTION(ocicolltrim);
#define OCI_RETURN_NULLS 1<<2
#define OCI_RETURN_LOBS 1<<3
+#define OCI_FETCHSTATEMENT_BY_COLUMN 1<<4
+#define OCI_FETCHSTATEMENT_BY_ROW 1<<5
+#define OCI_FETCHSTATEMENT_BY (OCI_FETCHSTATEMENT_BY_COLUMN | OCI_FETCHSTATEMENT_BY_ROW)
+
static unsigned char a3_arg_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
static unsigned char a2_arg_force_ref[] = { 2, BYREF_NONE, BYREF_FORCE };
@@ -525,6 +529,10 @@ PHP_MINIT_FUNCTION(oci)
REGISTER_LONG_CONSTANT("OCI_B_CURSOR",SQLT_RSET, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("OCI_B_BIN",SQLT_BIN, CONST_CS | CONST_PERSISTENT);
+/* for OCIFetchStatement */
+ REGISTER_LONG_CONSTANT("OCI_FETCHSTATEMENT_BY_COLUMN", OCI_FETCHSTATEMENT_BY_COLUMN, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("OCI_FETCHSTATEMENT_BY_ROW", OCI_FETCHSTATEMENT_BY_ROW, CONST_CS | CONST_PERSISTENT);
+
/* for OCIFetchInto & OCIResult */
REGISTER_LONG_CONSTANT("OCI_ASSOC",OCI_ASSOC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("OCI_NUM",OCI_NUM, CONST_CS | CONST_PERSISTENT);
@@ -3937,31 +3945,36 @@ PHP_FUNCTION(ocifetchinto)
/* }}} */
-/* {{{ proto int ocifetchstatement(int stmt, array &output)
+/* {{{ proto int ocifetchstatement(int stmt, array &output[, int skip][, int maxrows][, int flags])
Fetch all rows of result data into an array */
PHP_FUNCTION(ocifetchstatement)
{
- zval **stmt, **array, *element, **fmode, *tmp;
+ zval **stmt, **array, *element, **zskip, **zmaxrows, **zflags, *tmp;
oci_statement *statement;
oci_out_column **columns;
zval ***outarrs;
ub4 nrows = 1;
int i;
- int mode = OCI_NUM;
+ int skip = 0, maxrows = -1;
+ int flags = 0;
int rows = 0;
- char *namebuf;
int ac = ZEND_NUM_ARGS();
- if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &stmt, &array, &fmode) == FAILURE) {
+ if (ac < 2 || ac > 5 || zend_get_parameters_ex(ac, &stmt, &array, &zskip, &zmaxrows, &zflags) == FAILURE) {
WRONG_PARAM_COUNT;
}
switch (ac) {
+ case 5:
+ convert_to_long_ex(zflags);
+ flags = Z_LVAL_PP(zflags);
+ case 4:
+ convert_to_long_ex(zmaxrows);
+ maxrows = Z_LVAL_PP(zmaxrows);
case 3:
- convert_to_long_ex(fmode);
- mode = Z_LVAL_PP(fmode);
- /* possible breakthru */
+ convert_to_long_ex(zskip);
+ skip = Z_LVAL_PP(zskip);
}
OCI_GET_STMT(statement,stmt);
@@ -3969,34 +3982,96 @@ PHP_FUNCTION(ocifetchstatement)
zval_dtor(*array);
array_init(*array);
- columns = emalloc(statement->ncolumns * sizeof(oci_out_column *));
- outarrs = emalloc(statement->ncolumns * sizeof(zval*));
-
- for (i = 0; i < statement->ncolumns; i++) {
- columns[ i ] = oci_get_col(statement, i + 1, 0);
-
- MAKE_STD_ZVAL(tmp);
- array_init(tmp);
-
- namebuf = estrndup(columns[ i ]->name,columns[ i ]->name_len);
-
- zend_hash_update(Z_ARRVAL_PP(array), namebuf, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
- efree(namebuf);
+ while (skip--) {
+ if (! oci_fetch(statement, nrows, "OCIFetchStatement" TSRMLS_CC))
+ RETURN_LONG(0);
}
- while (oci_fetch(statement, nrows, "OCIFetchStatement" TSRMLS_CC)) {
+ if (flags & OCI_FETCHSTATEMENT_BY_ROW) {
+ columns = emalloc(statement->ncolumns * sizeof(oci_out_column *));
+
for (i = 0; i < statement->ncolumns; i++) {
- MAKE_STD_ZVAL(element);
+ columns[ i ] = oci_get_col(statement, i + 1, 0);
+ }
+
+ while (oci_fetch(statement, nrows, "OCIFetchStatement" TSRMLS_CC)) {
+ zval *row;
+
+ MAKE_STD_ZVAL(row);
+ array_init(row);
+
+ for (i = 0; i < statement->ncolumns; i++) {
+ MAKE_STD_ZVAL(element);
+
+ _oci_make_zval(element,statement,columns[ i ], "OCIFetchStatement",OCI_RETURN_LOBS TSRMLS_CC);
+
+ if (flags & OCI_NUM) {
+ zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL);
+ } else { /* default to ASSOC */
+ zend_hash_update(Z_ARRVAL_P(row),
+ columns[ i ]->name, columns[ i ]->name_len+1,
+ &element, sizeof(zval*), NULL);
+ }
+ }
+
+ zend_hash_next_index_insert(Z_ARRVAL_PP(array), &row, sizeof(zval*), NULL),
+
+ rows++;
- _oci_make_zval(element,statement,columns[ i ], "OCIFetchStatement",OCI_RETURN_LOBS TSRMLS_CC);
+ if ((maxrows != -1) && (rows == maxrows)) {
+ oci_fetch(statement, 0, "OCIFetchStatement" TSRMLS_CC);
+ break;
+ }
+ }
- zend_hash_index_update((*(outarrs[ i ]))->value.ht, rows, (void *)&element, sizeof(zval*), NULL);
+ efree(columns);
+ } else { /* default to BY_COLUMN */
+ columns = emalloc(statement->ncolumns * sizeof(oci_out_column *));
+ outarrs = emalloc(statement->ncolumns * sizeof(zval*));
+
+ if (flags & OCI_NUM) {
+ for (i = 0; i < statement->ncolumns; i++) {
+ columns[ i ] = oci_get_col(statement, i + 1, 0);
+
+ MAKE_STD_ZVAL(tmp);
+ array_init(tmp);
+
+ zend_hash_next_index_insert(Z_ARRVAL_PP(array),
+ &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
+ }
+ } else { /* default to ASSOC */
+ for (i = 0; i < statement->ncolumns; i++) {
+ columns[ i ] = oci_get_col(statement, i + 1, 0);
+
+ MAKE_STD_ZVAL(tmp);
+ array_init(tmp);
+
+ zend_hash_update(Z_ARRVAL_PP(array),
+ columns[ i ]->name, columns[ i ]->name_len+1,
+ (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
+ }
}
- rows++;
- }
-
- efree(columns);
- efree(outarrs);
+
+ while (oci_fetch(statement, nrows, "OCIFetchStatement" TSRMLS_CC)) {
+ for (i = 0; i < statement->ncolumns; i++) {
+ MAKE_STD_ZVAL(element);
+
+ _oci_make_zval(element,statement,columns[ i ], "OCIFetchStatement",OCI_RETURN_LOBS TSRMLS_CC);
+
+ zend_hash_index_update((*(outarrs[ i ]))->value.ht, rows, (void *)&element, sizeof(zval*), NULL);
+ }
+
+ rows++;
+
+ if ((maxrows != -1) && (rows == maxrows)) {
+ oci_fetch(statement, 0, "OCIFetchStatement" TSRMLS_CC);
+ break;
+ }
+ }
+
+ efree(columns);
+ efree(outarrs);
+ }
RETURN_LONG(rows);
}