44#define PHP_ODBC_BINMODE_PASSTHRU 0
45#define PHP_ODBC_BINMODE_RETURN 1
46#define PHP_ODBC_BINMODE_CONVERT 2
50#define CHECK_ODBC_CONNECTION(conn) \
52 zend_throw_error(NULL, "ODBC connection has already been closed"); \
56#define CHECK_ODBC_RESULT(result) \
57 if (result->conn_ptr == NULL) { \
58 zend_throw_error(NULL, "ODBC result has already been closed"); \
63static void safe_odbc_disconnect(
void *
handle);
64static void close_results_with_connection(odbc_connection *conn);
72#define Z_ODBC_LINK_P(zv) odbc_link_from_obj(Z_OBJ_P(zv))
73#define Z_ODBC_CONNECTION_P(zv) Z_ODBC_LINK_P(zv)->connection
74#define Z_ODBC_RESULT_P(zv) odbc_result_from_obj(Z_OBJ_P(zv))
76static void odbc_insert_new_result(odbc_connection *connection,
zval *
result)
85 res->index = connection->results.nNextFreeElement;
90static inline odbc_link *odbc_link_from_obj(
zend_object *obj)
92 return (odbc_link *)((
char *)(obj) -
XtOffsetOf(odbc_link, std));
95static int _close_pconn_with_res(
zval *
zv,
void *
p)
106static int _close_pconn(
zval *
zv)
109 if (le->
type == le_pconn) {
117static void safe_odbc_disconnect(
void *
handle )
121 if (
ret == SQL_ERROR )
128static void free_connection(odbc_connection *conn,
bool persistent)
132 safe_odbc_disconnect(conn->hdbc);
133 SQLFreeConnect(conn->hdbc);
134 SQLFreeEnv(conn->henv);
146 ODBCG(num_persistent)--;
150static void odbc_link_free(odbc_link *
link)
154 close_results_with_connection(
link->connection);
156 if (!
link->persistent) {
157 free_connection(
link->connection,
link->persistent);
171 odbc_link *intern = zend_object_alloc(
sizeof(odbc_link), class_type);
181 zend_throw_error(
NULL,
"Cannot directly construct Odbc\\Connection, use odbc_connect() or odbc_pconnect() instead");
196static void odbc_connection_free_obj(
zend_object *obj)
198 odbc_link *
link = odbc_link_from_obj(obj);
200 if (
link->connection) {
201 odbc_link_free(
link);
224 zend_throw_error(
NULL,
"Cannot directly construct Odbc\\Result, use an appropriate odbc_* function instead");
244 for (
int i = 0; i <
res->numcols; i++) {
245 if (
res->values[i].value) {
256#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30) || defined(HAVE_SOLID_35)
257 SQLTransact(
res->conn_ptr->henv,
res->conn_ptr->hdbc,
258 (SQLUSMALLINT) SQL_COMMIT);
260 SQLFreeStmt(
res->stmt,SQL_DROP);
266 if (
res->param_info) {
288#define SAFE_SQL_NTS(n) ((SQLSMALLINT) ((n)?(SQL_NTS):0))
313#ifdef COMPILE_DL_ODBC
320static void close_results_with_connection(odbc_connection *conn)
337 odbc_connection *conn = (odbc_connection *)rsrc->
ptr;
339 close_results_with_connection(conn);
340 free_connection(conn,
true);
353 }
else if (ini_entry->value) {
360 if (atoi(
value) == -1) {
376 }
else if (ini_entry->value) {
383 switch(atoi(
value)) {
388 PUTS(
"return as is");
391 PUTS(
"return as char");
405 }
else if (ini_entry->value) {
412 if (atoi(
value) <= 0) {
429 }
else if (ini_entry->value) {
436 switch (atoi (
value))
439 PUTS (
"Forward Only cursor");
443 PUTS (
"Static cursor");
447 PUTS (
"Keyset driven cursor");
451 PUTS (
"Dynamic cursor");
468 max_persistent, zend_odbc_globals, odbc_globals, display_link_nums)
470 max_links, zend_odbc_globals, odbc_globals, display_link_nums)
472 defaultlrl, zend_odbc_globals, odbc_globals, display_lrl)
474 defaultbinmode, zend_odbc_globals, odbc_globals, display_binmode)
476 check_persistent, zend_odbc_globals, odbc_globals)
478 default_cursortype, zend_odbc_globals, odbc_globals, display_cursortype)
484#if defined(COMPILE_DL_ODBC) && defined(ZTS)
487 odbc_globals->num_persistent = 0;
501 ODBC_SQL_CONN_T foobar;
509 register_odbc_symbols(module_number);
511 odbc_connection_ce = register_class_Odbc_Connection();
512 odbc_connection_ce->
create_object = odbc_connection_create_object;
517 odbc_connection_object_handlers.
free_obj = odbc_connection_free_obj;
518 odbc_connection_object_handlers.
get_constructor = odbc_connection_get_constructor;
520 odbc_connection_object_handlers.
cast_object = odbc_connection_cast_object;
523 odbc_result_ce = register_class_Odbc_Result();
529 odbc_result_object_handlers.
free_obj = odbc_result_free_obj;
530 odbc_result_object_handlers.
get_constructor = odbc_result_get_constructor;
532 odbc_result_object_handlers.
cast_object = odbc_result_cast_object;
535#if defined(HAVE_IBMDB2) && defined(_AIX)
538 putenv(
"DB2NOEXITLIST=TRUE");
549 ODBCG(
num_links) = ODBCG(num_persistent);
550 memset(ODBCG(laststate),
'\0', 6);
551 memset(ODBCG(lasterrormsg),
'\0', SQL_MAX_MESSAGE_LENGTH);
600void odbc_sql_error(ODBC_SQL_ERROR_PARAMS)
603 SQLSMALLINT errormsgsize;
606 ODBC_SQL_CONN_T conn;
609 henv = conn_resource->henv;
610 conn = conn_resource->hdbc;
612 henv = SQL_NULL_HENV;
613 conn = SQL_NULL_HDBC;
621 rc = SQLError(henv, conn, stmt, (
SQLCHAR *) ODBCG(laststate), &
error, (
SQLCHAR *) ODBCG(lasterrormsg),
sizeof(ODBCG(lasterrormsg))-1, &errormsgsize);
622 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
623 snprintf(ODBCG(laststate),
sizeof(ODBCG(laststate)),
"HY000");
624 snprintf(ODBCG(lasterrormsg),
sizeof(ODBCG(lasterrormsg)),
"Failed to fetch error message");
627 memcpy(conn_resource->laststate, ODBCG(laststate),
sizeof(ODBCG(laststate)));
628 memcpy(conn_resource->lasterrormsg, ODBCG(lasterrormsg),
sizeof(ODBCG(lasterrormsg)));
653 result = Z_ODBC_RESULT_P(pv_res);
654 CHECK_ODBC_RESULT(
result);
657 result->longreadlen = flag;
671 SQLSMALLINT colnamelen;
673 SQLUSMALLINT colfieldid;
678 result->longreadlen = ODBCG(defaultlrl);
679 result->binmode = ODBCG(defaultbinmode);
681 for(i = 0; i <
result->numcols; i++) {
683 colfieldid = SQL_COLUMN_DISPLAY_SIZE;
685 rc = PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)(i+1), PHP_ODBC_SQL_DESC_NAME,
686 result->values[i].name,
sizeof(
result->values[i].name), &colnamelen, 0);
687 result->values[i].coltype = 0;
688 rc = PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_TYPE,
695 switch(
result->values[i].coltype) {
700#if defined(ODBCVER) && (ODBCVER >= 0x0300)
709 SQLBindCol(
result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR,
result->values[i].value,
710 27, &
result->values[i].vallen);
715#if defined(ODBCVER) && (ODBCVER >= 0x0300)
718 colfieldid = SQL_DESC_OCTET_LENGTH;
725 rc = PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)(i+1), colfieldid,
727 if (rc != SQL_SUCCESS) {
730#if defined(ODBCVER) && (ODBCVER >= 0x0300)
731 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && colfieldid == SQL_DESC_OCTET_LENGTH) {
736 memset(errtxt,
'\0', 128);
739 if (SQL_SUCCESS == SQLGetDiagRec(SQL_HANDLE_STMT,
result->stmt, 1,
state, &
err, errtxt, 128,
NULL)) {
747 rc = SQLColAttributes(
result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
749 if (rc != SQL_SUCCESS) {
773 if (charextraalloc) {
778 rc = SQLBindCol(
result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR,
result->values[i].value,
779 displaysize + 1, &
result->values[i].vallen);
796 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
797 CHECK_ODBC_CONNECTION(conn);
799 rc = SQLTransact(conn->henv, conn->hdbc, (SQLUSMALLINT)((
type)?SQL_COMMIT:SQL_ROLLBACK));
800 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
801 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLTransact");
813#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30)
831 result = Z_ODBC_RESULT_P(pv_res);
832 CHECK_ODBC_RESULT(
result);
839 if (
result->numcols == 0) {
844 if (pv_num >
result->numcols) {
849 PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)pv_num, (SQLUSMALLINT) (
type?SQL_COLUMN_SCALE:SQL_COLUMN_PRECISION),
NULL, 0,
NULL, &
len);
868 odbc_link *
link = Z_ODBC_LINK_P(
zv);
869 if (
link->connection) {
870 odbc_link_free(
link);
903#ifdef HAVE_SQL_EXTENDED_FETCH
904 SQLUINTEGER scrollopts;
911 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
912 CHECK_ODBC_CONNECTION(conn);
920 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
921 if (rc == SQL_INVALID_HANDLE) {
927 if (rc == SQL_ERROR) {
928 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
933#ifdef HAVE_SQL_EXTENDED_FETCH
936 rc = SQLGetInfo(conn->hdbc, SQL_FETCH_DIRECTION, (
void *) &scrollopts,
sizeof(scrollopts),
NULL);
937 if (rc == SQL_SUCCESS) {
938 if ((
result->fetch_abs = (scrollopts & SQL_FD_FETCH_ABSOLUTE))) {
953 case SQL_SUCCESS_WITH_INFO:
954 odbc_sql_error(conn,
result->stmt,
"SQLPrepare");
957 odbc_sql_error(conn,
result->stmt,
"SQLPrepare");
965 if (
result->numcols > 0) {
974 for (i=0;i<
result->numparams;i++) {
975 rc = SQLDescribeParam(
result->stmt, (SQLUSMALLINT)(i+1), &
result->param_info[i].sqltype, &
result->param_info[i].precision,
976 &
result->param_info[i].scale, &
result->param_info[i].nullable);
977 if (rc == SQL_ERROR) {
978 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLDescribeParameter");
979 SQLFreeStmt(
result->stmt, SQL_RESET_PARAMS);
994typedef struct odbc_params_t {
1001 SQLFreeStmt(
result->stmt, SQL_RESET_PARAMS);
1002 for (
int i = 0; i <
result->numparams; i++) {
1003 if (params[i].fp != -1) {
1004 close(params[i].fp);
1006 if (params[i].zstr) {
1007 zend_string_release(params[i].zstr);
1018 odbc_params_t *params =
NULL;
1029 result = Z_ODBC_RESULT_P(pv_res);
1030 CHECK_ODBC_RESULT(
result);
1032 if (
result->numparams > 0) {
1033 if ((ne = zend_hash_num_elements(pv_param_ht)) <
result->numparams) {
1039 for(i = 0; i <
result->numparams; i++) {
1041 params[i].zstr =
NULL;
1046 unsigned char otype =
Z_TYPE_P(tmp);
1049 odbc_release_params(
result, params);
1053 params[i-1].vallen =
ZSTR_LEN(tmpstr);
1054 params[i-1].fp = -1;
1055 params[i-1].zstr = tmpstr;
1057 if (IS_SQL_BINARY(
result->param_info[i-1].sqltype)) {
1058 ctype = SQL_C_BINARY;
1068 odbc_release_params(
result, params);
1072 filename[
strlen(filename)] =
'\0';
1077 odbc_release_params(
result, params);
1081 if ((params[i-1].fp = open(filename,O_RDONLY)) == -1) {
1083 odbc_release_params(
result, params);
1090 params[i-1].vallen = SQL_LEN_DATA_AT_EXEC(0);
1092 rc = SQLBindParameter(
result->stmt, (SQLUSMALLINT)i, SQL_PARAM_INPUT,
1094 (
void *)(intptr_t)params[i-1].fp, 0,
1095 ¶ms[i-1].vallen);
1098 precision = params[i-1].vallen;
1101 params[i-1].vallen = SQL_NULL_DATA;
1104 rc = SQLBindParameter(
result->stmt, (SQLUSMALLINT)i, SQL_PARAM_INPUT,
1107 ¶ms[i-1].vallen);
1109 if (rc == SQL_ERROR) {
1110 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLBindParameter");
1111 odbc_release_params(
result, params);
1114 if (++i >
result->numparams)
break;
1118 rc = SQLFreeStmt(
result->stmt, SQL_CLOSE);
1120 if (rc == SQL_ERROR) {
1121 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLFreeStmt");
1125 rc = SQLExecute(
result->stmt);
1127 case SQL_NEED_DATA: {
1130 while (rc == SQL_NEED_DATA) {
1131 rc = SQLParamData(
result->stmt, (
void*)&fp);
1132 if (rc == SQL_NEED_DATA) {
1133 while ((nbytes = read(fp, &
buf, 4096)) > 0) {
1134 SQLPutData(
result->stmt, (
void*)&
buf, nbytes);
1142 case SQL_NO_DATA_FOUND:
1143 case SQL_SUCCESS_WITH_INFO:
1144 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExecute");
1147 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExecute");
1151 if (
result->numparams > 0) {
1152 odbc_release_params(
result, params);
1155 if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO || rc == SQL_NO_DATA_FOUND) {
1159 if (
result->numcols == 0) {
1162 if (
result->numcols > 0) {
1175 SQLUSMALLINT max_len;
1185 result = Z_ODBC_RESULT_P(pv_res);
1186 CHECK_ODBC_RESULT(
result);
1188 rc = SQLGetInfo(
result->conn_ptr->hdbc,SQL_MAX_CURSOR_NAME_LEN, (
void *)&max_len,
sizeof(max_len),&
len);
1189 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1194 cursorname =
emalloc(max_len + 1);
1195 rc = SQLGetCursorName(
result->stmt, (
SQLCHAR *) cursorname, (SQLSMALLINT)max_len, &
len);
1196 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1199 char errormsg[SQL_MAX_MESSAGE_LENGTH];
1200 SQLSMALLINT errormsgsize;
1202 SQLError(
result->conn_ptr->henv,
result->conn_ptr->hdbc,
1204 sizeof(errormsg)-1, &errormsgsize);
1207 if (SQLSetCursorName(
result->stmt, (
SQLCHAR *) cursorname, SQL_NTS) != SQL_SUCCESS) {
1208 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLSetCursorName");
1227#ifdef HAVE_SQLDATASOURCES
1234 UCHAR server_name[100], desc[200];
1235 SQLSMALLINT len1=0, len2=0, fetch_type;
1241 fetch_type = (SQLSMALLINT) zv_fetch_type;
1248 odbc_connection *conn = Z_ODBC_CONNECTION_P(zv_conn);
1249 CHECK_ODBC_CONNECTION(conn);
1252 rc = SQLDataSources(conn->henv,
1255 (SQLSMALLINT)
sizeof(server_name),
1258 (SQLSMALLINT)
sizeof(desc),
1261 if (SQL_NO_DATA == rc) {
1265 }
else if (rc != SQL_SUCCESS) {
1267 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLDataSources");
1271 if (len1 == 0 || len2 == 0) {
1294#ifdef HAVE_SQL_EXTENDED_FETCH
1295 SQLUINTEGER scrollopts;
1302 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
1303 CHECK_ODBC_CONNECTION(conn);
1308 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
1309 if (rc == SQL_INVALID_HANDLE) {
1315 if (rc == SQL_ERROR) {
1316 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
1321#ifdef HAVE_SQL_EXTENDED_FETCH
1324 rc = SQLGetInfo(conn->hdbc, SQL_FETCH_DIRECTION, (
void *) &scrollopts,
sizeof(scrollopts),
NULL);
1325 if (rc == SQL_SUCCESS) {
1326 if ((
result->fetch_abs = (scrollopts & SQL_FD_FETCH_ABSOLUTE))) {
1337 rc = SQLExecDirect(
result->stmt, (
SQLCHAR *) query, SQL_NTS);
1338 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA_FOUND) {
1342 odbc_sql_error(conn,
result->stmt,
"SQLExecDirect");
1343 SQLFreeStmt(
result->stmt, SQL_DROP);
1351 if (
result->numcols > 0) {
1363#ifdef PHP_ODBC_HAVE_FETCH_HASH
1365#define ODBC_OBJECT 2
1373 SQLSMALLINT sql_c_type;
1376 bool pv_row_is_null =
true;
1378#ifdef HAVE_SQL_EXTENDED_FETCH
1380 SQLUSMALLINT RowStatus[1];
1387 result = Z_ODBC_RESULT_P(pv_res);
1388 CHECK_ODBC_RESULT(
result);
1392#ifndef HAVE_SQL_EXTENDED_FETCH
1393 if (!pv_row_is_null && pv_row > 0) {
1398 if (
result->numcols == 0) {
1403#ifdef HAVE_SQL_EXTENDED_FETCH
1405 if (!pv_row_is_null && pv_row > 0) {
1406 rc = SQLExtendedFetch(
result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
1412 rc = SQLFetch(
result->stmt);
1414 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1415 if (rc == SQL_ERROR) {
1416#ifdef HAVE_SQL_EXTENDED_FETCH
1417 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExtendedFetch");
1419 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLFetch");
1427#ifdef HAVE_SQL_EXTENDED_FETCH
1428 if (!pv_row_is_null && pv_row > 0 &&
result->fetch_abs)
1429 result->fetched = (SQLLEN)pv_row;
1434 for(i = 0; i <
result->numcols; i++) {
1435 sql_c_type = SQL_C_CHAR;
1437 switch(
result->values[i].coltype) {
1441 if (
result->binmode <= 0) {
1445 if (
result->binmode == 1) {
1446 sql_c_type = SQL_C_BINARY;
1450#if defined(ODBCVER) && (ODBCVER >= 0x0300)
1453 if (IS_SQL_LONG(
result->values[i].coltype) &&
result->longreadlen <= 0) {
1461 rc = SQLGetData(
result->stmt, (SQLUSMALLINT)(i + 1), sql_c_type,
buf,
result->longreadlen + 1, &
result->values[i].vallen);
1463 if (rc == SQL_ERROR) {
1464 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLGetData");
1469 if (rc == SQL_SUCCESS_WITH_INFO) {
1471 }
else if (rc != SQL_SUCCESS) {
1474 }
else if (
result->values[i].vallen == SQL_NULL_DATA) {
1477 }
else if (
result->values[i].vallen == SQL_NO_TOTAL) {
1486 if (
result->values[i].vallen == SQL_NULL_DATA) {
1489 }
else if (
result->values[i].vallen == SQL_NO_TOTAL) {
1498 if (result_type & ODBC_NUM) {
1539 SQLSMALLINT sql_c_type;
1541 zval *pv_res, *pv_res_arr, tmp;
1543 bool pv_row_is_null =
true;
1544#ifdef HAVE_SQL_EXTENDED_FETCH
1546 SQLUSMALLINT RowStatus[1];
1553 result = Z_ODBC_RESULT_P(pv_res);
1554 CHECK_ODBC_RESULT(
result);
1558#ifndef HAVE_SQL_EXTENDED_FETCH
1559 if (!pv_row_is_null && pv_row > 0) {
1564 if (
result->numcols == 0) {
1569 pv_res_arr = zend_try_array_init(pv_res_arr);
1574#ifdef HAVE_SQL_EXTENDED_FETCH
1576 if (!pv_row_is_null && pv_row > 0) {
1577 rc = SQLExtendedFetch(
result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
1583 rc = SQLFetch(
result->stmt);
1585 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1586 if (rc == SQL_ERROR) {
1587#ifdef HAVE_SQL_EXTENDED_FETCH
1588 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExtendedFetch");
1590 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLFetch");
1596#ifdef HAVE_SQL_EXTENDED_FETCH
1597 if (!pv_row_is_null && pv_row > 0 &&
result->fetch_abs)
1598 result->fetched = (SQLLEN)pv_row;
1603 for(i = 0; i <
result->numcols; i++) {
1604 sql_c_type = SQL_C_CHAR;
1606 switch(
result->values[i].coltype) {
1610 if (
result->binmode <= 0) {
1614 if (
result->binmode == 1) sql_c_type = SQL_C_BINARY;
1619#if defined(ODBCVER) && (ODBCVER >= 0x0300)
1622 if (IS_SQL_LONG(
result->values[i].coltype) &&
result->longreadlen <= 0) {
1630 rc = SQLGetData(
result->stmt, (SQLUSMALLINT)(i + 1),sql_c_type,
buf,
result->longreadlen + 1, &
result->values[i].vallen);
1632 if (rc == SQL_ERROR) {
1633 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLGetData");
1637 if (rc == SQL_SUCCESS_WITH_INFO) {
1639 }
else if (rc != SQL_SUCCESS) {
1642 }
else if (
result->values[i].vallen == SQL_NULL_DATA) {
1645 }
else if (
result->values[i].vallen == SQL_NO_TOTAL) {
1654 if (
result->values[i].vallen == SQL_NULL_DATA) {
1657 }
else if (
result->values[i].vallen == SQL_NO_TOTAL) {
1679 bool pv_row_is_null =
true;
1680#ifdef HAVE_SQL_EXTENDED_FETCH
1682 SQLUSMALLINT RowStatus[1];
1689 result = Z_ODBC_RESULT_P(pv_res);
1690 CHECK_ODBC_RESULT(
result);
1692#ifndef HAVE_SQL_EXTENDED_FETCH
1693 if (!pv_row_is_null) {
1697 if (!pv_row_is_null && pv_row < 1) {
1703 if (
result->numcols == 0) {
1708#ifdef HAVE_SQL_EXTENDED_FETCH
1710 if (!pv_row_is_null) {
1711 rc = SQLExtendedFetch(
result->stmt,SQL_FETCH_ABSOLUTE,(SQLLEN)pv_row,&crow,RowStatus);
1717 rc = SQLFetch(
result->stmt);
1719 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1720 if (rc == SQL_ERROR) {
1721#ifdef HAVE_SQL_EXTENDED_FETCH
1722 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExtendedFetch");
1724 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLFetch");
1730#ifdef HAVE_SQL_EXTENDED_FETCH
1731 if (!pv_row_is_null) {
1732 result->fetched = (SQLLEN)pv_row;
1748 SQLSMALLINT sql_c_type = SQL_C_CHAR;
1754#ifdef HAVE_SQL_EXTENDED_FETCH
1756 SQLUSMALLINT RowStatus[1];
1769 field_ind = (int) pv_field_long - 1;
1772 result = Z_ODBC_RESULT_P(pv_res);
1773 CHECK_ODBC_RESULT(
result);
1775 if (
result->numcols == 0) {
1781 if (field !=
NULL) {
1787 for(i = 0; i <
result->numcols; i++) {
1794 if (field_ind < 0) {
1800 if (field_ind >=
result->numcols || field_ind < 0) {
1806 if (
result->fetched == 0) {
1808#ifdef HAVE_SQL_EXTENDED_FETCH
1813 rc = SQLFetch(
result->stmt);
1815 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1816 if (rc == SQL_ERROR) {
1817#ifdef HAVE_SQL_EXTENDED_FETCH
1818 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLExtendedFetch");
1820 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLFetch");
1829 switch(
result->values[field_ind].coltype) {
1833 if (
result->binmode <= 1) {
1834 sql_c_type = SQL_C_BINARY;
1836 if (
result->binmode <= 0) {
1843#if defined(ODBCVER) && (ODBCVER >= 0x0300)
1846 if (IS_SQL_LONG(
result->values[field_ind].coltype)) {
1847 if (
result->longreadlen <= 0) {
1850 fieldsize =
result->longreadlen;
1853 PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)(field_ind + 1),
1854 (SQLUSMALLINT)((sql_c_type == SQL_C_BINARY) ? SQL_COLUMN_LENGTH :
1855 SQL_COLUMN_DISPLAY_SIZE),
1859 fieldsize = (
result->longreadlen <= 0) ? 4096 :
result->longreadlen;
1860 field_str = zend_string_alloc(fieldsize, 0);
1865 rc = SQLGetData(
result->stmt, (SQLUSMALLINT)(field_ind + 1), sql_c_type,
1866 ZSTR_VAL(field_str), fieldsize, &
result->values[field_ind].vallen);
1868 if (rc == SQL_ERROR) {
1869 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLGetData");
1870 zend_string_efree(field_str);
1874 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1875 zend_string_efree(field_str);
1878 }
else if (
result->values[field_ind].vallen == SQL_NULL_DATA) {
1879 zend_string_efree(field_str);
1881 }
else if (
result->values[field_ind].vallen == SQL_NO_TOTAL) {
1882 zend_string_efree(field_str);
1889#
if defined(ODBCVER) && (ODBCVER >= 0x0300)
1898 if (rc != SQL_SUCCESS_WITH_INFO) {
1899 field_str = zend_string_truncate(field_str,
result->values[field_ind].vallen, 0);
1906 if (
result->values[field_ind].vallen == SQL_NULL_DATA) {
1908 }
else if (
result->values[field_ind].vallen == SQL_NO_TOTAL) {
1920 fieldsize = (sql_c_type == SQL_C_CHAR) ? 4096 : 4095;
1925 rc = SQLGetData(
result->stmt, (SQLUSMALLINT)(field_ind + 1),sql_c_type, field, fieldsize, &
result->values[field_ind].vallen);
1927 if (rc == SQL_ERROR) {
1928 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLGetData");
1933 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
1939 if (
result->values[field_ind].vallen == SQL_NULL_DATA) {
1942 }
else if (
result->values[field_ind].vallen == SQL_NO_TOTAL) {
1948 PHPWRITE(field,(rc == SQL_SUCCESS_WITH_INFO) ? 4095 :
result->values[field_ind].vallen);
1950 if (rc == SQL_SUCCESS) {
1966 char *pv_format =
NULL;
1967 size_t i, pv_format_len = 0;
1968 SQLSMALLINT sql_c_type;
1969#ifdef HAVE_SQL_EXTENDED_FETCH
1971 SQLUSMALLINT RowStatus[1];
1978 result = Z_ODBC_RESULT_P(pv_res);
1979 CHECK_ODBC_RESULT(
result);
1981 if (
result->numcols == 0) {
1985#ifdef HAVE_SQL_EXTENDED_FETCH
1990 rc = SQLFetch(
result->stmt);
1992 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2004 for (i = 0; i <
result->numcols; i++) {
2010 while(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
2013 for(i = 0; i <
result->numcols; i++) {
2014 sql_c_type = SQL_C_CHAR;
2015 switch(
result->values[i].coltype) {
2019 if (
result->binmode <= 0) {
2023 if (
result->binmode <= 1) sql_c_type = SQL_C_BINARY;
2028#if defined(ODBCVER) && (ODBCVER >= 0x0300)
2031 if (IS_SQL_LONG(
result->values[i].coltype) &&
2032 result->longreadlen <= 0) {
2041 rc = SQLGetData(
result->stmt, (SQLUSMALLINT)(i + 1),sql_c_type,
buf,
result->longreadlen, &
result->values[i].vallen);
2045 if (rc == SQL_ERROR) {
2046 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLGetData");
2051 if (rc == SQL_SUCCESS_WITH_INFO) {
2052 if (
result->values[i].vallen == SQL_NO_TOTAL) {
2060 }
else if (rc != SQL_SUCCESS) {
2065 }
else if (
result->values[i].vallen == SQL_NULL_DATA) {
2074 if (
result->values[i].vallen == SQL_NULL_DATA) {
2076 }
else if (
result->values[i].vallen == SQL_NO_TOTAL) {
2087#ifdef HAVE_SQL_EXTENDED_FETCH
2092 rc = SQLFetch(
result->stmt);
2110 result = Z_ODBC_RESULT_P(pv_res);
2111 CHECK_ODBC_RESULT(
result);
2113 odbc_result_free(
result);
2134bool odbc_sqlconnect(
zval *
zv,
char *db,
char *uid,
char *pwd,
int cur_opt,
bool persistent,
char *
hash,
int hash_len)
2141 link = Z_ODBC_LINK_P(
zv);
2149 ret = SQLAllocEnv(&
link->connection->henv);
2150 if (
ret != SQL_SUCCESS &&
ret != SQL_SUCCESS_WITH_INFO) {
2151 odbc_sql_error(
link->connection, SQL_NULL_HSTMT,
"SQLAllocEnv");
2155 ret = SQLAllocConnect(
link->connection->henv, &
link->connection->hdbc);
2156 if (
ret != SQL_SUCCESS &&
ret != SQL_SUCCESS_WITH_INFO) {
2157 odbc_sql_error(
link->connection, SQL_NULL_HSTMT,
"SQLAllocConnect");
2161#if defined(HAVE_SOLID) || defined(HAVE_SOLID_30)
2162 SQLSetConnectOption((
link->connection->hdbc, SQL_TRANSLATE_OPTION,
2163 SQL_SOLID_XLATOPT_NOCNV);
2170 rc = SQLDriverConnect(link->connection->hdbc, NULL, db, SQL_NTS, dsnbuf, sizeof(dsnbuf) - 1, &dsnbuflen, SQL_DRIVER_NOPROMPT);
2173 if (cur_opt != SQL_CUR_DEFAULT) {
2175 if (rc != SQL_SUCCESS) {
2176 odbc_sql_error(
link->connection, SQL_NULL_HSTMT,
"SQLSetConnectOption");
2182#if defined(HAVE_EMPRESS) || defined(HAVE_UNIXODBC) || defined(PHP_WIN32) || defined (HAVE_IODBC)
2193 if (
strstr((
char*)db,
"=")) {
2197 size_t db_len =
strlen(db);
2198 char *db_end = db + db_len;
2203 if (use_uid_arg || use_pwd_arg) {
2205 if ((
unsigned char)*(db_end) ==
';') {
2209 char *uid_quoted =
NULL, *pwd_quoted =
NULL;
2210 bool should_quote_uid, should_quote_pwd;
2213 if (should_quote_uid) {
2215 uid_quoted =
emalloc(estimated_length);
2222 spprintf(&ldb, 0,
"%s;UID=%s;", db, uid_quoted);
2228 if (should_quote_pwd) {
2230 pwd_quoted =
emalloc(estimated_length);
2237 spprintf(&ldb, 0,
"%s;PWD=%s;", db, pwd_quoted);
2241 if (use_uid_arg && use_pwd_arg) {
2242 spprintf(&ldb, 0,
"%s;UID=%s;PWD=%s;", db, uid_quoted, pwd_quoted);
2245 if (uid_quoted && should_quote_uid) {
2248 if (pwd_quoted && should_quote_pwd) {
2253 ldb = (
char*)
emalloc(ldb_len);
2254 memcpy(ldb, db, ldb_len);
2259 rc = SQLDriverConnect(
link->connection->hdbc,
NULL, (
SQLCHAR *) ldb,
strlen(ldb), dsnbuf,
sizeof(dsnbuf) - 1, &dsnbuflen, SQL_DRIVER_NOPROMPT);
2269 rc = SQLConnect(
link->connection->hdbc, (
SQLCHAR *) db, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
2272 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2273 odbc_sql_error(
link->connection, SQL_NULL_HSTMT,
"SQLConnect");
2284 size_t db_len, uid_len, pwd_len;
2286 odbc_connection *db_conn;
2304 cur_opt == SQL_CUR_DEFAULT) ) {
2306 "SQL_CUR_USE_ODBC, or SQL_CUR_USE_DRIVER");
2315 char *hashed_details;
2318try_and_get_another_connection:
2324 if ((le = zend_hash_str_find_ptr(&
EG(persistent_list), hashed_details, hashed_details_len)) ==
NULL) {
2327 efree(hashed_details);
2332 efree(hashed_details);
2336 if (!odbc_sqlconnect(
return_value, db, uid, pwd, cur_opt,
true, hashed_details, hashed_details_len)) {
2337 efree(hashed_details);
2345 efree(hashed_details);
2352 ODBCG(num_persistent)++;
2360 db_conn = (odbc_connection *)le->
ptr;
2365 if(ODBCG(check_persistent)){
2369 SQLUINTEGER dead = SQL_CD_FALSE;
2371 ret = SQLGetConnectAttr(db_conn->hdbc,
2372 SQL_ATTR_CONNECTION_DEAD,
2374 if (
ret == SQL_SUCCESS && dead == SQL_CD_TRUE) {
2377 goto try_and_get_another_connection;
2383 ret = SQLGetInfo(db_conn->hdbc,
2384 SQL_DATA_SOURCE_READ_ONLY,
2385 d_name,
sizeof(d_name), &
len);
2387 if(
ret != SQL_SUCCESS ||
len == 0) {
2396 goto try_and_get_another_connection;
2404 link->connection = db_conn;
2405 link->hash = zend_string_init(hashed_details, hashed_details_len,
persistent);
2406 link->persistent =
true;
2418 efree(hashed_details);
2422 if (!odbc_sqlconnect(
return_value, db, uid, pwd, cur_opt,
false, hashed_details, hashed_details_len)) {
2423 efree(hashed_details);
2434 efree(hashed_details);
2448 link = Z_ODBC_LINK_P(pv_conn);
2449 odbc_connection *connection = Z_ODBC_CONNECTION_P(pv_conn);
2450 CHECK_ODBC_CONNECTION(connection);
2452 odbc_link_free(
link);
2454 if (
link->persistent) {
2471 result = Z_ODBC_RESULT_P(pv_res);
2472 CHECK_ODBC_RESULT(
result);
2474 SQLRowCount(
result->stmt, &rows);
2479#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30)
2491 result = Z_ODBC_RESULT_P(pv_res);
2492 CHECK_ODBC_RESULT(
result);
2495 for(i = 0; i <
result->numcols; i++) {
2496 if (
result->values[i].value) {
2506 rc = SQLMoreResults(
result->stmt);
2507 if (rc == SQL_SUCCESS_WITH_INFO || rc == SQL_SUCCESS) {
2508 rc = SQLFreeStmt(
result->stmt, SQL_UNBIND);
2512 if (
result->numcols > 0) {
2518 }
else if (rc == SQL_NO_DATA_FOUND) {
2521 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SQLMoreResults");
2538 result = Z_ODBC_RESULT_P(pv_res);
2539 CHECK_ODBC_RESULT(
result);
2556 result = Z_ODBC_RESULT_P(pv_res);
2557 CHECK_ODBC_RESULT(
result);
2564 if (
result->numcols == 0) {
2569 if (pv_num >
result->numcols) {
2591 result = Z_ODBC_RESULT_P(pv_res);
2592 CHECK_ODBC_RESULT(
result);
2599 if (
result->numcols == 0) {
2604 if (pv_num >
result->numcols) {
2609 PHP_ODBC_SQLCOLATTRIBUTE(
result->stmt, (SQLUSMALLINT)pv_num, SQL_COLUMN_TYPE_NAME, tmp, 31, &tmplen,
NULL);
2632 size_t i, field_ind, fname_len;
2640 result = Z_ODBC_RESULT_P(pv_res);
2641 CHECK_ODBC_RESULT(
result);
2643 if (
result->numcols == 0) {
2649 for(i = 0; i <
result->numcols; i++) {
2655 if (field_ind == -1) {
2669 bool pv_onoff_is_null =
true;
2675 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
2676 CHECK_ODBC_CONNECTION(conn);
2678 if (!pv_onoff_is_null) {
2679 rc = SQLSetConnectOption(conn->hdbc, SQL_AUTOCOMMIT, pv_onoff ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF);
2680 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2681 odbc_sql_error(conn, SQL_NULL_HSTMT,
"Set autocommit");
2688 rc = SQLGetConnectOption(conn->hdbc, SQL_AUTOCOMMIT, (PTR)&
status);
2689 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2690 odbc_sql_error(conn, SQL_NULL_HSTMT,
"Get commit status");
2715 odbc_connection *conn;
2724 conn = Z_ODBC_CONNECTION_P(pv_handle);
2725 CHECK_ODBC_CONNECTION(conn);
2728 ret = conn->laststate;
2730 ret = conn->lasterrormsg;
2734 ret = ODBCG(laststate);
2736 ret = ODBCG(lasterrormsg);
2779 if (!instanceof_function(
Z_OBJCE_P(pv_handle), odbc_connection_ce)) {
2783 link = Z_ODBC_LINK_P(pv_handle);
2784 CHECK_ODBC_CONNECTION(
link->connection);
2786 if (
link->persistent) {
2790 rc = SQLSetConnectOption(
link->connection->hdbc, (
unsigned short) pv_opt, pv_val);
2791 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2792 odbc_sql_error(
link->connection, SQL_NULL_HSTMT,
"SetConnectOption");
2797 if (!instanceof_function(
Z_OBJCE_P(pv_handle), odbc_result_ce)) {
2801 result = Z_ODBC_RESULT_P(pv_handle);
2802 CHECK_ODBC_RESULT(
result);
2804 rc = SQLSetStmtOption(
result->stmt, (
unsigned short) pv_opt, pv_val);
2806 if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
2807 odbc_sql_error(
result->conn_ptr,
result->stmt,
"SetStmtOption");
2830 size_t cat_len = 0, schema_len = 0, table_len = 0, type_len = 0;
2834 &table, &table_len, &
type, &type_len) ==
FAILURE) {
2838 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
2839 CHECK_ODBC_CONNECTION(conn);
2844 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
2845 if (rc == SQL_INVALID_HANDLE) {
2851 if (rc == SQL_ERROR) {
2852 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
2858 if (schema && schema_len == 0 && table && table_len) {
2862 rc = SQLTables(
result->stmt,
2863 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
2864 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
2865 (
SQLCHAR *) table, SAFE_SQL_NTS(table),
2868 if (rc == SQL_ERROR) {
2869 odbc_sql_error(conn,
result->stmt,
"SQLTables");
2877 if (
result->numcols > 0) {
2895 size_t cat_len = 0, schema_len = 0, table_len = 0, column_len = 0;
2899 &table, &table_len, &column, &column_len) ==
FAILURE) {
2903 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
2904 CHECK_ODBC_CONNECTION(conn);
2909 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
2910 if (rc == SQL_INVALID_HANDLE) {
2916 if (rc == SQL_ERROR) {
2917 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
2925 if (table && table_len && schema && schema_len == 0) {
2929 rc = SQLColumns(
result->stmt,
2930 (
SQLCHAR *) cat, (SQLSMALLINT) cat_len,
2931 (
SQLCHAR *) schema, (SQLSMALLINT) schema_len,
2932 (
SQLCHAR *) table, (SQLSMALLINT) table_len,
2933 (
SQLCHAR *) column, (SQLSMALLINT) column_len);
2935 if (rc == SQL_ERROR) {
2936 odbc_sql_error(conn,
result->stmt,
"SQLColumns");
2944 if (
result->numcols > 0) {
2956#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
2962 char *cat =
NULL, *schema, *table, *column;
2963 size_t cat_len = 0, schema_len, table_len, column_len;
2967 &table, &table_len, &column, &column_len) ==
FAILURE) {
2971 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
2972 CHECK_ODBC_CONNECTION(conn);
2977 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
2978 if (rc == SQL_INVALID_HANDLE) {
2984 if (rc == SQL_ERROR) {
2985 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
2990 rc = SQLColumnPrivileges(
result->stmt,
2991 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
2992 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
2993 (
SQLCHAR *) table, SAFE_SQL_NTS(table),
2994 (
SQLCHAR *) column, SAFE_SQL_NTS(column));
2996 if (rc == SQL_ERROR) {
2997 odbc_sql_error(conn,
result->stmt,
"SQLColumnPrivileges");
3005 if (
result->numcols > 0) {
3018#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
3024 char *pcat =
NULL, *pschema, *ptable, *fcat, *fschema, *ftable;
3025 size_t pcat_len = 0, pschema_len, ptable_len, fcat_len, fschema_len, ftable_len;
3029 &ptable, &ptable_len, &fcat, &fcat_len, &fschema, &fschema_len, &ftable, &ftable_len) ==
FAILURE) {
3033#if defined(HAVE_DBMAKER) || defined(HAVE_IBMDB2)
3034#define EMPTY_TO_NULL(xstr) \
3035 if ((int)strlen((xstr)) == 0) (xstr) = NULL
3037 EMPTY_TO_NULL(pcat);
3038 EMPTY_TO_NULL(pschema);
3039 EMPTY_TO_NULL(ptable);
3040 EMPTY_TO_NULL(fcat);
3041 EMPTY_TO_NULL(fschema);
3042 EMPTY_TO_NULL(ftable);
3045 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3046 CHECK_ODBC_CONNECTION(conn);
3051 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3052 if (rc == SQL_INVALID_HANDLE) {
3058 if (rc == SQL_ERROR) {
3059 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3064 rc = SQLForeignKeys(
result->stmt,
3065 (
SQLCHAR *) pcat, SAFE_SQL_NTS(pcat),
3066 (
SQLCHAR *) pschema, SAFE_SQL_NTS(pschema),
3067 (
SQLCHAR *) ptable, SAFE_SQL_NTS(ptable),
3068 (
SQLCHAR *) fcat, SAFE_SQL_NTS(fcat),
3069 (
SQLCHAR *) fschema, SAFE_SQL_NTS(fschema),
3070 (
SQLCHAR *) ftable, SAFE_SQL_NTS(ftable) );
3072 if (rc == SQL_ERROR) {
3073 odbc_sql_error(conn,
result->stmt,
"SQLForeignKeys");
3081 if (
result->numcols > 0) {
3101 SQLSMALLINT data_type;
3107 data_type = (SQLSMALLINT) pv_data_type;
3109 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3110 CHECK_ODBC_CONNECTION(conn);
3115 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3116 if (rc == SQL_INVALID_HANDLE) {
3122 if (rc == SQL_ERROR) {
3123 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3128 rc = SQLGetTypeInfo(
result->stmt, data_type );
3130 if (rc == SQL_ERROR) {
3131 odbc_sql_error(conn,
result->stmt,
"SQLGetTypeInfo");
3139 if (
result->numcols > 0) {
3157 size_t cat_len = 0, schema_len, table_len;
3164 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3165 CHECK_ODBC_CONNECTION(conn);
3170 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3171 if (rc == SQL_INVALID_HANDLE) {
3177 if (rc == SQL_ERROR) {
3178 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3183 rc = SQLPrimaryKeys(
result->stmt,
3184 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3185 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3186 (
SQLCHAR *) table, SAFE_SQL_NTS(table) );
3188 if (rc == SQL_ERROR) {
3189 odbc_sql_error(conn,
result->stmt,
"SQLPrimaryKeys");
3197 if (
result->numcols > 0) {
3209#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
3216 size_t cat_len = 0, schema_len = 0, proc_len = 0, col_len = 0;
3220 &proc, &proc_len, &col, &col_len) ==
FAILURE) {
3224 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3225 CHECK_ODBC_CONNECTION(conn);
3230 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3231 if (rc == SQL_INVALID_HANDLE) {
3237 if (rc == SQL_ERROR) {
3238 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3243 rc = SQLProcedureColumns(
result->stmt,
3244 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3245 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3246 (
SQLCHAR *) proc, SAFE_SQL_NTS(proc),
3247 (
SQLCHAR *) col, SAFE_SQL_NTS(col) );
3249 if (rc == SQL_ERROR) {
3250 odbc_sql_error(conn,
result->stmt,
"SQLProcedureColumns");
3258 if (
result->numcols > 0) {
3271#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
3278 size_t cat_len = 0, schema_len = 0, proc_len = 0;
3285 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3286 CHECK_ODBC_CONNECTION(conn);
3291 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3292 if (rc == SQL_INVALID_HANDLE) {
3298 if (rc == SQL_ERROR) {
3299 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3304 rc = SQLProcedures(
result->stmt,
3305 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3306 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3307 (
SQLCHAR *) proc, SAFE_SQL_NTS(proc) );
3309 if (rc == SQL_ERROR) {
3310 odbc_sql_error(conn,
result->stmt,
"SQLProcedures");
3318 if (
result->numcols > 0) {
3338 size_t cat_len = 0, schema_len, name_len;
3343 &
name, &name_len, &vscope, &vnullable) ==
FAILURE) {
3347 type = (SQLUSMALLINT) vtype;
3348 scope = (SQLUSMALLINT) vscope;
3349 nullable = (SQLUSMALLINT) vnullable;
3351 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3352 CHECK_ODBC_CONNECTION(conn);
3357 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3358 if (rc == SQL_INVALID_HANDLE) {
3364 if (rc == SQL_ERROR) {
3365 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3371 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3372 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3377 if (rc == SQL_ERROR) {
3378 odbc_sql_error(conn,
result->stmt,
"SQLSpecialColumns");
3386 if (
result->numcols > 0) {
3405 size_t cat_len = 0, schema_len, name_len;
3406 SQLUSMALLINT unique, reserved;
3410 &
name, &name_len, &vunique, &vreserved) ==
FAILURE) {
3414 unique = (SQLUSMALLINT) vunique;
3415 reserved = (SQLUSMALLINT) vreserved;
3417 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3418 CHECK_ODBC_CONNECTION(conn);
3423 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3424 if (rc == SQL_INVALID_HANDLE) {
3430 if (rc == SQL_ERROR) {
3431 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3436 rc = SQLStatistics(
result->stmt,
3437 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3438 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3443 if (rc == SQL_ERROR) {
3444 odbc_sql_error(conn,
result->stmt,
"SQLStatistics");
3452 if (
result->numcols > 0) {
3464#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35)
3471 size_t cat_len = 0, schema_len, table_len;
3478 odbc_connection *conn = Z_ODBC_CONNECTION_P(pv_conn);
3479 CHECK_ODBC_CONNECTION(conn);
3484 rc = PHP_ODBC_SQLALLOCSTMT(conn->hdbc, &(
result->stmt));
3485 if (rc == SQL_INVALID_HANDLE) {
3491 if (rc == SQL_ERROR) {
3492 odbc_sql_error(conn, SQL_NULL_HSTMT,
"SQLAllocStmt");
3497 rc = SQLTablePrivileges(
result->stmt,
3498 (
SQLCHAR *) cat, SAFE_SQL_NTS(cat),
3499 (
SQLCHAR *) schema, SAFE_SQL_NTS(schema),
3500 (
SQLCHAR *) table, SAFE_SQL_NTS(table));
3502 if (rc == SQL_ERROR) {
3503 odbc_sql_error(conn,
result->stmt,
"SQLTablePrivileges");
3511 if (
result->numcols > 0) {
putenv(string $assignment)
strstr(string $haystack, string $needle, bool $before_needle=false)
link(string $target, string $link)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI int php_check_open_basedir(const char *path)
hash(string $algo, string $data, bool $binary=false, array $options=[])
foreach($dp as $el) foreach( $dp as $el) if( $pass2< 2) echo ""
PHPAPI size_t php_printf(const char *format,...)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
odbc_longreadlen(Odbc\Result $statement, int $length)
odbc_field_len(Odbc\Result $statement, int $field)
odbc_foreignkeys(Odbc\Connection $odbc, ?string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
odbc_error(?Odbc\Connection $odbc=null)
odbc_specialcolumns(Odbc\Connection $odbc, int $type, ?string $catalog, string $schema, string $table, int $scope, int $nullable)
odbc_gettypeinfo(Odbc\Connection $odbc, int $data_type=0)
odbc_free_result(Odbc\Result $statement)
odbc_commit(Odbc\Connection $odbc)
const SQL_CURSOR_KEYSET_DRIVEN
odbc_data_source(Odbc\Connection $odbc, int $fetch_type)
const SQL_CUR_USE_IF_NEEDED
odbc_rollback(Odbc\Connection $odbc)
odbc_setoption(Odbc\Connection|Odbc\Result $odbc, int $which, int $option, int $value)
odbc_field_scale(Odbc\Result $statement, int $field)
odbc_pconnect(string $dsn, ?string $user=null, #[\SensitiveParameter] ?string $password=null, int $cursor_option=SQL_CUR_USE_DRIVER)
odbc_autocommit(Odbc\Connection $odbc, ?bool $enable=null)
odbc_field_type(Odbc\Result $statement, int $field)
odbc_tableprivileges(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table)
odbc_connect(string $dsn, ?string $user=null, #[\SensitiveParameter] ?string $password=null, int $cursor_option=SQL_CUR_USE_DRIVER)
odbc_columnprivileges(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table, string $column)
odbc_num_fields(Odbc\Result $statement)
odbc_fetch_object(Odbc\Result $statement, ?int $row=null)
odbc_close(Odbc\Connection $odbc)
odbc_procedures(Odbc\Connection $odbc, ?string $catalog=null, ?string $schema=null, ?string $procedure=null)
odbc_procedurecolumns(Odbc\Connection $odbc, ?string $catalog=null, ?string $schema=null, ?string $procedure=null, ?string $column=null)
odbc_fetch_into(Odbc\Result $statement, &$array, ?int $row=null)
odbc_result(Odbc\Result $statement, string|int $field)
odbc_result_all(Odbc\Result $statement, string $format="")
odbc_num_rows(Odbc\Result $statement)
odbc_statistics(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table, int $unique, int $accuracy)
odbc_fetch_array(Odbc\Result $statement, ?int $row=null)
odbc_columns(Odbc\Connection $odbc, ?string $catalog=null, ?string $schema=null, ?string $table=null, ?string $column=null)
odbc_field_name(Odbc\Result $statement, int $field)
odbc_tables(Odbc\Connection $odbc, ?string $catalog=null, ?string $schema=null, ?string $table=null, ?string $types=null)
odbc_execute(Odbc\Result $statement, array $params=[])
const SQL_CURSOR_FORWARD_ONLY
odbc_cursor(Odbc\Result $statement)
odbc_binmode(Odbc\Result $statement, int $mode)
odbc_prepare(Odbc\Connection $odbc, string $query)
odbc_exec(Odbc\Connection $odbc, string $query)
odbc_primarykeys(Odbc\Connection $odbc, ?string $catalog, string $schema, string $table)
odbc_fetch_row(Odbc\Result $statement, ?int $row=null)
odbc_field_num(Odbc\Result $statement, string $field)
odbc_errormsg(?Odbc\Connection $odbc=null)
odbc_next_result(Odbc\Result $statement)
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
#define PHP_CONNECTION_TIMEOUT
#define PHP_MINFO_FUNCTION
#define PHP_GINIT_FUNCTION
#define PHP_RINIT_FUNCTION
#define PHP_RSHUTDOWN_FUNCTION
#define PHP_GSHUTDOWN_FUNCTION
#define PHP_MODULE_GLOBALS
#define STD_PHP_INI_ENTRY_EX
#define STD_PHP_INI_BOOLEAN
#define PHP_INI_DISPLAY_ORIG
PHPAPI size_t php_odbc_connstr_estimate_quote_length(const char *in_str)
PHPAPI bool php_odbc_connstr_is_quoted(const char *str)
PHPAPI size_t php_odbc_connstr_quote(char *out_str, const char *in_str, size_t out_str_size)
PHPAPI bool php_odbc_connstr_should_quote(const char *str)
#define PHPWRITE(str, str_len)
zend_object *(* create_object)(zend_class_entry *class_type)
const zend_object_handlers * default_object_handlers
zend_object_compare_t compare
zend_object_free_obj_t free_obj
zend_object_cast_t cast_object
zend_object_get_constructor_t get_constructor
zend_object_clone_obj_t clone_obj
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
#define ZEND_TSRMLS_CACHE_UPDATE()
#define INTERNAL_FUNCTION_PARAMETERS
#define ZEND_TSRMLS_CACHE_DEFINE()
#define ZEND_STANDARD_CLASS_DEF_PTR
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API void add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format,...)
#define RETURN_STRINGL(s, l)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_DECLARE_MODULE_GLOBALS(module_name)
#define ZEND_GET_MODULE(name)
#define zend_parse_parameters_none()
#define Z_PARAM_STRING(dest, dest_len)
#define Z_PARAM_STRING_OR_NULL(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define RETURN_NEW_STR(s)
#define Z_PARAM_STR_OR_LONG(dest_str, dest_long)
#define Z_PARAM_OBJECT_OF_CLASS(dest, _ce)
#define ZVAL_STRINGL(z, s, l)
#define ZVAL_EMPTY_STRING(z)
#define estrndup(s, length)
#define pefree(ptr, persistent)
#define safe_emalloc(nmemb, size, offset)
#define pecalloc(nmemb, size, persistent)
strncmp(string $string1, string $string2, int $length)
defined(string $constant_name)
zend_string_release_ex(func->internal_function.function_name, 0)
#define strcasecmp(s1, s2)
union _zend_function zend_function
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData)
ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument)
ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht)
ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_add_new(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len)
ZEND_API const HashTable zend_empty_array
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define ZEND_HASH_APPLY_REMOVE
#define ZEND_HASH_APPLY_KEEP
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_FOREACH_VAL(ht, _val)
#define UNREGISTER_INI_ENTRIES()
#define REGISTER_INI_ENTRIES()
#define DISPLAY_INI_ENTRIES()
ZEND_API zend_resource * zend_register_persistent_resource(const char *key, size_t key_len, void *rsrc_pointer, int rsrc_type)
ZEND_API int zend_register_list_destructors_ex(rsrc_dtor_func_t ld, rsrc_dtor_func_t pld, const char *type_name, int module_number)
struct _zend_string zend_string
#define STANDARD_MODULE_HEADER
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES_EX
ZEND_API zend_result zend_std_cast_object_tostring(zend_object *readobj, zval *writeobj, int type)
ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
#define XtOffsetOf(s_type, field)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
#define Z_ARRVAL_P(zval_p)
struct _zend_resource zend_resource
struct _zend_array HashTable
#define GC_MAKE_PERSISTENT_LOCAL(p)
#define Z_OBJCE_P(zval_p)
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
ZEND_API void zval_ptr_dtor(zval *zval_ptr)