37static char *pdo_dblib_get_field_name(
int type)
48 case 31:
return "nvarchar";
49 case 34:
return "image";
50 case 35:
return "text";
51 case 36:
return "uniqueidentifier";
52 case 37:
return "varbinary";
53 case 38:
return "bigint";
54 case 39:
return "varchar";
55 case 40:
return "date";
56 case 41:
return "time";
57 case 42:
return "datetime2";
58 case 43:
return "datetimeoffset";
59 case 45:
return "binary";
60 case 47:
return "char";
61 case 48:
return "tinyint";
62 case 50:
return "bit";
63 case 52:
return "smallint";
64 case 55:
return "decimal";
65 case 56:
return "int";
66 case 58:
return "smalldatetime";
67 case 59:
return "real";
68 case 60:
return "money";
69 case 61:
return "datetime";
70 case 62:
return "float";
71 case 63:
return "numeric";
72 case 98:
return "sql_variant";
73 case 99:
return "ntext";
74 case 104:
return "bit";
75 case 106:
return "decimal";
76 case 108:
return "numeric";
77 case 122:
return "smallmoney";
78 case 127:
return "bigint";
79 case 165:
return "varbinary";
80 case 167:
return "varchar";
81 case 173:
return "binary";
82 case 175:
return "char";
83 case 189:
return "timestamp";
84 case 231:
return "nvarchar";
85 case 239:
return "nchar";
86 case 240:
return "geometry";
87 case 241:
return "xml";
88 default:
return "unknown";
93static int pdo_dblib_stmt_cursor_closer(
pdo_stmt_t *stmt)
106static int pdo_dblib_stmt_dtor(
pdo_stmt_t *stmt)
117static int pdo_dblib_stmt_next_rowset_no_cancel(
pdo_stmt_t *stmt)
125 ret = dbresults(
H->link);
126 num_fields = dbnumcols(
H->link);
127 }
while (
H->skip_empty_rowsets && num_fields <= 0 &&
ret == SUCCEED);
135 if (NO_MORE_RESULTS ==
ret) {
139 if (
H->skip_empty_rowsets && num_fields <= 0) {
143 stmt->row_count = DBCOUNT(
H->link);
144 stmt->column_count = num_fields;
149static int pdo_dblib_stmt_next_rowset(
pdo_stmt_t *stmt)
158 while (NO_MORE_ROWS !=
ret) {
159 ret = dbnextrow(
H->link);
167 return pdo_dblib_stmt_next_rowset_no_cancel(stmt);
170static int pdo_dblib_stmt_execute(
pdo_stmt_t *stmt)
175 dbsetuserdata(
H->link, (BYTE*) &
S->err);
177 pdo_dblib_stmt_cursor_closer(stmt);
179 if (
FAIL == dbcmd(
H->link,
ZSTR_VAL(stmt->active_query_string))) {
183 if (
FAIL == dbsqlexec(
H->link)) {
187 pdo_dblib_stmt_next_rowset_no_cancel(stmt);
189 stmt->row_count = DBCOUNT(
H->link);
190 stmt->column_count = dbnumcols(
H->link);
195static int pdo_dblib_stmt_fetch(
pdo_stmt_t *stmt,
204 ret = dbnextrow(
H->link);
211 if(NO_MORE_ROWS ==
ret) {
218static int pdo_dblib_stmt_describe(
pdo_stmt_t *stmt,
int colno)
225 if(colno >= stmt->column_count || colno < 0) {
230 S->computed_column_name_count = 0;
233 col = &stmt->columns[colno];
234 fname = (
char*)dbcolname(
H->link, colno+1);
236 if (fname && *fname) {
237 col->
name = zend_string_init(fname,
strlen(fname), 0);
239 if (
S->computed_column_name_count > 0) {
249 S->computed_column_name_count++;
252 col->
maxlen = dbcollen(
H->link, colno+1);
257static int pdo_dblib_stmt_should_stringify_col(
pdo_stmt_t *stmt,
int coltype)
274 if (stmt->dbh->stringify) {
280 if (stmt->dbh->stringify) {
286 if (
sizeof(
zend_long) <
sizeof(DBBIGINT)) {
296 if (
H->datetime_convert) {
305static void pdo_dblib_stmt_stringify_col(
int coltype,
LPBYTE data, DBINT data_len,
zval *
zv)
310 DBINT tmp_data_len = 32 + (2 * (data_len));
322 tmp_data =
emalloc(tmp_data_len);
330 while (data_len > 0 && tmp_data[data_len - 1] ==
' ') {
351 DBINT data_len, tmp_data_len;
353 coltype = dbcoltype(
H->link, colno+1);
354 data = dbdata(
H->link, colno+1);
355 data_len = dbdatlen(
H->link, colno+1);
357 if (data_len != 0 ||
data !=
NULL) {
358 if (pdo_dblib_stmt_should_stringify_col(stmt, coltype) && dbwillconvert(coltype,
SQLCHAR)) {
359 pdo_dblib_stmt_stringify_col(coltype,
data, data_len,
zv);
366 while (data_len>0 &&
data[data_len-1] ==
' ') {
388 dbdatecrack(
H->link, &di, (DBDATETIME *) &dt);
390 dl =
spprintf(&tmp_data, 20,
"%04d-%02d-%02d %02d:%02d:%02d",
392 di.year, di.month, di.day, di.hour, di.minute, di.second
394 di.dateyear, di.datemonth+1, di.datedmonth, di.datehour, di.dateminute, di.datesecond
435 if (
H->stringify_uniqueidentifier) {
451 if (dbwillconvert(coltype,
SQLCHAR)) {
452 pdo_dblib_stmt_stringify_col(coltype,
data, data_len,
zv);
468 DBTYPEINFO* dbtypeinfo;
471 if(colno >= stmt->column_count || colno < 0) {
477 dbtypeinfo = dbcoltypeinfo(
H->link, colno+1);
479 if(!dbtypeinfo)
return FAILURE;
481 coltype = dbcoltype(
H->link, colno+1);
483 add_assoc_long(
return_value,
"max_length", dbcollen(
H->link, colno+1) );
484 add_assoc_long(
return_value,
"precision", (
int) dbtypeinfo->precision );
485 add_assoc_long(
return_value,
"scale", (
int) dbtypeinfo->scale );
486 add_assoc_string(
return_value,
"column_source", dbcolsource(
H->link, colno+1));
487 add_assoc_string(
return_value,
"native_type", pdo_dblib_get_field_name(coltype));
488 add_assoc_long(
return_value,
"native_type_id", coltype);
489 add_assoc_long(
return_value,
"native_usertype_id", dbcolutype(
H->link, colno+1));
509 pdo_dblib_stmt_execute,
510 pdo_dblib_stmt_fetch,
511 pdo_dblib_stmt_describe,
512 pdo_dblib_stmt_get_col,
516 pdo_dblib_stmt_get_column_meta,
517 pdo_dblib_stmt_next_rowset,
518 pdo_dblib_stmt_cursor_closer
const struct pdo_stmt_methods dblib_stmt_methods
dl(string $extension_filename)
zend_ffi_ctype_name_buf buf
void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, pdo_error_type sqlstate, const char *supp)
void pdo_dblib_err_dtor(pdo_dblib_err *err)
struct _pdo_stmt_t pdo_stmt_t
#define ZVAL_STRINGL(z, s, l)
#define ZVAL_EMPTY_STRING(z)
#define safe_emalloc(nmemb, size, offset)
defined(string $constant_name)
ZEND_API void ZEND_FASTCALL zend_str_toupper(char *str, size_t length)
#define ZSTR_INIT_LITERAL(s, persistent)
#define ZVAL_DOUBLE(z, d)