Diff for /embedaddon/php/ext/pdo_dblib/dblib_stmt.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/05/29 12:34:41 version 1.1.1.3, 2013/07/22 01:31:58
Line 2 Line 2
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | PHP Version 5                                                        |    | PHP Version 5                                                        |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
  | Copyright (c) 1997-2012 The PHP Group                                |  | Copyright (c) 1997-2013 The PHP Group                                |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | This source file is subject to version 3.01 of the PHP license,      |    | This source file is subject to version 3.01 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |    | that is bundled with this package in the file LICENSE, and is        |
Line 36 Line 36
   
 /* {{{ pdo_dblib_get_field_name  /* {{{ pdo_dblib_get_field_name
  *    * 
 * Updated for MSSQL 2008 SR2 extended types * Return the data type name for a given TDS number
  *    * 
  */   */
 static char *pdo_dblib_get_field_name(int type)  static char *pdo_dblib_get_field_name(int type)
 {  {
           /* 
            * I don't return dbprtype(type) because it does not fully describe the type 
            * (example: varchar is reported as char by dbprtype)
            * 
            * FIX ME: Cache datatypes from server systypes table in pdo_dblib_handle_factory()
            *                 to make this future proof.
            */
            
         switch (type) {          switch (type) {
                   case 31: return "nvarchar";
                 case 34: return "image";                  case 34: return "image";
                 case 35: return "text";                  case 35: return "text";
                 case 36: return "uniqueidentifier";                  case 36: return "uniqueidentifier";
                   case 37: return "varbinary"; /* & timestamp - Sybase AS12 */
                   case 38: return "bigint"; /* & bigintn - Sybase AS12 */
                   case 39: return "varchar"; /* & sysname & nvarchar - Sybase AS12 */
                 case 40: return "date";                  case 40: return "date";
                 case 41: return "time";                  case 41: return "time";
                 case 42: return "datetime2";                  case 42: return "datetime2";
                 case 43: return "datetimeoffset";                  case 43: return "datetimeoffset";
                   case 45: return "binary"; /* Sybase AS12 */
                   case 47: return "char"; /* & nchar & uniqueidentifierstr Sybase AS12 */
                 case 48: return "tinyint";                  case 48: return "tinyint";
                   case 50: return "bit"; /* Sybase AS12 */
                 case 52: return "smallint";                  case 52: return "smallint";
                   case 55: return "decimal"; /* Sybase AS12 */
                 case 56: return "int";                  case 56: return "int";
                 case 58: return "smalldatetime";                  case 58: return "smalldatetime";
                 case 59: return "real";                  case 59: return "real";
                 case 60: return "money";                  case 60: return "money";
                 case 61: return "datetime";                  case 61: return "datetime";
                 case 62: return "float";                  case 62: return "float";
                   case 63: return "numeric"; /* or uint, ubigint, usmallint Sybase AS12 */
                 case 98: return "sql_variant";                  case 98: return "sql_variant";
                 case 99: return "ntext";                  case 99: return "ntext";
                 case 104: return "bit";                  case 104: return "bit";
                case 106: return "decimal";                case 106: return "decimal"; /* decimal n on sybase */
                case 108: return "numeric";                case 108: return "numeric"; /* numeric n on sybase */
                 case 122: return "smallmoney";                  case 122: return "smallmoney";
                 case 127: return "bigint";                  case 127: return "bigint";
                 case 240: return "geometry";  
                 case 165: return "varbinary";                  case 165: return "varbinary";
                 case 167: return "varchar";                  case 167: return "varchar";
                 case 173: return "binary";                  case 173: return "binary";
Line 72  static char *pdo_dblib_get_field_name(int type) Line 88  static char *pdo_dblib_get_field_name(int type)
                 case 189: return "timestamp";                  case 189: return "timestamp";
                 case 231: return "nvarchar";                  case 231: return "nvarchar";
                 case 239: return "nchar";                  case 239: return "nchar";
                   case 240: return "geometry";
                 case 241: return "xml";                  case 241: return "xml";
                default:                 default: return "unknown";
                        return "unknown"; 
                        break; 
         }          }
 }  }
 /* }}} */  /* }}} */
   
static int dblib_dblib_stmt_cursor_closer(pdo_stmt_t *stmt TSRMLS_DC)static int pdo_dblib_stmt_cursor_closer(pdo_stmt_t *stmt TSRMLS_DC)
 {  {
         pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;          pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
         pdo_dblib_db_handle *H = S->H;          pdo_dblib_db_handle *H = S->H;
   
         /* Cancel any pending results */          /* Cancel any pending results */
         dbcancel(H->link);          dbcancel(H->link);
        
        efree(stmt->columns);        efree(stmt->columns); 
         stmt->columns = NULL;          stmt->columns = NULL;
                   
         return 1;          return 1;
Line 98  static int pdo_dblib_stmt_dtor(pdo_stmt_t *stmt TSRMLS Line 113  static int pdo_dblib_stmt_dtor(pdo_stmt_t *stmt TSRMLS
 {  {
         pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;          pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
   
        dblib_dblib_stmt_cursor_closer(stmt TSRMLS_CC);        efree(stmt->columns); 
         stmt->columns = NULL;
   
         efree(S);          efree(S);
                                   
Line 113  static int pdo_dblib_stmt_next_rowset(pdo_stmt_t *stmt Line 129  static int pdo_dblib_stmt_next_rowset(pdo_stmt_t *stmt
                   
         ret = dbresults(H->link);          ret = dbresults(H->link);
                   
        if (ret == FAIL || ret == NO_MORE_RESULTS) {        if (FAIL == ret) {
                 pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "PDO_DBLIB: dbresults() returned FAIL" TSRMLS_CC);               
                 return 0;                  return 0;
         }          }
                   
           if(NO_MORE_RESULTS == ret) {
                   return 0;
           }
                   
         stmt->row_count = DBCOUNT(H->link);          stmt->row_count = DBCOUNT(H->link);
         stmt->column_count = dbnumcols(H->link);          stmt->column_count = dbnumcols(H->link);
Line 131  static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt TSR Line 152  static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt TSR
                   
         dbsetuserdata(H->link, (BYTE*) &S->err);          dbsetuserdata(H->link, (BYTE*) &S->err);
                   
           pdo_dblib_stmt_cursor_closer(stmt TSRMLS_CC);
           
         if (FAIL == dbcmd(H->link, stmt->active_query_string)) {          if (FAIL == dbcmd(H->link, stmt->active_query_string)) {
                 return 0;                  return 0;
         }          }
Line 141  static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt TSR Line 164  static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt TSR
                   
         ret = pdo_dblib_stmt_next_rowset(stmt TSRMLS_CC);          ret = pdo_dblib_stmt_next_rowset(stmt TSRMLS_CC);
                   
         if (ret == 0) {  
                 return 0;  
         }  
           
         stmt->row_count = DBCOUNT(H->link);          stmt->row_count = DBCOUNT(H->link);
         stmt->column_count = dbnumcols(H->link);          stmt->column_count = dbnumcols(H->link);
                   
Line 162  static int pdo_dblib_stmt_fetch(pdo_stmt_t *stmt, Line 181  static int pdo_dblib_stmt_fetch(pdo_stmt_t *stmt,
                   
         ret = dbnextrow(H->link);          ret = dbnextrow(H->link);
                   
        if (ret == FAIL || ret == NO_MORE_ROWS) {        if (FAIL == ret) {
                 pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "PDO_DBLIB: dbnextrow() returned FAIL" TSRMLS_CC);
                 return 0;                  return 0;
         }          }
                   
           if(NO_MORE_ROWS == ret) {
                   return 0;
           }
                   
         return 1;                 return 1;       
 }  }
Line 174  static int pdo_dblib_stmt_describe(pdo_stmt_t *stmt, i Line 198  static int pdo_dblib_stmt_describe(pdo_stmt_t *stmt, i
         pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;          pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
         pdo_dblib_db_handle *H = S->H;          pdo_dblib_db_handle *H = S->H;
                   
           if(colno >= stmt->column_count || colno < 0)  {
                   return FAILURE;
           }
           
         struct pdo_column_data *col = &stmt->columns[colno];          struct pdo_column_data *col = &stmt->columns[colno];
                   
         col->name = (char*)dbcolname(H->link, colno+1);          col->name = (char*)dbcolname(H->link, colno+1);
Line 205  static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, in Line 233  static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, in
         }          }
                   
         switch (coltype) {          switch (coltype) {
                 case SQLCHAR:  
                 case SQLTEXT:  
                 case SQLVARBINARY:                  case SQLVARBINARY:
                 case SQLBINARY:                  case SQLBINARY:
                 case SQLIMAGE:                  case SQLIMAGE:
                   case SQLTEXT:
                           /* FIXME: Above types should be returned as a stream as they can be VERY large */
                   case SQLCHAR:
                 case SQLVARCHAR:                  case SQLVARCHAR:
                         tmp_ptr = emalloc(*len + 1);                          tmp_ptr = emalloc(*len + 1);
                         memcpy(tmp_ptr, *ptr, *len);                          memcpy(tmp_ptr, *ptr, *len);
Line 225  static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, in Line 254  static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, in
                         *ptr = tmp_ptr;                          *ptr = tmp_ptr;
                         break;                          break;
                 }                  }
 #ifdef SQLUNIQUE  
                 case SQLUNIQUE: {                  case SQLUNIQUE: {
 #else  
                 case 36: { /* FreeTDS hack, also used by ext/mssql */  
 #endif  
                         *len = 36+1;                          *len = 36+1;
                         tmp_ptr = emalloc(*len + 1);                          tmp_ptr = emalloc(*len + 1);
   
                         /* uniqueidentifier is a 16-byte binary number, convert to 32 char hex string */                          /* uniqueidentifier is a 16-byte binary number, convert to 32 char hex string */
 #ifdef SQLUNIQUE  
                         *len = dbconvert(NULL, SQLUNIQUE, *ptr, *len, SQLCHAR, tmp_ptr, *len);                          *len = dbconvert(NULL, SQLUNIQUE, *ptr, *len, SQLCHAR, tmp_ptr, *len);
 #else  
                         *len = dbconvert(NULL, 36, *ptr, *len, SQLCHAR, tmp_ptr, *len);  
 #endif  
                         php_strtoupper(tmp_ptr, *len);                          php_strtoupper(tmp_ptr, *len);
                         *ptr = tmp_ptr;                          *ptr = tmp_ptr;
                         break;                          break;
                 }                  }
                 default:                  default:
                         if (dbwillconvert(coltype, SQLCHAR)) {                          if (dbwillconvert(coltype, SQLCHAR)) {
                                tmp_len = 32 + (2 * (*len));                                tmp_len = 32 + (2 * (*len)); /* FIXME: We allocate more than we need here */
                                 tmp_ptr = emalloc(tmp_len);                                  tmp_ptr = emalloc(tmp_len);
                                 *len = dbconvert(NULL, coltype, *ptr, *len, SQLCHAR, tmp_ptr, -1);                                  *len = dbconvert(NULL, coltype, *ptr, *len, SQLCHAR, tmp_ptr, -1);
                                 *ptr = tmp_ptr;                                  *ptr = tmp_ptr;
                } else {                        } else {
                        *len = 0;                                *len = 0; /* FIXME: Silently fails and returns null on conversion errors */
                        *ptr = NULL;                                *ptr = NULL;
                }                        }
         }          }
   
         *caller_frees = 1;          *caller_frees = 1;
Line 270  static int pdo_dblib_stmt_get_column_meta(pdo_stmt_t * Line 291  static int pdo_dblib_stmt_get_column_meta(pdo_stmt_t *
 {  {
         pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;          pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
         pdo_dblib_db_handle *H = S->H;          pdo_dblib_db_handle *H = S->H;
                DBTYPEINFO* dbtypeinfo;
 
         if(colno >= stmt->column_count || colno < 0)  {
                 return FAILURE;
         }
 
         array_init(return_value);          array_init(return_value);
   
         DBTYPEINFO* dbtypeinfo;  
         dbtypeinfo = dbcoltypeinfo(H->link, colno+1);          dbtypeinfo = dbcoltypeinfo(H->link, colno+1);
           
           if(!dbtypeinfo) return FAILURE;
                                   
         add_assoc_long(return_value, "max_length", dbcollen(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, "precision", (int) dbtypeinfo->precision );
         add_assoc_long(return_value, "scale", (int) dbtypeinfo->scale );          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, "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);          add_assoc_string(return_value, "native_type", pdo_dblib_get_field_name(dbcoltype(H->link, colno+1)), 1);
           add_assoc_long(return_value, "native_type_id", dbcoltype(H->link, colno+1));
           add_assoc_long(return_value, "native_usertype_id", dbcolutype(H->link, colno+1));
   
         return 1;          return 1;
 }  }
Line 297  struct pdo_stmt_methods dblib_stmt_methods = { Line 326  struct pdo_stmt_methods dblib_stmt_methods = {
         NULL, /* get attr */          NULL, /* get attr */
         pdo_dblib_stmt_get_column_meta, /* meta */          pdo_dblib_stmt_get_column_meta, /* meta */
         pdo_dblib_stmt_next_rowset, /* nextrow */          pdo_dblib_stmt_next_rowset, /* nextrow */
        dblib_dblib_stmt_cursor_closer        pdo_dblib_stmt_cursor_closer
 };  };
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>