Return to birdstep.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / odbc |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 6: +----------------------------------------------------------------------+ ! 7: | This source file is subject to version 3.01 of the PHP license, | ! 8: | that is bundled with this package in the file LICENSE, and is | ! 9: | available through the world-wide-web at the following url: | ! 10: | http://www.php.net/license/3_01.txt | ! 11: | If you did not receive a copy of the PHP license and are unable to | ! 12: | obtain it through the world-wide-web, please send a note to | ! 13: | license@php.net so we can mail you a copy immediately. | ! 14: +----------------------------------------------------------------------+ ! 15: | Authors: Nikolay P. Romanyuk <mag@redcom.ru> | ! 16: +----------------------------------------------------------------------+ ! 17: */ ! 18: ! 19: /* $Id: birdstep.c 321634 2012-01-01 13:15:04Z felipe $ */ ! 20: ! 21: /* ! 22: * TODO: ! 23: * birdstep_fetch_into(), ! 24: * Check all on real life apps. ! 25: */ ! 26: ! 27: #ifdef HAVE_CONFIG_H ! 28: #include "config.h" ! 29: #endif ! 30: ! 31: #include "php.h" ! 32: ! 33: #if WIN32 ! 34: # include "config.w32.h" ! 35: # include "win95nt.h" ! 36: # ifdef PHP_EXPORTS ! 37: # define PHPAPI __declspec(dllexport) ! 38: # else ! 39: # define PHPAPI __declspec(dllimport) ! 40: # endif ! 41: #else ! 42: # include <php_config.h> ! 43: # define PHPAPI ! 44: # define THREAD_LS ! 45: #endif ! 46: ! 47: #ifdef HAVE_BIRDSTEP ! 48: #include "php_birdstep.h" ! 49: #include "ext/standard/info.h" ! 50: #include "php_ini.h" ! 51: ! 52: /* {{{ arginfo */ ! 53: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_connect, 0, 0, 3) ! 54: ZEND_ARG_INFO(0, server) ! 55: ZEND_ARG_INFO(0, user) ! 56: ZEND_ARG_INFO(0, pass) ! 57: ZEND_END_ARG_INFO() ! 58: ! 59: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_close, 0, 0, 1) ! 60: ZEND_ARG_INFO(0, id) ! 61: ZEND_END_ARG_INFO() ! 62: ! 63: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_exec, 0, 0, 2) ! 64: ZEND_ARG_INFO(0, index) ! 65: ZEND_ARG_INFO(0, exec_str) ! 66: ZEND_END_ARG_INFO() ! 67: ! 68: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fetch, 0, 0, 1) ! 69: ZEND_ARG_INFO(0, index) ! 70: ZEND_END_ARG_INFO() ! 71: ! 72: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_result, 0, 0, 2) ! 73: ZEND_ARG_INFO(0, index) ! 74: ZEND_ARG_INFO(0, col) ! 75: ZEND_END_ARG_INFO() ! 76: ! 77: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_freeresult, 0, 0, 1) ! 78: ZEND_ARG_INFO(0, index) ! 79: ZEND_END_ARG_INFO() ! 80: ! 81: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_autocommit, 0, 0, 1) ! 82: ZEND_ARG_INFO(0, index) ! 83: ZEND_END_ARG_INFO() ! 84: ! 85: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_off_autocommit, 0, 0, 1) ! 86: ZEND_ARG_INFO(0, index) ! 87: ZEND_END_ARG_INFO() ! 88: ! 89: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_commit, 0, 0, 1) ! 90: ZEND_ARG_INFO(0, index) ! 91: ZEND_END_ARG_INFO() ! 92: ! 93: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_rollback, 0, 0, 1) ! 94: ZEND_ARG_INFO(0, index) ! 95: ZEND_END_ARG_INFO() ! 96: ! 97: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fieldname, 0, 0, 2) ! 98: ZEND_ARG_INFO(0, index) ! 99: ZEND_ARG_INFO(0, col) ! 100: ZEND_END_ARG_INFO() ! 101: ! 102: ZEND_BEGIN_ARG_INFO_EX(arginfo_birdstep_fieldnum, 0, 0, 1) ! 103: ZEND_ARG_INFO(0, index) ! 104: ZEND_END_ARG_INFO() ! 105: /* }}} */ ! 106: ! 107: const zend_function_entry birdstep_functions[] = { ! 108: PHP_FE(birdstep_connect, arginfo_birdstep_connect) ! 109: PHP_FE(birdstep_close, arginfo_birdstep_close) ! 110: PHP_FE(birdstep_exec, arginfo_birdstep_exec) ! 111: PHP_FE(birdstep_fetch, arginfo_birdstep_fetch) ! 112: PHP_FE(birdstep_result, arginfo_birdstep_result) ! 113: PHP_FE(birdstep_freeresult, arginfo_birdstep_freeresult) ! 114: PHP_FE(birdstep_autocommit, arginfo_birdstep_autocommit) ! 115: PHP_FE(birdstep_off_autocommit, arginfo_birdstep_off_autocommit) ! 116: PHP_FE(birdstep_commit, arginfo_birdstep_commit) ! 117: PHP_FE(birdstep_rollback, arginfo_birdstep_rollback) ! 118: PHP_FE(birdstep_fieldnum, arginfo_birdstep_fieldnum) ! 119: PHP_FE(birdstep_fieldname, arginfo_birdstep_fieldname) ! 120: /* ! 121: * Temporary Function aliases until the next major upgrade to PHP. ! 122: * These should allow users to continue to use their current scripts, ! 123: * but should in reality warn the user that this functionality is ! 124: * deprecated. ! 125: */ ! 126: PHP_FALIAS(velocis_connect, birdstep_connect, arginfo_birdstep_connect) ! 127: PHP_FALIAS(velocis_close, birdstep_close, arginfo_birdstep_close) ! 128: PHP_FALIAS(velocis_exec, birdstep_exec, arginfo_birdstep_exec) ! 129: PHP_FALIAS(velocis_fetch, birdstep_fetch, arginfo_birdstep_fetch) ! 130: PHP_FALIAS(velocis_result, birdstep_result, arginfo_birdstep_result) ! 131: PHP_FALIAS(velocis_freeresult, birdstep_freeresult, arginfo_birdstep_freeresult) ! 132: PHP_FALIAS(velocis_autocommit, birdstep_autocommit, arginfo_birdstep_autocommit) ! 133: PHP_FALIAS(velocis_off_autocommit, birdstep_off_autocommit, arginfo_birdstep_off_autocommit) ! 134: PHP_FALIAS(velocis_commit, birdstep_commit, arginfo_birdstep_commit) ! 135: PHP_FALIAS(velocis_rollback, birdstep_rollback, arginfo_birdstep_rollback) ! 136: PHP_FALIAS(velocis_fieldnum, birdstep_fieldnum, arginfo_birdstep_fieldnum) ! 137: PHP_FALIAS(velocis_fieldname, birdstep_fieldname, arginfo_birdstep_fieldname) ! 138: /* End temporary aliases */ ! 139: {NULL, NULL, NULL} ! 140: }; ! 141: ! 142: zend_module_entry birdstep_module_entry = { ! 143: STANDARD_MODULE_HEADER, ! 144: "birdstep", ! 145: birdstep_functions, ! 146: PHP_MINIT(birdstep), ! 147: PHP_MSHUTDOWN(birdstep), ! 148: PHP_RINIT(birdstep), ! 149: NULL, ! 150: PHP_MINFO(birdstep), ! 151: NO_VERSION_YET, ! 152: STANDARD_MODULE_PROPERTIES ! 153: }; ! 154: ! 155: #ifdef COMPILE_DL_ODBC ! 156: ZEND_GET_MODULE(birdstep) ! 157: #endif ! 158: ! 159: THREAD_LS birdstep_module php_birdstep_module; ! 160: THREAD_LS static HENV henv; ! 161: ! 162: #define PHP_GET_BIRDSTEP_RES_IDX(id) if (!(res = birdstep_find_result(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not result index (%ld)", id); RETURN_FALSE; } ! 163: #define PHP_BIRDSTEP_CHK_LNK(id) if (!(conn = birdstep_find_conn(list, id))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Not connection index (%ld)", id); RETURN_FALSE; } ! 164: ! 165: ! 166: static void _close_birdstep_link(zend_rsrc_list_entry *rsrc TSRMLS_DC) ! 167: { ! 168: VConn *conn = (VConn *)rsrc->ptr; ! 169: ! 170: if ( conn ) { ! 171: efree(conn); ! 172: } ! 173: } ! 174: ! 175: static void _free_birdstep_result(zend_rsrc_list_entry *rsrc TSRMLS_DC) ! 176: { ! 177: Vresult *res = (Vresult *)rsrc->ptr; ! 178: ! 179: if ( res && res->values ) { ! 180: register int i; ! 181: for ( i=0; i < res->numcols; i++ ) { ! 182: if ( res->values[i].value ) ! 183: efree(res->values[i].value); ! 184: } ! 185: efree(res->values); ! 186: } ! 187: if ( res ) { ! 188: efree(res); ! 189: } ! 190: } ! 191: ! 192: PHP_MINIT_FUNCTION(birdstep) ! 193: { ! 194: SQLAllocEnv(&henv); ! 195: ! 196: if ( cfg_get_long("birdstep.max_links",&php_birdstep_module.max_links) == FAILURE ) { ! 197: php_birdstep_module.max_links = -1; ! 198: } ! 199: php_birdstep_module.num_links = 0; ! 200: php_birdstep_module.le_link = zend_register_list_destructors_ex(_close_birdstep_link, NULL, "birdstep link", module_number); ! 201: php_birdstep_module.le_result = zend_register_list_destructors_ex(_free_birdstep_result, NULL, "birdstep result", module_number); ! 202: ! 203: return SUCCESS; ! 204: } ! 205: ! 206: PHP_RINIT_FUNCTION(birdstep) ! 207: { ! 208: return SUCCESS; ! 209: } ! 210: ! 211: ! 212: PHP_MINFO_FUNCTION(birdstep) ! 213: { ! 214: php_info_print_table_start(); ! 215: php_info_print_table_row(2, "RAIMA Birdstep Support", "enabled" ); ! 216: php_info_print_table_end(); ! 217: } ! 218: ! 219: PHP_MSHUTDOWN_FUNCTION(birdstep) ! 220: { ! 221: SQLFreeEnv(henv); ! 222: return SUCCESS; ! 223: } ! 224: ! 225: /* Some internal functions. Connections and result manupulate */ ! 226: ! 227: static int birdstep_add_conn(HashTable *list,VConn *conn,HDBC hdbc) ! 228: { ! 229: int ind; ! 230: ! 231: ind = zend_list_insert(conn,php_birdstep_module.le_link); ! 232: conn->hdbc = hdbc; ! 233: conn->index = ind; ! 234: ! 235: return(ind); ! 236: } ! 237: ! 238: static VConn * birdstep_find_conn(HashTable *list,int ind) ! 239: { ! 240: VConn *conn; ! 241: int type; ! 242: ! 243: conn = zend_list_find(ind,&type); ! 244: if ( !conn || type != php_birdstep_module.le_link ) { ! 245: return(NULL); ! 246: } ! 247: return(conn); ! 248: } ! 249: ! 250: static void birdstep_del_conn(HashTable *list,int ind) ! 251: { ! 252: zend_list_delete(ind); ! 253: } ! 254: ! 255: static int birdstep_add_result(HashTable *list,Vresult *res,VConn *conn) ! 256: { ! 257: int ind; ! 258: ! 259: ind = zend_list_insert(res,php_birdstep_module.le_result); ! 260: res->conn = conn; ! 261: res->index = ind; ! 262: ! 263: return(ind); ! 264: } ! 265: ! 266: static Vresult * birdstep_find_result(HashTable *list,int ind) ! 267: { ! 268: Vresult *res; ! 269: int type; ! 270: ! 271: res = zend_list_find(ind,&type); ! 272: if ( !res || type != php_birdstep_module.le_result ) { ! 273: return(NULL); ! 274: } ! 275: return(res); ! 276: } ! 277: ! 278: static void birdstep_del_result(HashTable *list,int ind) ! 279: { ! 280: zend_list_delete(ind); ! 281: } ! 282: ! 283: /* Users functions */ ! 284: ! 285: /* {{{ proto int birdstep_connect(string server, string user, string pass) ! 286: */ ! 287: PHP_FUNCTION(birdstep_connect) ! 288: { ! 289: char *serv, *user, *pass; ! 290: int serv_len, user_len, pass_len; ! 291: RETCODE stat; ! 292: HDBC hdbc; ! 293: VConn *new; ! 294: long ind; ! 295: ! 296: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &serv, &serv_len, &user, &user_len, &pass, &pass_len) == FAILURE) { ! 297: return; ! 298: } ! 299: ! 300: if ( php_birdstep_module.max_links != -1 && php_birdstep_module.num_links == php_birdstep_module.max_links ) { ! 301: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Too many open connections (%d)",php_birdstep_module.num_links); ! 302: RETURN_FALSE; ! 303: } ! 304: ! 305: stat = SQLAllocConnect(henv,&hdbc); ! 306: if ( stat != SQL_SUCCESS ) { ! 307: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Could not allocate connection handle"); ! 308: RETURN_FALSE; ! 309: } ! 310: stat = SQLConnect(hdbc, serv, SQL_NTS, user, SQL_NTS, pass, SQL_NTS); ! 311: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 312: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Could not connect to server \"%s\" for %s", serv, user); ! 313: SQLFreeConnect(hdbc); ! 314: RETURN_FALSE; ! 315: } ! 316: new = (VConn *)emalloc(sizeof(VConn)); ! 317: ind = birdstep_add_conn(list,new,hdbc); ! 318: php_birdstep_module.num_links++; ! 319: RETURN_LONG(ind); ! 320: } ! 321: /* }}} */ ! 322: ! 323: /* {{{ proto bool birdstep_close(int id) ! 324: */ ! 325: PHP_FUNCTION(birdstep_close) ! 326: { ! 327: long id; ! 328: VConn *conn; ! 329: ! 330: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { ! 331: return; ! 332: } ! 333: ! 334: PHP_BIRDSTEP_CHK_LNK(id); ! 335: ! 336: SQLDisconnect(conn->hdbc); ! 337: SQLFreeConnect(conn->hdbc); ! 338: birdstep_del_conn(list, id); ! 339: php_birdstep_module.num_links--; ! 340: RETURN_TRUE; ! 341: } ! 342: /* }}} */ ! 343: ! 344: /* {{{ proto int birdstep_exec(int index, string exec_str) ! 345: */ ! 346: PHP_FUNCTION(birdstep_exec) ! 347: { ! 348: char *query; ! 349: long ind; ! 350: int query_len, indx; ! 351: VConn *conn; ! 352: Vresult *res; ! 353: RETCODE stat; ! 354: SWORD cols,i,colnamelen; ! 355: SDWORD rows,coldesc; ! 356: ! 357: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &ind, &query, &query_len) == FAILURE) { ! 358: return; ! 359: } ! 360: ! 361: PHP_BIRDSTEP_CHK_LNK(ind); ! 362: ! 363: res = (Vresult *)emalloc(sizeof(Vresult)); ! 364: stat = SQLAllocStmt(conn->hdbc,&res->hstmt); ! 365: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 366: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLAllocStmt return %d",stat); ! 367: efree(res); ! 368: RETURN_FALSE; ! 369: } ! 370: stat = SQLExecDirect(res->hstmt,query,SQL_NTS); ! 371: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 372: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Cannot execute \"%s\" query",query); ! 373: SQLFreeStmt(res->hstmt,SQL_DROP); ! 374: efree(res); ! 375: RETURN_FALSE; ! 376: } ! 377: /* Success query */ ! 378: stat = SQLNumResultCols(res->hstmt,&cols); ! 379: if ( stat != SQL_SUCCESS ) { ! 380: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLNumResultCols return %d",stat); ! 381: SQLFreeStmt(res->hstmt,SQL_DROP); ! 382: efree(res); ! 383: RETURN_FALSE; ! 384: } ! 385: if ( !cols ) { /* Was INSERT, UPDATE, DELETE, etc. query */ ! 386: stat = SQLRowCount(res->hstmt,&rows); ! 387: if ( stat != SQL_SUCCESS ) { ! 388: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLNumResultCols return %d",stat); ! 389: SQLFreeStmt(res->hstmt,SQL_DROP); ! 390: efree(res); ! 391: RETURN_FALSE; ! 392: } ! 393: SQLFreeStmt(res->hstmt,SQL_DROP); ! 394: efree(res); ! 395: RETURN_LONG(rows); ! 396: } else { /* Was SELECT query */ ! 397: res->values = (VResVal *)safe_emalloc(sizeof(VResVal), cols, 0); ! 398: res->numcols = cols; ! 399: for ( i = 0; i < cols; i++ ) { ! 400: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_NAME, ! 401: res->values[i].name,sizeof(res->values[i].name), ! 402: &colnamelen,NULL); ! 403: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_TYPE, ! 404: NULL,0,NULL,&res->values[i].valtype); ! 405: switch ( res->values[i].valtype ) { ! 406: case SQL_LONGVARBINARY: ! 407: case SQL_LONGVARCHAR: ! 408: res->values[i].value = NULL; ! 409: continue; ! 410: default: ! 411: break; ! 412: } ! 413: SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_DISPLAY_SIZE, ! 414: NULL,0,NULL,&coldesc); ! 415: res->values[i].value = (char *)emalloc(coldesc+1); ! 416: SQLBindCol(res->hstmt,i+1,SQL_C_CHAR, res->values[i].value,coldesc+1, &res->values[i].vallen); ! 417: } ! 418: } ! 419: res->fetched = 0; ! 420: indx = birdstep_add_result(list,res,conn); ! 421: RETURN_LONG(indx); ! 422: } ! 423: /* }}} */ ! 424: ! 425: /* {{{ proto bool birdstep_fetch(int index) ! 426: */ ! 427: PHP_FUNCTION(birdstep_fetch) ! 428: { ! 429: long ind; ! 430: Vresult *res; ! 431: RETCODE stat; ! 432: UDWORD row; ! 433: UWORD RowStat[1]; ! 434: ! 435: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) { ! 436: return; ! 437: } ! 438: ! 439: PHP_GET_BIRDSTEP_RES_IDX(ind); ! 440: ! 441: stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat); ! 442: if ( stat == SQL_NO_DATA_FOUND ) { ! 443: SQLFreeStmt(res->hstmt,SQL_DROP); ! 444: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 445: RETURN_FALSE; ! 446: } ! 447: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 448: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLFetch return error"); ! 449: SQLFreeStmt(res->hstmt,SQL_DROP); ! 450: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 451: RETURN_FALSE; ! 452: } ! 453: res->fetched = 1; ! 454: RETURN_TRUE; ! 455: } ! 456: /* }}} */ ! 457: ! 458: /* {{{ proto mixed birdstep_result(int index, mixed col) ! 459: */ ! 460: PHP_FUNCTION(birdstep_result) ! 461: { ! 462: zval **col; ! 463: long ind; ! 464: Vresult *res; ! 465: RETCODE stat; ! 466: int i,sql_c_type; ! 467: UDWORD row; ! 468: UWORD RowStat[1]; ! 469: SWORD indx = -1; ! 470: char *field = NULL; ! 471: ! 472: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lZ", &ind, &col) == FAILURE) { ! 473: return; ! 474: } ! 475: ! 476: PHP_GET_BIRDSTEP_RES_IDX(ind); ! 477: ! 478: if ( Z_TYPE_PP(col) == IS_STRING ) { ! 479: field = Z_STRVAL_PP(col); ! 480: } else { ! 481: convert_to_long_ex(col); ! 482: indx = Z_LVAL_PP(col); ! 483: } ! 484: if ( field ) { ! 485: for ( i = 0; i < res->numcols; i++ ) { ! 486: if ( !strcasecmp(res->values[i].name,field)) { ! 487: indx = i; ! 488: break; ! 489: } ! 490: } ! 491: if ( indx < 0 ) { ! 492: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %s not found",field); ! 493: RETURN_FALSE; ! 494: } ! 495: } else { ! 496: if ( indx < 0 || indx >= res->numcols ) { ! 497: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Field index not in range"); ! 498: RETURN_FALSE; ! 499: } ! 500: } ! 501: if ( !res->fetched ) { ! 502: stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat); ! 503: if ( stat == SQL_NO_DATA_FOUND ) { ! 504: SQLFreeStmt(res->hstmt,SQL_DROP); ! 505: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 506: RETURN_FALSE; ! 507: } ! 508: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 509: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLFetch return error"); ! 510: SQLFreeStmt(res->hstmt,SQL_DROP); ! 511: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 512: RETURN_FALSE; ! 513: } ! 514: res->fetched = 1; ! 515: } ! 516: switch ( res->values[indx].valtype ) { ! 517: case SQL_LONGVARBINARY: ! 518: sql_c_type = SQL_C_BINARY; ! 519: goto l1; ! 520: case SQL_LONGVARCHAR: ! 521: sql_c_type = SQL_C_CHAR; ! 522: l1: ! 523: if ( !res->values[indx].value ) { ! 524: res->values[indx].value = emalloc(4096); ! 525: } ! 526: stat = SQLGetData(res->hstmt,indx+1,sql_c_type, ! 527: res->values[indx].value,4095,&res->values[indx].vallen); ! 528: if ( stat == SQL_NO_DATA_FOUND ) { ! 529: SQLFreeStmt(res->hstmt,SQL_DROP); ! 530: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 531: RETURN_FALSE; ! 532: } ! 533: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 534: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: SQLGetData return error"); ! 535: SQLFreeStmt(res->hstmt,SQL_DROP); ! 536: birdstep_del_result(list,Z_LVAL_PP(ind)); ! 537: RETURN_FALSE; ! 538: } ! 539: if ( res->values[indx].valtype == SQL_LONGVARCHAR ) { ! 540: RETURN_STRING(res->values[indx].value,TRUE); ! 541: } else { ! 542: RETURN_LONG((long)res->values[indx].value); ! 543: } ! 544: default: ! 545: if ( res->values[indx].value != NULL ) { ! 546: RETURN_STRING(res->values[indx].value,TRUE); ! 547: } ! 548: } ! 549: } ! 550: /* }}} */ ! 551: ! 552: /* {{{ proto bool birdstep_freeresult(int index) ! 553: */ ! 554: PHP_FUNCTION(birdstep_freeresult) ! 555: { ! 556: long ind; ! 557: Vresult *res; ! 558: ! 559: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) { ! 560: return; ! 561: } ! 562: ! 563: PHP_GET_BIRDSTEP_RES_IDX(ind); ! 564: ! 565: SQLFreeStmt(res->hstmt,SQL_DROP); ! 566: birdstep_del_result(list, ind); ! 567: RETURN_TRUE; ! 568: } ! 569: /* }}} */ ! 570: ! 571: /* {{{ proto bool birdstep_autocommit(int index) ! 572: */ ! 573: PHP_FUNCTION(birdstep_autocommit) ! 574: { ! 575: long id; ! 576: RETCODE stat; ! 577: VConn *conn; ! 578: ! 579: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { ! 580: return; ! 581: } ! 582: ! 583: PHP_BIRDSTEP_CHK_LNK(id); ! 584: ! 585: stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_ON); ! 586: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 587: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Set autocommit_on option failure"); ! 588: RETURN_FALSE; ! 589: } ! 590: RETURN_TRUE; ! 591: } ! 592: /* }}} */ ! 593: ! 594: /* {{{ proto bool birdstep_off_autocommit(int index) ! 595: */ ! 596: PHP_FUNCTION(birdstep_off_autocommit) ! 597: { ! 598: long id; ! 599: RETCODE stat; ! 600: VConn *conn; ! 601: ! 602: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { ! 603: return; ! 604: } ! 605: ! 606: PHP_BIRDSTEP_CHK_LNK(id); ! 607: ! 608: stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF); ! 609: if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) { ! 610: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Set autocommit_off option failure"); ! 611: RETURN_FALSE; ! 612: } ! 613: RETURN_TRUE; ! 614: } ! 615: /* }}} */ ! 616: ! 617: /* {{{ proto bool birdstep_commit(int index) ! 618: */ ! 619: PHP_FUNCTION(birdstep_commit) ! 620: { ! 621: long id; ! 622: RETCODE stat; ! 623: VConn *conn; ! 624: ! 625: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { ! 626: return; ! 627: } ! 628: ! 629: PHP_BIRDSTEP_CHK_LNK(id) ! 630: ! 631: stat = SQLTransact(NULL,conn->hdbc,SQL_COMMIT); ! 632: if ( stat != SQL_SUCCESS ) { ! 633: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Commit failure"); ! 634: RETURN_FALSE; ! 635: } ! 636: RETURN_TRUE; ! 637: } ! 638: /* }}} */ ! 639: ! 640: /* {{{ proto bool birdstep_rollback(int index) ! 641: */ ! 642: PHP_FUNCTION(birdstep_rollback) ! 643: { ! 644: long id; ! 645: RETCODE stat; ! 646: VConn *conn; ! 647: ! 648: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { ! 649: return; ! 650: } ! 651: ! 652: PHP_BIRDSTEP_CHK_LNK(id); ! 653: ! 654: stat = SQLTransact(NULL,conn->hdbc,SQL_ROLLBACK); ! 655: if ( stat != SQL_SUCCESS ) { ! 656: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Rollback failure"); ! 657: RETURN_FALSE; ! 658: } ! 659: RETURN_TRUE; ! 660: } ! 661: /* }}} */ ! 662: ! 663: /* {{{ proto string birdstep_fieldname(int index, int col) ! 664: */ ! 665: PHP_FUNCTION(birdstep_fieldname) ! 666: { ! 667: long ind, col; ! 668: Vresult *res; ! 669: SWORD indx; ! 670: ! 671: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &ind, &col) == FAILURE) { ! 672: return; ! 673: } ! 674: ! 675: PHP_GET_BIRDSTEP_RES_IDX(ind); ! 676: ! 677: indx = col; ! 678: if ( indx < 0 || indx >= res->numcols ) { ! 679: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Birdstep: Field index not in range"); ! 680: RETURN_FALSE; ! 681: } ! 682: RETURN_STRING(res->values[indx].name,TRUE); ! 683: } ! 684: /* }}} */ ! 685: ! 686: /* {{{ proto int birdstep_fieldnum(int index) ! 687: */ ! 688: PHP_FUNCTION(birdstep_fieldnum) ! 689: { ! 690: long ind; ! 691: Vresult *res; ! 692: ! 693: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ind) == FAILURE) { ! 694: return; ! 695: } ! 696: ! 697: PHP_GET_BIRDSTEP_RES_IDX(ind); ! 698: ! 699: RETURN_LONG(res->numcols); ! 700: } ! 701: /* }}} */ ! 702: ! 703: #endif /* HAVE_BIRDSTEP */ ! 704: ! 705: /* ! 706: * Local variables: ! 707: * tab-width: 4 ! 708: * c-basic-offset: 4 ! 709: * End: ! 710: */