35static int pdo_odbc_sqltype_is_unicode(
pdo_odbc_stmt *
S, SQLSMALLINT sqltype)
37 if (!
S->assume_utf8)
return 0;
43#ifdef SQL_WLONGVARCHAR
56static int pdo_odbc_utf82ucs2(
pdo_stmt_t *stmt,
int is_unicode,
const char *
buf,
60 if (is_unicode && buflen) {
72 if (
S->convbufsize <=
ret) {
73 S->convbufsize =
ret +
sizeof(WCHAR);
77 ret = MultiByteToWideChar(
CP_UTF8, 0,
buf, buflen, (LPWSTR)
S->convbuf,
S->convbufsize /
sizeof(WCHAR));
111 zval_ptr_dtor_str(
result);
124 for (i = 0; i <
S->col_count; i++) {
125 if (
S->cols[i].data) {
143 if (
S->stmt != SQL_NULL_HANDLE && server_obj_usable) {
145 SQLCloseCursor(
S->stmt);
147 SQLFreeHandle(SQL_HANDLE_STMT,
S->stmt);
148 S->stmt = SQL_NULL_HANDLE;
165 SQLLEN row_count = -1;
168 SQLCloseCursor(
S->stmt);
171 rc = SQLExecute(
S->stmt);
173 while (rc == SQL_NEED_DATA) {
176 rc = SQLParamData(
S->stmt, (SQLPOINTER*)¶m);
177 if (rc == SQL_NEED_DATA) {
194 switch (pdo_odbc_utf82ucs2(
stmt,
P->is_unicode,
201 if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) {
206 rc1 = SQLPutData(
S->stmt,
S->convbuf, ulen);
207 if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) {
213 SQLCloseCursor(
S->stmt);
229 SQLCloseCursor(
S->stmt);
246 rc1 = SQLPutData(
S->stmt,
buf,
len);
247 if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) {
261 case SQL_NO_DATA_FOUND:
262 case SQL_SUCCESS_WITH_INFO:
271 SQLRowCount(
S->stmt, &row_count);
274 if (
S->cols ==
NULL) {
276 SQLSMALLINT colcount;
279 SQLNumResultCols(
S->stmt, &colcount);
294 SQLSMALLINT sqltype = 0,
ctype = 0, scale = 0, nullable = 0;
295 SQLULEN precision = 0;
302 switch (event_type) {
330 rc = SQLDescribeParam(
S->stmt, (SQLUSMALLINT) param->
paramno+1, &sqltype, &precision, &scale, &nullable);
331 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
353 ctype = SQL_C_BINARY;
364 P->is_unicode = pdo_odbc_sqltype_is_unicode(
S, sqltype);
367 ctype = SQL_C_BINARY;
371 P->paramtype = SQL_PARAM_INPUT_OUTPUT;
373 P->paramtype = SQL_PARAM_INPUT;
375 P->paramtype = SQL_PARAM_OUTPUT;
378 if (
P->paramtype != SQL_PARAM_INPUT) {
385 P->outbuf =
emalloc(
P->len + (
P->is_unicode ? 2:1));
394 rc = SQLBindParameter(
S->stmt, (SQLUSMALLINT) param->
paramno+1,
395 P->paramtype,
ctype, sqltype, precision, scale,
396 P->paramtype == SQL_PARAM_INPUT ?
403 if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
432 char *
ptr =
P->outbuf;
433 char *
end =
P->outbuf +
P->len;
452 P->len = SQL_LEN_DATA_AT_EXEC(sb.
sb.st_size);
458 P->len = SQL_LEN_DATA_AT_EXEC(0);
471 P->len = SQL_NULL_DATA;
476 switch (pdo_odbc_utf82ucs2(
stmt,
P->is_unicode,
545 rc = SQLFetchScroll(
S->stmt, odbcori,
offset);
547 if (rc == SQL_SUCCESS) {
550 if (rc == SQL_SUCCESS_WITH_INFO) {
555 if (rc == SQL_NO_DATA) {
570 SQLSMALLINT colnamelen;
572 SQLLEN displaysize = 0;
574 rc = SQLDescribeCol(
S->stmt, colno+1, (
SQLCHAR *)
S->cols[colno].colname,
575 sizeof(
S->cols[colno].colname)-1, &colnamelen,
576 &
S->cols[colno].coltype, &colsize,
NULL,
NULL);
596 if (rc != SQL_SUCCESS) {
598 if (rc != SQL_SUCCESS_WITH_INFO) {
603 rc = SQLColAttribute(
S->stmt, colno+1,
604 SQL_DESC_DISPLAY_SIZE,
607 if (rc != SQL_SUCCESS) {
609 if (rc != SQL_SUCCESS_WITH_INFO) {
613 colsize = displaysize;
615 col->
maxlen =
S->cols[colno].datalen = colsize;
616 col->
name = zend_string_init(
S->cols[colno].colname, colnamelen, 0);
617 S->cols[colno].is_unicode = pdo_odbc_sqltype_is_unicode(
S,
S->cols[colno].coltype);
622 if (colsize < 256 && !S->going_long) {
623 S->cols[colno].data =
emalloc(colsize+1);
624 S->cols[colno].is_long = 0;
626 rc = SQLBindCol(
S->stmt, colno+1,
627 S->cols[colno].is_unicode ? SQL_C_BINARY : SQL_C_CHAR,
629 S->cols[colno].datalen+1, &
S->cols[colno].fetched_len);
631 if (rc != SQL_SUCCESS) {
640 S->cols[colno].is_long = 1;
660 SQLLEN orig_fetched_len = SQL_NULL_DATA;
667 rc = SQLGetData(
S->stmt, colno+1,
C->is_unicode ? SQL_C_BINARY : SQL_C_CHAR,
C->data,
668 256, &
C->fetched_len);
669 orig_fetched_len =
C->fetched_len;
671 if (rc == SQL_SUCCESS &&
C->fetched_len < 256) {
677 if (rc == SQL_SUCCESS_WITH_INFO || rc == SQL_SUCCESS) {
694 rc = SQLGetData(
S->stmt, colno+1,
C->is_unicode ? SQL_C_BINARY : SQL_C_CHAR, buf2, 256, &
C->fetched_len);
697 if (orig_fetched_len >= 0 &&
C->fetched_len >= 0) {
698 SQLLEN fixed_used = orig_fetched_len -
C->fetched_len;
699 if (fixed_used <= used + 1) {
705 if (rc==SQL_SUCCESS_WITH_INFO || (rc==SQL_SUCCESS &&
C->fetched_len > 255)) {
709 str = zend_string_realloc(str, used + 256, 0);
712 }
else if (rc==SQL_SUCCESS) {
713 str = zend_string_realloc(str, used +
C->fetched_len, 0);
715 used = used +
C->fetched_len;
740 if (
C->fetched_len == SQL_NULL_DATA) {
744 }
else if (
C->fetched_len >= 0) {
758 switch (pdo_odbc_ucs22utf8(stmt,
C->is_unicode,
result)) {
780 if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
790 strcpy(
S->einfo.last_err_msg,
"Unknown Attribute");
791 S->einfo.what =
"setAttribute";
792 strcpy(
S->einfo.last_state,
"IM001");
809 if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
822 strcpy(
S->einfo.last_err_msg,
"Unknown Attribute");
823 S->einfo.what =
"getAttribute";
824 strcpy(
S->einfo.last_state,
"IM001");
829static int odbc_stmt_next_rowset(
pdo_stmt_t *stmt)
832 SQLSMALLINT colcount;
838 rc = SQLMoreResults(
S->stmt);
840 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
846 SQLNumResultCols(
S->stmt, &colcount);
854static int odbc_stmt_close_cursor(
pdo_stmt_t *stmt)
859 rc = SQLCloseCursor(
S->stmt);
860 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
872 odbc_stmt_param_hook,
875 odbc_stmt_get_column_meta,
876 odbc_stmt_next_rowset,
877 odbc_stmt_close_cursor
zend_ffi_ctype_name_buf buf
const struct pdo_stmt_methods odbc_stmt_methods
@ PDO_ODBC_CONV_NOT_REQUIRED
unsigned const char * end
struct _pdo_stmt_t pdo_stmt_t
@ PDO_PARAM_EVT_FETCH_POST
@ PDO_PARAM_EVT_NORMALIZE
@ PDO_PARAM_EVT_FETCH_PRE
@ PDO_PARAM_EVT_EXEC_POST
#define PDO_PARAM_TYPE(x)
@ PDO_ODBC_ATTR_ASSUME_UTF8
#define pdo_odbc_stmt_error(what)
struct _php_stream php_stream
#define php_stream_read(stream, buf, count)
#define php_stream_stat(stream, ssb)
#define php_stream_from_zval_no_verify(xstr, pzval)
struct _php_stream_statbuf php_stream_statbuf
pdo_error_type error_code
struct pdo_column_data * columns
zval database_object_handle
enum pdo_param_type param_type
#define ZVAL_STRINGL(z, s, l)
#define ZVAL_STRINGL_FAST(z, s, l)
#define ecalloc(nmemb, size)
#define erealloc(ptr, size)
struct _zend_string zend_string
#define convert_to_string(op)
#define Z_STRVAL_P(zval_p)
#define IS_OBJ_FREE_CALLED
#define Z_STRLEN_P(zval_p)
#define Z_OBJ_HANDLE(zval)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)