From: Stanley Sufficool Date: Mon, 21 Jun 2010 06:54:10 +0000 (+0000) Subject: Fix bug #45876 adding get column meta X-Git-Tag: php-5.4.0alpha1~191^2~1262 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5712b1ec9f80bc1ed883c0836f1d911e5d14c2ab;p=php Fix bug #45876 adding get column meta --- diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c index bad9dae8a4..be57928593 100644 --- a/ext/pdo_dblib/dblib_stmt.c +++ b/ext/pdo_dblib/dblib_stmt.c @@ -32,6 +32,69 @@ #include "php_pdo_dblib_int.h" #include "zend_exceptions.h" + +/* {{{ pdo_dblib_get_field_name + * + * Taken from php_mssql_get_field_name + * + */ +static char *pdo_dblib_get_field_name(int type) +{ + switch (type) { + case SQLBINARY: + case SQLVARBINARY: + return "blob"; + break; + case SQLCHAR: + case SQLVARCHAR: + return "char"; + break; + case SQLTEXT: + return "text"; + break; + case SQLDATETIME: + case SQLDATETIM4: + case SQLDATETIMN: + return "datetime"; + break; + case SQLDECIMAL: + case SQLFLT4: + case SQLFLT8: + case SQLFLTN: + return "real"; + break; + case SQLINT1: + case SQLINT2: + case SQLINT4: + case SQLINTN: + return "int"; + break; + case SQLNUMERIC: + return "numeric"; + break; + case SQLMONEY: + case SQLMONEY4: + case SQLMONEYN: + return "money"; + break; + case SQLBIT: + return "bit"; + break; + case SQLIMAGE: + return "image"; + break; +#ifdef SQLUNIQUE + case SQLUNIQUE: + return "uniqueidentifier"; + break; +#endif + default: + return "unknown"; + break; + } +} +/* }}} */ + static int dblib_dblib_stmt_cursor_closer(pdo_stmt_t *stmt TSRMLS_DC) { pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data; @@ -207,6 +270,25 @@ static int pdo_dblib_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da return 1; } +static int pdo_dblib_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC) +{ + pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data; + pdo_dblib_db_handle *H = S->H; + + array_init(return_value); + + DBTYPEINFO* dbtypeinfo; + dbtypeinfo = dbcoltypeinfo(H->link, colno+1); + + add_assoc_long(return_value, "max_length", dbcollen(H->link, colno+1) ); + add_assoc_long(return_value, "precision", (int) dbtypeinfo->precision ); + add_assoc_long(return_value, "scale", (int) dbtypeinfo->scale ); + add_assoc_string(return_value, "column_source", dbcolsource(H->link, colno+1), 1); + add_assoc_string(return_value, "native_type", pdo_dblib_get_field_name(dbcoltype(H->link, colno+1)), 1); + + return 1; +} + struct pdo_stmt_methods dblib_stmt_methods = { pdo_dblib_stmt_dtor, @@ -217,7 +299,7 @@ struct pdo_stmt_methods dblib_stmt_methods = { pdo_dblib_stmt_param_hook, NULL, /* set attr */ NULL, /* get attr */ - NULL, /* meta */ + pdo_dblib_stmt_get_column_meta, /* meta */ pdo_dblib_stmt_next_rowset, /* nextrow */ dblib_dblib_stmt_cursor_closer };