@@ -4875,7 +4875,7 @@ PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, z
4875
4875
}
4876
4876
4877
4877
smart_str_appends (& querystr ,
4878
- "SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotNULL , a.atthasdef, a.attndims "
4878
+ "SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotnull , a.atthasdef, a.attndims, t.typtype = 'e' "
4879
4879
"FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n "
4880
4880
"WHERE a.attnum > 0 AND a.attrelid = c.oid AND c.relname = '" );
4881
4881
tmp_name2 = php_addslashes (tmp_name2 , strlen (tmp_name2 ), & new_len , 0 TSRMLS_CC );
@@ -4921,6 +4921,12 @@ PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, z
4921
4921
add_assoc_bool (elem , "has default" , 0 );
4922
4922
}
4923
4923
add_assoc_long (elem , "array dims" , atoi (PQgetvalue (pg_result ,i ,6 )));
4924
+ if (!strcmp (PQgetvalue (pg_result ,i ,7 ), "t" )) {
4925
+ add_assoc_bool (elem , "is enum" , 1 );
4926
+ }
4927
+ else {
4928
+ add_assoc_bool (elem , "is enum" , 0 );
4929
+ }
4924
4930
name = PQgetvalue (pg_result ,i ,0 );
4925
4931
add_assoc_zval (meta , name , elem );
4926
4932
}
@@ -4954,7 +4960,18 @@ PHP_FUNCTION(pg_meta_data)
4954
4960
zval_dtor (return_value ); /* destroy array */
4955
4961
RETURN_FALSE ;
4956
4962
}
4957
- }
4963
+ else {
4964
+ HashPosition pos ;
4965
+ zval * * val ;
4966
+
4967
+ for (zend_hash_internal_pointer_reset_ex (Z_ARRVAL_P (return_value ), & pos );
4968
+ zend_hash_get_current_data_ex (Z_ARRVAL_P (return_value ), (void * * )& val , & pos ) == SUCCESS ;
4969
+ zend_hash_move_forward_ex (Z_ARRVAL_P (return_value ), & pos )) {
4970
+ /* delete newly added entry, in order to keep BC */
4971
+ zend_hash_del_key_or_index (Z_ARRVAL_PP (val ), "is enum" , sizeof ("is enum" ), 0 , HASH_DEL_KEY );
4972
+ }
4973
+ }
4974
+ }
4958
4975
/* }}} */
4959
4976
4960
4977
/* {{{ php_pgsql_get_data_type
@@ -5136,8 +5153,9 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
5136
5153
char * field = NULL ;
5137
5154
uint field_len = -1 ;
5138
5155
ulong num_idx = -1 ;
5139
- zval * meta , * * def , * * type , * * not_null , * * has_default , * * val , * new_val ;
5156
+ zval * meta , * * def , * * type , * * not_null , * * has_default , * * is_enum , * * val , * new_val ;
5140
5157
int new_len , key_type , err = 0 , skip_field ;
5158
+ php_pgsql_data_type data_type ;
5141
5159
5142
5160
assert (pg_link != NULL );
5143
5161
assert (Z_TYPE_P (values ) == IS_ARRAY );
@@ -5188,17 +5206,30 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
5188
5206
php_error_docref (NULL TSRMLS_CC , E_NOTICE , "Detected broken meta data. Missing 'has default'" );
5189
5207
err = 1 ;
5190
5208
}
5209
+ if (!err && zend_hash_find (Z_ARRVAL_PP (def ), "is enum" , sizeof ("is enum" ), (void * * )& is_enum ) == FAILURE ) {
5210
+ php_error_docref (NULL TSRMLS_CC , E_NOTICE , "Detected broken meta data. Missing 'is enum'" );
5211
+ err = 1 ;
5212
+ }
5191
5213
if (!err && (Z_TYPE_PP (val ) == IS_ARRAY ||
5192
5214
Z_TYPE_PP (val ) == IS_OBJECT ||
5193
5215
Z_TYPE_PP (val ) == IS_CONSTANT_ARRAY )) {
5194
- php_error_docref (NULL TSRMLS_CC , E_NOTICE , "Expects scaler values as field values" );
5216
+ php_error_docref (NULL TSRMLS_CC , E_NOTICE , "Expects scalar values as field values" );
5195
5217
err = 1 ;
5196
5218
}
5197
5219
if (err ) {
5198
5220
break ; /* break out for() */
5199
5221
}
5200
5222
ALLOC_INIT_ZVAL (new_val );
5201
- switch (php_pgsql_get_data_type (Z_STRVAL_PP (type ), Z_STRLEN_PP (type )))
5223
+
5224
+ if (Z_BVAL_PP (is_enum )) {
5225
+ /* enums need to be treated like strings */
5226
+ data_type = PG_TEXT ;
5227
+ }
5228
+ else {
5229
+ data_type = php_pgsql_get_data_type (Z_STRVAL_PP (type ), Z_STRLEN_PP (type ));
5230
+ }
5231
+
5232
+ switch (data_type )
5202
5233
{
5203
5234
case PG_BOOL :
5204
5235
switch (Z_TYPE_PP (val )) {
0 commit comments