Annotation of embedaddon/php/ext/odbc/birdstep.c, revision 1.1.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>