@@ -417,6 +417,8 @@ static PHP_GINIT_FUNCTION(pgsql)
417
417
#endif
418
418
memset (pgsql_globals , 0 , sizeof (zend_pgsql_globals ));
419
419
zend_hash_init (& pgsql_globals -> connections , 0 , NULL , NULL , 1 );
420
+ zend_hash_init (& pgsql_globals -> meta , 0 , NULL , NULL , 1 );
421
+ zend_hash_init (& pgsql_globals -> meta_extended , 0 , NULL , NULL , 1 );
420
422
}
421
423
422
424
static void php_libpq_version (char * buf , size_t len )
@@ -483,6 +485,8 @@ PHP_MINIT_FUNCTION(pgsql)
483
485
PHP_MSHUTDOWN_FUNCTION (pgsql )
484
486
{
485
487
UNREGISTER_INI_ENTRIES ();
488
+ zend_hash_destroy (& PGG (meta ));
489
+ zend_hash_destroy (& PGG (meta_extended ));
486
490
zend_hash_destroy (& PGG (connections ));
487
491
488
492
return SUCCESS ;
@@ -4147,20 +4151,34 @@ PHP_FUNCTION(pg_flush)
4147
4151
4148
4152
/* {{{ php_pgsql_meta_data
4149
4153
* table_name must not be empty
4150
- * TODO: Add meta_data cache for better performance
4151
4154
*/
4152
- PHP_PGSQL_API zend_result php_pgsql_meta_data (PGconn * pg_link , const zend_string * table_name , zval * meta , bool extended )
4155
+ PHP_PGSQL_API zend_result php_pgsql_meta_data (PGconn * pg_link , zend_string * table_name , zval * meta , bool extended )
4153
4156
{
4154
4157
PGresult * pg_result ;
4155
4158
char * src , * tmp_name , * tmp_name2 = NULL ;
4156
4159
char * escaped ;
4157
4160
smart_str querystr = {0 };
4158
4161
size_t new_len ;
4159
4162
int i , num_rows ;
4160
- zval elem ;
4163
+ zval elem , * tmp , * nelem ;
4164
+ HashTable * zmeta ;
4165
+
4166
+ const char pg_cache_field [] = "pg_meta_data_cached" ;
4161
4167
4162
4168
ZEND_ASSERT (ZSTR_LEN (table_name ) != 0 );
4163
4169
4170
+ zmeta = (extended ? & PGG (meta_extended ) : & PGG (meta ));
4171
+
4172
+ if ((tmp = zend_hash_find (zmeta , table_name )) != NULL ) {
4173
+ ZVAL_COPY_VALUE (meta , tmp );
4174
+ nelem = zend_hash_str_find (Z_ARR_P (meta ), pg_cache_field , sizeof (pg_cache_field ) - 1 );
4175
+ ZEND_ASSERT (nelem != NULL );
4176
+ if (Z_TYPE_INFO_P (nelem ) == IS_FALSE ) {
4177
+ ZVAL_BOOL (nelem , true);
4178
+ }
4179
+ return SUCCESS ;
4180
+ }
4181
+
4164
4182
src = estrdup (ZSTR_VAL (table_name ));
4165
4183
tmp_name = php_strtok_r (src , "." , & tmp_name2 );
4166
4184
if (!tmp_name ) {
@@ -4250,7 +4268,14 @@ PHP_PGSQL_API zend_result php_pgsql_meta_data(PGconn *pg_link, const zend_string
4250
4268
name = PQgetvalue (pg_result ,i ,0 );
4251
4269
add_assoc_zval (meta , name , & elem );
4252
4270
}
4271
+
4272
+ add_assoc_bool_ex (meta , pg_cache_field , sizeof (pg_cache_field ) - 1 , false);
4273
+
4274
+ tmp = (zval * )safe_emalloc (1 , sizeof (zval ), 0 );
4275
+ ZVAL_COPY (tmp , meta );
4276
+ zend_hash_add (zmeta , table_name , tmp );
4253
4277
PQclear (pg_result );
4278
+ efree (tmp );
4254
4279
4255
4280
return SUCCESS ;
4256
4281
}
@@ -4459,7 +4484,7 @@ static zend_string *php_pgsql_add_quotes(zend_string *src)
4459
4484
/* {{{ php_pgsql_convert
4460
4485
* check and convert array values (fieldname=>value pair) for sql
4461
4486
*/
4462
- PHP_PGSQL_API zend_result php_pgsql_convert (PGconn * pg_link , const zend_string * table_name , const zval * values , zval * result , zend_ulong opt )
4487
+ PHP_PGSQL_API zend_result php_pgsql_convert (PGconn * pg_link , zend_string * table_name , const zval * values , zval * result , zend_ulong opt )
4463
4488
{
4464
4489
zend_string * field = NULL ;
4465
4490
zval meta , * def , * type , * not_null , * has_default , * is_enum , * val , new_val ;
@@ -5198,7 +5223,7 @@ static inline void build_tablename(smart_str *querystr, PGconn *pg_link, const z
5198
5223
/* }}} */
5199
5224
5200
5225
/* {{{ php_pgsql_insert */
5201
- PHP_PGSQL_API zend_result php_pgsql_insert (PGconn * pg_link , const zend_string * table , zval * var_array , zend_ulong opt , zend_string * * sql )
5226
+ PHP_PGSQL_API zend_result php_pgsql_insert (PGconn * pg_link , zend_string * table , zval * var_array , zend_ulong opt , zend_string * * sql )
5202
5227
{
5203
5228
zval * val , converted ;
5204
5229
char buf [256 ];
@@ -5466,7 +5491,7 @@ static inline int build_assignment_string(PGconn *pg_link, smart_str *querystr,
5466
5491
/* }}} */
5467
5492
5468
5493
/* {{{ php_pgsql_update */
5469
- PHP_PGSQL_API zend_result php_pgsql_update (PGconn * pg_link , const zend_string * table , zval * var_array , zval * ids_array , zend_ulong opt , zend_string * * sql )
5494
+ PHP_PGSQL_API zend_result php_pgsql_update (PGconn * pg_link , zend_string * table , zval * var_array , zval * ids_array , zend_ulong opt , zend_string * * sql )
5470
5495
{
5471
5496
zval var_converted , ids_converted ;
5472
5497
smart_str querystr = {0 };
@@ -5577,7 +5602,7 @@ PHP_FUNCTION(pg_update)
5577
5602
/* }}} */
5578
5603
5579
5604
/* {{{ php_pgsql_delete */
5580
- PHP_PGSQL_API zend_result php_pgsql_delete (PGconn * pg_link , const zend_string * table , zval * ids_array , zend_ulong opt , zend_string * * sql )
5605
+ PHP_PGSQL_API zend_result php_pgsql_delete (PGconn * pg_link , zend_string * table , zval * ids_array , zend_ulong opt , zend_string * * sql )
5581
5606
{
5582
5607
zval ids_converted ;
5583
5608
smart_str querystr = {0 };
@@ -5715,7 +5740,7 @@ PHP_PGSQL_API void php_pgsql_result2array(PGresult *pg_result, zval *ret_array,
5715
5740
/* }}} */
5716
5741
5717
5742
/* {{{ php_pgsql_select */
5718
- PHP_PGSQL_API zend_result php_pgsql_select (PGconn * pg_link , const zend_string * table , zval * ids_array , zval * ret_array , zend_ulong opt , long result_type , zend_string * * sql )
5743
+ PHP_PGSQL_API zend_result php_pgsql_select (PGconn * pg_link , zend_string * table , zval * ids_array , zval * ret_array , zend_ulong opt , long result_type , zend_string * * sql )
5719
5744
{
5720
5745
zval ids_converted ;
5721
5746
smart_str querystr = {0 };
0 commit comments