@@ -586,6 +586,8 @@ PHP_METHOD(SQLite3, query)
586
586
result = Z_SQLITE3_RESULT_P (return_value );
587
587
result -> db_obj = db_obj ;
588
588
result -> stmt_obj = stmt_obj ;
589
+ result -> column_names = NULL ;
590
+ result -> column_count = -1 ;
589
591
ZVAL_OBJ (& result -> stmt_obj_zval , Z_OBJ (stmt ));
590
592
591
593
return_code = sqlite3_step (result -> stmt_obj -> stmt );
@@ -1792,6 +1794,8 @@ PHP_METHOD(SQLite3Stmt, execute)
1792
1794
result -> is_prepared_statement = 1 ;
1793
1795
result -> db_obj = stmt_obj -> db_obj ;
1794
1796
result -> stmt_obj = stmt_obj ;
1797
+ result -> column_names = NULL ;
1798
+ result -> column_count = -1 ;
1795
1799
ZVAL_OBJ_COPY (& result -> stmt_obj_zval , Z_OBJ_P (object ));
1796
1800
1797
1801
break ;
@@ -1945,11 +1949,26 @@ PHP_METHOD(SQLite3Result, fetchArray)
1945
1949
RETURN_FALSE ;
1946
1950
}
1947
1951
1952
+ if (result_obj -> column_count == -1 ) {
1953
+ result_obj -> column_count = sqlite3_column_count (result_obj -> stmt_obj -> stmt );
1954
+ }
1955
+
1956
+ zend_long n_cols = result_obj -> column_count ;
1957
+
1958
+ /* Cache column names to speed up repeated fetchArray calls.
1959
+ * Names are deallocated in php_sqlite3_result_object_free_storage. */
1960
+ if (mode & PHP_SQLITE3_ASSOC && !result_obj -> column_names ) {
1961
+ result_obj -> column_names = pemalloc (n_cols * sizeof (zend_string * ), 0 );
1962
+
1963
+ for (int i = 0 ; i < n_cols ; i ++ ) {
1964
+ const char * column = sqlite3_column_name (result_obj -> stmt_obj -> stmt , i );
1965
+ result_obj -> column_names [i ] = zend_string_init (column , strlen (column ), 0 );
1966
+ }
1967
+ }
1968
+
1948
1969
array_init (return_value );
1949
-
1950
- int column_count = sqlite3_data_count (result_obj -> stmt_obj -> stmt );
1951
1970
1952
- for (i = 0 ; i < column_count ; i ++ ) {
1971
+ for (i = 0 ; i < n_cols ; i ++ ) {
1953
1972
zval data ;
1954
1973
1955
1974
sqlite_value_to_zval (result_obj -> stmt_obj -> stmt , i , & data );
@@ -1964,7 +1983,7 @@ PHP_METHOD(SQLite3Result, fetchArray)
1964
1983
Z_ADDREF (data );
1965
1984
}
1966
1985
}
1967
- add_assoc_zval ( return_value , ( char * ) sqlite3_column_name ( result_obj -> stmt_obj -> stmt , i ) , & data );
1986
+ zend_symtable_add_new ( Z_ARR_P ( return_value ), result_obj -> column_names [ i ] , & data );
1968
1987
}
1969
1988
}
1970
1989
break ;
@@ -2235,6 +2254,13 @@ static void php_sqlite3_result_object_free_storage(zend_object *object) /* {{{ *
2235
2254
return ;
2236
2255
}
2237
2256
2257
+ if (intern -> column_names ) {
2258
+ for (int i = 0 ; i < intern -> column_count ; i ++ ) {
2259
+ zend_string_release (intern -> column_names [i ]);
2260
+ }
2261
+ efree (intern -> column_names );
2262
+ }
2263
+
2238
2264
if (!Z_ISNULL (intern -> stmt_obj_zval )) {
2239
2265
if (intern -> stmt_obj && intern -> stmt_obj -> initialised ) {
2240
2266
sqlite3_reset (intern -> stmt_obj -> stmt );
0 commit comments