Annotation of embedaddon/php/ext/odbc/birdstep.c, revision 1.1

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:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>