]> granicus.if.org Git - php/commitdiff
- Fixed bug #43296 (Feature req: pdo_firebird: ATTR_FETCH_TABLE_NAMES support)
authorLars Westermann <lwe@php.net>
Thu, 15 Nov 2007 00:10:38 +0000 (00:10 +0000)
committerLars Westermann <lwe@php.net>
Thu, 15 Nov 2007 00:10:38 +0000 (00:10 +0000)
ext/pdo_firebird/firebird_driver.c
ext/pdo_firebird/firebird_statement.c
ext/pdo_firebird/php_pdo_firebird_int.h

index 3083d0795d61a7fcbf91f6b72f67555a2ea1f096..cc71dc0c7710f374fb6425d605e9b7971ce32c4b 100644 (file)
@@ -493,6 +493,11 @@ static int firebird_handle_set_attribute(pdo_dbh_t *dbh, long attr, zval *val TS
                        }
                        return 1;
 
+               case PDO_ATTR_FETCH_TABLE_NAMES:
+                       convert_to_boolean(val);
+                       H->fetch_table_names = Z_BVAL_P(val);
+                       return 1;
+
                case PDO_FB_ATTR_DATE_FORMAT:
                        convert_to_string(val);
                        if (H->date_format) {
index f581e24b4ae9e3ea9bfe1dcd93af0c3842eee777..2b44f87a036faa42e1736230ef0ddf435f90e7c8 100644 (file)
@@ -162,15 +162,27 @@ static int firebird_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{
        pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data;
        struct pdo_column_data *col = &stmt->columns[colno];
        XSQLVAR *var = &S->out_sqlda.sqlvar[colno];
+       int colname_len;
+       char *cp;
        
        /* allocate storage for the column */
        var->sqlind = (void*)emalloc(var->sqllen + 2*sizeof(short));
        var->sqldata = &((char*)var->sqlind)[sizeof(short)];
 
+       colname_len = (S->H->fetch_table_names && var->relname_length)
+                                       ? (var->aliasname_length + var->relname_length + 1)
+                                       : (var->aliasname_length);
        col->precision = -var->sqlscale;
        col->maxlen = var->sqllen;
-       col->namelen = var->aliasname_length;
-       col->name = estrndup(var->aliasname,var->aliasname_length);
+       col->namelen = colname_len;
+       col->name = cp = emalloc(colname_len + 1);
+       if (colname_len > var->aliasname_length) {
+               memmove(cp, var->relname, var->relname_length);
+               cp += var->relname_length;
+               *cp++ = '.';
+       }
+       memmove(cp, var->aliasname, var->aliasname_length);
+       *(cp+var->aliasname_length) = '\0';
        col->param_type = PDO_PARAM_STR;
 
        return 1;
index 1728725cd30e6de2c94e754bdd05efb60e387335..a9ac94955c6267c965e52ae7aa2cb35386e65f52 100644 (file)
@@ -82,6 +82,11 @@ typedef struct {
        char *time_format;
        char *timestamp_format;
        
+       /* prepend table names on column names in fetch */
+       unsigned fetch_table_names:1;
+       
+       unsigned _reserved:31;
+       
 } pdo_firebird_db_handle;