]> granicus.if.org Git - php/commitdiff
meta data for sqlite3.
authorWez Furlong <wez@php.net>
Sun, 26 Sep 2004 20:46:35 +0000 (20:46 +0000)
committerWez Furlong <wez@php.net>
Sun, 26 Sep 2004 20:46:35 +0000 (20:46 +0000)
Fix repeated executes when the entire rowset has not been consumed.

ext/pdo_sqlite/php_pdo_sqlite_int.h
ext/pdo_sqlite/sqlite_statement.c

index 7e2a5ef17e04f8c6bcaa4c94a8dc8f2224520d6b..ee57fa378c8889640ca6c264d55ef4044d48f72c 100644 (file)
@@ -39,6 +39,7 @@ typedef struct {
        pdo_sqlite_db_handle    *H;
        sqlite3_stmt *stmt;
        unsigned pre_fetched:1;
+       unsigned done:1;
 } pdo_sqlite_stmt;
 
 extern pdo_driver_t pdo_sqlite_driver;
index c68106494f17ef1c54c5a4064c29afd629ecbcf1..431563df101a9ea65e1fa8826976db2ac4ae7541 100644 (file)
@@ -51,6 +51,11 @@ static int pdo_sqlite_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC)
        pdo_sqlite_db_handle *H = S->H;
        int i;
 
+       if (stmt->executed) {
+               sqlite3_reset(S->stmt);
+       }
+
+       S->done = 0;
        i = sqlite3_step(S->stmt);
        switch (i) {
                case SQLITE_ROW:
@@ -61,6 +66,7 @@ static int pdo_sqlite_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC)
                case SQLITE_DONE:
                        stmt->column_count = sqlite3_data_count(S->stmt);
                        sqlite3_reset(S->stmt);
+                       S->done = 1;
                        return 1;
 
                case SQLITE_ERROR:
@@ -82,6 +88,11 @@ static int pdo_sqlite_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_d
 
        switch (event_type) {
                case PDO_PARAM_EVT_EXEC_PRE:
+                       if (stmt->executed && !S->done) {
+                               sqlite3_reset(S->stmt);
+                               S->done = 1;
+                       }
+                       
                        if (param->is_param) {
                                switch (param->param_type) {
                                        case PDO_PARAM_LOB:
@@ -123,16 +134,22 @@ static int pdo_sqlite_stmt_fetch(pdo_stmt_t *stmt TSRMLS_DC)
                S->pre_fetched = 0;
                return 1;
        }
+       if (S->done) {
+               return 0;
+       }
+
        i = sqlite3_step(S->stmt);
        switch (i) {
                case SQLITE_ROW:
                        return 1;
 
                case SQLITE_DONE:
+                       S->done = 1;
                        sqlite3_reset(S->stmt);
                        return 0;
 
                default:
+               printf("cluck done=%d pre_fetched=%d executed=%d\n", S->done, S->pre_fetched, stmt->executed);
                        pdo_sqlite_error_stmt(stmt);
                        return 0;
        }
@@ -198,13 +215,65 @@ static int pdo_sqlite_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsi
        }
 }
 
+static int pdo_sqlite_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC)
+{
+       pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data;
+       char *str;
+       zval *flags;
+       
+       if (!S->stmt) {
+               return FAILURE;
+       }
+       if(colno >= sqlite3_data_count(S->stmt)) {
+               /* error invalid column */
+               pdo_sqlite_error_stmt(stmt);
+               return FAILURE;
+       }
+
+       array_init(return_value);
+       MAKE_STD_ZVAL(flags);
+       array_init(flags);
+
+       switch (sqlite3_column_type(S->stmt, colno)) {
+               case SQLITE_NULL:
+                       add_assoc_string(return_value, "native_type", "null", 1);
+                       break;
+
+               case SQLITE_FLOAT:
+                       add_assoc_string(return_value, "native_type", "double", 1);
+                       break;
+
+               case SQLITE_BLOB:
+                       add_next_index_string(flags, "blob", 1);
+               case SQLITE_TEXT:
+                       add_assoc_string(return_value, "native_type", "string", 1);
+                       break;
+
+               case SQLITE_INTEGER:
+                       add_assoc_string(return_value, "native_type", "integer", 1);
+                       break;
+       }
+
+       str = (char*)sqlite3_column_decltype(S->stmt, colno);
+       if (str) {
+               add_assoc_string(return_value, "sqlite:decl_type", str, 1);
+       }
+
+       add_assoc_zval(return_value, "flags", flags);
+
+       return SUCCESS;
+}
+
 struct pdo_stmt_methods sqlite_stmt_methods = {
        pdo_sqlite_stmt_dtor,
        pdo_sqlite_stmt_execute,
        pdo_sqlite_stmt_fetch,
        pdo_sqlite_stmt_describe,
        pdo_sqlite_stmt_get_col,
-       pdo_sqlite_stmt_param_hook
+       pdo_sqlite_stmt_param_hook,
+       NULL, /* set_attr */
+       NULL, /* get_attr */
+       pdo_sqlite_stmt_col_meta
 };
 
 /*