php-src/ext/pdo_dblib/dblib_stmt.c

301 lines
6.8 KiB
C
Raw Normal View History

/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2010 The PHP Group |
+----------------------------------------------------------------------+
2006-01-01 12:47:32 +00:00
| 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 |
| available through the world-wide-web at the following url: |
2006-01-01 12:47:32 +00:00
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Wez Furlong <wez@php.net> |
| Frank M. Kromann <frank@kromann.info> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "pdo/php_pdo.h"
#include "pdo/php_pdo_driver.h"
#include "php_pdo_dblib.h"
#include "php_pdo_dblib_int.h"
#include "zend_exceptions.h"
2010-06-21 06:54:10 +00:00
/* {{{ 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;
pdo_dblib_db_handle *H = S->H;
/* Cancel any pending results */
dbcancel(H->link);
efree(stmt->columns);
stmt->columns = NULL;
return 1;
}
static int pdo_dblib_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
dblib_dblib_stmt_cursor_closer(stmt TSRMLS_CC);
efree(S);
return 1;
}
static int pdo_dblib_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
RETCODE ret;
ret = dbresults(H->link);
if (ret == FAIL || ret == NO_MORE_RESULTS) {
return 0;
}
stmt->row_count = DBCOUNT(H->link);
stmt->column_count = dbnumcols(H->link);
return 1;
}
static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
RETCODE ret;
dbsetuserdata(H->link, (BYTE*) &S->err);
2005-01-18 02:42:52 +00:00
if (FAIL == dbcmd(H->link, stmt->active_query_string)) {
return 0;
}
if (FAIL == dbsqlexec(H->link)) {
return 0;
}
ret = pdo_dblib_stmt_next_rowset(stmt TSRMLS_CC);
if (ret == 0) {
return 0;
}
stmt->row_count = DBCOUNT(H->link);
stmt->column_count = dbnumcols(H->link);
return 1;
}
static int pdo_dblib_stmt_fetch(pdo_stmt_t *stmt,
enum pdo_fetch_orientation ori, long offset TSRMLS_DC)
{
RETCODE ret;
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
ret = dbnextrow(H->link);
if (ret == FAIL || ret == NO_MORE_ROWS) {
return 0;
}
return 1;
}
static int pdo_dblib_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
struct pdo_column_data *col = &stmt->columns[colno];
col->name = (char*)dbcolname(H->link, colno+1);
col->maxlen = dbcollen(H->link, colno+1);
col->namelen = strlen(col->name);
col->param_type = PDO_PARAM_STR;
return 1;
}
static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr,
2005-02-06 22:34:53 +00:00
unsigned long *len, int *caller_frees TSRMLS_DC)
{
pdo_dblib_stmt *S = (pdo_dblib_stmt*)stmt->driver_data;
pdo_dblib_db_handle *H = S->H;
int coltype;
unsigned int tmp_len;
char *tmp_ptr = NULL;
coltype = dbcoltype(H->link, colno+1);
*len = dbdatlen(H->link, colno+1);
*ptr = dbdata(H->link, colno+1);
if (*len == 0 && *ptr == NULL) {
return 1;
}
switch (coltype) {
case SQLCHAR:
case SQLTEXT:
case SQLVARBINARY:
case SQLBINARY:
case SQLIMAGE:
case SQLVARCHAR:
tmp_ptr = emalloc(*len + 1);
memcpy(tmp_ptr, *ptr, *len);
tmp_ptr[*len] = '\0';
*ptr = tmp_ptr;
++(*len);
break;
case SQLMONEY:
case SQLMONEY4:
case SQLMONEYN: {
DBFLT8 money_value;
2010-06-22 02:09:57 +00:00
dbconvert(NULL, coltype, *ptr, *len, SQLFLT8, (LPBYTE)&money_value, 8);
*len = spprintf(&tmp_ptr, 0, "%.4f", money_value);
*ptr = tmp_ptr;
break;
}
default:
if (dbwillconvert(coltype, SQLCHAR)) {
tmp_len = 32 + (2 * (*len));
tmp_ptr = emalloc(tmp_len);
2010-06-22 02:09:57 +00:00
*len = dbconvert(NULL, coltype, *ptr, *len, SQLCHAR, tmp_ptr, -1);
*ptr = tmp_ptr;
} else {
*len = 0;
*ptr = NULL;
}
}
*caller_frees = 1;
return 1;
}
static int pdo_dblib_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param,
enum pdo_param_event event_type TSRMLS_DC)
{
return 1;
}
2010-06-21 06:54:10 +00:00
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,
pdo_dblib_stmt_execute,
pdo_dblib_stmt_fetch,
pdo_dblib_stmt_describe,
pdo_dblib_stmt_get_col,
pdo_dblib_stmt_param_hook,
NULL, /* set attr */
NULL, /* get attr */
2010-06-21 06:54:10 +00:00
pdo_dblib_stmt_get_column_meta, /* meta */
pdo_dblib_stmt_next_rowset, /* nextrow */
2007-01-15 01:56:09 +00:00
dblib_dblib_stmt_cursor_closer
};