Annotation of embedaddon/php/ext/oci8/oci8_interface.c, revision 1.1.1.2

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: Stig Sæther Bakken <ssb@php.net>                            |
                     16:    |          Thies C. Arntzen <thies@thieso.net>                         |
                     17:    |                                                                      |
                     18:    | Collection support by Andy Sautins <asautins@veripost.net>           |
                     19:    | Temporary LOB support by David Benson <dbenson@mancala.com>          |
                     20:    | ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at>        |
                     21:    |                                                                      |
                     22:    | Redesigned by: Antony Dovgal <antony@zend.com>                       |
                     23:    |                Andi Gutmans <andi@zend.com>                          |
                     24:    |                Wez Furlong <wez@omniti.com>                          |
                     25:    +----------------------------------------------------------------------+
                     26: */
                     27: 
1.1.1.2 ! misho      28: /* $Id$ */
1.1       misho      29: 
                     30: #ifdef HAVE_CONFIG_H
                     31: #include "config.h"
                     32: #endif
                     33: 
                     34: #include "php.h"
                     35: #include "ext/standard/info.h"
                     36: #include "php_ini.h"
                     37: 
                     38: #if HAVE_OCI8
                     39: 
                     40: #include "php_oci8.h"
                     41: #include "php_oci8_int.h"
                     42: 
                     43: #ifndef OCI_STMT_CALL
                     44: #define OCI_STMT_CALL 10
                     45: #endif
                     46: 
                     47: /* {{{ proto bool oci_define_by_name(resource stmt, string name, mixed &var [, int type])
                     48:    Define a PHP variable to an Oracle column by name */
                     49: /* if you want to define a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE defining!!! */
                     50: PHP_FUNCTION(oci_define_by_name)
                     51: {
                     52:        zval *stmt, *var;
                     53:        char *name;
                     54:        int name_len;
                     55:        long type = 0;
                     56:        php_oci_statement *statement;
                     57:        php_oci_define *define, *tmp_define;
                     58: 
                     59:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|l", &stmt, &name, &name_len, &var, &type) == FAILURE) {
                     60:                return;
                     61:        }
                     62: 
                     63:        if (!name_len) {
                     64:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Column name cannot be empty");
                     65:                RETURN_FALSE;
                     66:        }
                     67: 
                     68:        PHP_OCI_ZVAL_TO_STATEMENT(stmt, statement);
                     69: 
                     70:        if (statement->defines == NULL) {
                     71:                ALLOC_HASHTABLE(statement->defines);
                     72:                zend_hash_init(statement->defines, 13, NULL, php_oci_define_hash_dtor, 0);
                     73:        }
                     74: 
                     75:        define = ecalloc(1,sizeof(php_oci_define));
                     76: 
                     77:        if (zend_hash_add(statement->defines, name, name_len, define, sizeof(php_oci_define), (void **)&tmp_define) == SUCCESS) {
                     78:                efree(define);
                     79:                define = tmp_define;
                     80:        } else {
                     81:                efree(define);
                     82:                RETURN_FALSE;
                     83:        }
                     84: 
                     85:        define->name = (text*) estrndup(name, name_len);
                     86:        define->name_len = name_len;
                     87:        define->type = type;
                     88:        define->zval = var;
                     89:        zval_add_ref(&var);
                     90: 
                     91:        RETURN_TRUE;
                     92: }
                     93: /* }}} */
                     94: 
                     95: /* {{{ proto bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]])
                     96:    Bind a PHP variable to an Oracle placeholder by name */
                     97: /* if you want to bind a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE binding!!! */
                     98: PHP_FUNCTION(oci_bind_by_name)
                     99: {
                    100:        ub2     bind_type = SQLT_CHR; /* unterminated string */
                    101:        int name_len;
                    102:        long maxlen = -1, type = 0;
                    103:        char *name;
                    104:        zval *z_statement;
                    105:        zval *bind_var = NULL;
                    106:        php_oci_statement *statement;
                    107:        
                    108:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|ll", &z_statement, &name, &name_len, &bind_var, &maxlen, &type) == FAILURE) {
                    109:                return;
                    110:        }
                    111: 
                    112:        if (type) {
                    113:                bind_type = (ub2) type;
                    114:        }
                    115:        
                    116:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                    117: 
                    118:        if (php_oci_bind_by_name(statement, name, name_len, bind_var, maxlen, bind_type TSRMLS_CC)) {
                    119:                RETURN_FALSE;
                    120:        }
                    121:        RETURN_TRUE;
                    122: }
                    123: /* }}} */
                    124: 
                    125: /* {{{ proto bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]])
                    126:    Bind a PHP array to an Oracle PL/SQL type by name */
                    127: PHP_FUNCTION(oci_bind_array_by_name)
                    128: {
                    129:        int name_len;
                    130:        long max_item_len = -1;
                    131:        long max_array_len = 0;
                    132:        long type = SQLT_AFC;
                    133:        char *name;
                    134:        zval *z_statement;
                    135:        zval *bind_var = NULL;
                    136:        php_oci_statement *statement;
                    137:        
                    138:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/l|ll", &z_statement, &name, &name_len, &bind_var, &max_array_len, &max_item_len, &type) == FAILURE) {
                    139:                return;
                    140:        }
                    141: 
                    142:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                    143: 
                    144:        if (ZEND_NUM_ARGS() == 5 && max_item_len <= 0) {
                    145:                max_item_len = -1;
                    146:        }
                    147:        
                    148:        if (max_array_len <= 0) {
                    149:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Maximum array length must be greater than zero");
                    150:                RETURN_FALSE;
                    151:        }
                    152:        
                    153:        if (php_oci_bind_array_by_name(statement, name, name_len, bind_var, max_array_len, max_item_len, type TSRMLS_CC)) {
                    154:                RETURN_FALSE;
                    155:        }
                    156:        RETURN_TRUE;
                    157: }
                    158: /* }}} */
                    159: 
                    160: /* {{{ proto bool oci_free_descriptor()
                    161:    Deletes large object description */
                    162: PHP_FUNCTION(oci_free_descriptor)
                    163: {
                    164:        zval **tmp, *z_descriptor = getThis();
                    165:        php_oci_descriptor *descriptor;
                    166: 
                    167:        if (!getThis()) {
                    168:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    169:                        return;
                    170:                }
                    171:        }
                    172:        
                    173:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    174:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    175:                RETURN_FALSE;
                    176:        }
                    177: 
                    178:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    179: 
                    180:        zend_list_delete(descriptor->id);
                    181:        RETURN_TRUE;
                    182: }
                    183: /* }}} */
                    184: 
                    185: /* {{{ proto bool oci_lob_save( string data [, int offset ])
                    186:    Saves a large object */
                    187: PHP_FUNCTION(oci_lob_save)
                    188: {
                    189:        zval **tmp, *z_descriptor = getThis();
                    190:        php_oci_descriptor *descriptor;
                    191:        char *data;
                    192:        int data_len;
                    193:        long offset = 0;
                    194:        ub4 bytes_written;
                    195: 
                    196:        if (getThis()) {
                    197:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &offset) == FAILURE) {
                    198:                        return;
                    199:                }
                    200:        }
                    201:        else {
                    202:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &offset) == FAILURE) {
                    203:                        return;
                    204:                }
                    205:        }
                    206:        
                    207:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    208:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    209:                RETURN_FALSE;
                    210:        }
                    211: 
                    212:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    213: 
                    214:        if (offset < 0) {
                    215:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset parameter must be greater than or equal to 0");
                    216:                RETURN_FALSE;
                    217:        }
                    218:        
                    219:        if (php_oci_lob_write(descriptor, offset, data, data_len, &bytes_written TSRMLS_CC)) {
                    220:                RETURN_FALSE;
                    221:        }
                    222:        RETURN_TRUE;
                    223: }
                    224: /* }}} */
                    225: 
                    226: /* {{{ proto bool oci_lob_import( string filename )
                    227:    Loads file into a LOB */
                    228: PHP_FUNCTION(oci_lob_import)
                    229: {
                    230:        zval **tmp, *z_descriptor = getThis();
                    231:        php_oci_descriptor *descriptor;
                    232:        char *filename;
                    233:        int filename_len;
                    234: 
                    235:        if (getThis()) {
                    236: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
                    237:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) {
                    238: #else
                    239:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                    240: #endif
                    241:                        return;
                    242:                }
                    243:        }
                    244:        else {
                    245: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
                    246:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Op", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len) == FAILURE) {
                    247: #else
                    248:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len) == FAILURE) {
                    249: #endif
                    250:                        return;
                    251:                }       
                    252:        }
                    253: 
                    254: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
                    255:        /* The "p" parsing parameter handles this case in PHP 5.4+ */
                    256:        if (strlen(filename) != filename_len) {
                    257:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename cannot contain null bytes");
                    258:                RETURN_FALSE;  
                    259:        }
                    260: #endif
                    261: 
                    262:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    263:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    264:                RETURN_FALSE;
                    265:        }
                    266: 
                    267:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    268: 
                    269:        if (php_oci_lob_import(descriptor, filename TSRMLS_CC)) {
                    270:                RETURN_FALSE;
                    271:        }
                    272:        RETURN_TRUE;
                    273: }
                    274: /* }}} */
                    275: 
                    276: /* {{{ proto string oci_lob_load()
                    277:    Loads a large object */
                    278: PHP_FUNCTION(oci_lob_load)
                    279: {
                    280:        zval **tmp, *z_descriptor = getThis();
                    281:        php_oci_descriptor *descriptor;
                    282:        char *buffer = NULL;
                    283:        ub4 buffer_len;
                    284: 
                    285:        if (!getThis()) {
                    286:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    287:                        return;
                    288:                }       
                    289:        }
                    290:        
                    291:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    292:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    293:                RETURN_FALSE;
                    294:        }
                    295:        
                    296:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    297: 
                    298:        if (php_oci_lob_read(descriptor, -1, 0, &buffer, &buffer_len TSRMLS_CC)) {
                    299:                RETURN_FALSE;
                    300:        }
                    301:        if (buffer_len > 0) {
                    302:                RETURN_STRINGL(buffer, buffer_len, 0);
                    303:        }
                    304:        else {
                    305:                RETURN_EMPTY_STRING();
                    306:        }
                    307: }
                    308: /* }}} */
                    309: 
                    310: /* {{{ proto string oci_lob_read( int length )
                    311:    Reads particular part of a large object */
                    312: PHP_FUNCTION(oci_lob_read)
                    313: {
                    314:        zval **tmp, *z_descriptor = getThis();
                    315:        php_oci_descriptor *descriptor;
                    316:        long length;
                    317:        char *buffer;
                    318:        ub4 buffer_len;
                    319: 
                    320:        if (getThis()) {
                    321:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) {
                    322:                        return;
                    323:                }
                    324:        }
                    325:        else {
                    326:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_descriptor, oci_lob_class_entry_ptr, &length) == FAILURE) {
                    327:                        return;
                    328:                }       
                    329:        }
                    330: 
                    331:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    332:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    333:                RETURN_FALSE;
                    334:        }
                    335:        
                    336:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    337: 
                    338:        if (length <= 0) {
                    339:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
                    340:                RETURN_FALSE;
                    341:        }
                    342:        
                    343:        if (php_oci_lob_read(descriptor, length, descriptor->lob_current_position, &buffer, &buffer_len TSRMLS_CC)) {
                    344:                RETURN_FALSE;
                    345:        }       
                    346:        if (buffer_len > 0) {
                    347:                RETURN_STRINGL(buffer, buffer_len, 0);
                    348:        }
                    349:        else {
                    350:                RETURN_EMPTY_STRING();
                    351:        }
                    352: }
                    353: /* }}} */
                    354: 
                    355: /* {{{ proto bool oci_lob_eof()
                    356:    Checks if EOF is reached */
                    357: PHP_FUNCTION(oci_lob_eof)
                    358: {
                    359:        zval **tmp, *z_descriptor = getThis();
                    360:        php_oci_descriptor *descriptor;
                    361:        ub4 lob_length;
                    362:        
                    363:        if (!getThis()) {
                    364:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    365:                        return;
                    366:                }       
                    367:        }
                    368:        
                    369:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    370:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    371:                RETURN_FALSE;
                    372:        }
                    373:        
                    374:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    375:        
                    376:        if (!php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC) && lob_length >= 0) {
                    377:                if (lob_length == descriptor->lob_current_position) {
                    378:                        RETURN_TRUE;
                    379:                }
                    380:        }
                    381:        RETURN_FALSE;
                    382: }
                    383: /* }}} */
                    384: 
                    385: /* {{{ proto int oci_lob_tell()
                    386:    Tells LOB pointer position */
                    387: PHP_FUNCTION(oci_lob_tell)
                    388: {
                    389:        zval **tmp, *z_descriptor = getThis();
                    390:        php_oci_descriptor *descriptor;
                    391:        
                    392:        if (!getThis()) {
                    393:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    394:                        return;
                    395:                }       
                    396:        }
                    397:        
                    398:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    399:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    400:                RETURN_FALSE;
                    401:        }
                    402:        
                    403:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    404:        
                    405:        RETURN_LONG(descriptor->lob_current_position);  
                    406: }
                    407: /* }}} */
                    408: 
                    409: /* {{{ proto bool oci_lob_rewind()
                    410:    Rewind pointer of a LOB */
                    411: PHP_FUNCTION(oci_lob_rewind)
                    412: {
                    413:        zval **tmp, *z_descriptor = getThis();
                    414:        php_oci_descriptor *descriptor;
                    415:        
                    416:        if (!getThis()) {
                    417:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    418:                        return;
                    419:                }       
                    420:        }
                    421:        
                    422:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    423:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    424:                RETURN_FALSE;
                    425:        }
                    426:        
                    427:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    428:        
                    429:        descriptor->lob_current_position = 0;
                    430: 
                    431:        RETURN_TRUE;
                    432: }
                    433: /* }}} */
                    434: 
                    435: /* {{{ proto bool oci_lob_seek( int offset [, int whence ])
                    436:    Moves the pointer of a LOB */
                    437: PHP_FUNCTION(oci_lob_seek)
                    438: {
                    439:        zval **tmp, *z_descriptor = getThis();
                    440:        php_oci_descriptor *descriptor;
                    441:        long offset, whence = PHP_OCI_SEEK_SET;
                    442:        ub4 lob_length;
                    443:        
                    444:        if (getThis()) {
                    445:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &offset, &whence) == FAILURE) {
                    446:                        return;
                    447:                }
                    448:        }
                    449:        else {
                    450:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|l", &z_descriptor, oci_lob_class_entry_ptr, &offset, &whence) == FAILURE) {
                    451:                        return;
                    452:                }       
                    453:        }
                    454:        
                    455:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    456:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    457:                RETURN_FALSE;
                    458:        }
                    459:        
                    460:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    461: 
                    462:        if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
                    463:                RETURN_FALSE;
                    464:        }
                    465: 
                    466:        switch(whence) {
                    467:                case PHP_OCI_SEEK_CUR:
                    468:                        descriptor->lob_current_position += offset;
                    469:                        break;
                    470:                case PHP_OCI_SEEK_END:
                    471:                        if ((descriptor->lob_size + offset) >= 0) {
                    472:                                descriptor->lob_current_position = descriptor->lob_size + offset;
                    473:                        }
                    474:                        else {
                    475:                                descriptor->lob_current_position = 0;
                    476:                        }
                    477:                        break;
                    478:                case PHP_OCI_SEEK_SET:
                    479:                default:
                    480:                                descriptor->lob_current_position = (offset > 0) ? offset : 0;
                    481:                        break;
                    482:        }       
                    483:        RETURN_TRUE;
                    484: }
                    485: /* }}} */
                    486: 
                    487: /* {{{ proto int oci_lob_size()
                    488:    Returns size of a large object */
                    489: PHP_FUNCTION(oci_lob_size)
                    490: {
                    491:        zval **tmp, *z_descriptor = getThis();
                    492:        php_oci_descriptor *descriptor;
                    493:        ub4 lob_length;
                    494:        
                    495:        if (!getThis()) {
                    496:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    497:                        return;
                    498:                }       
                    499:        }
                    500:        
                    501:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    502:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    503:                RETURN_FALSE;
                    504:        }
                    505:        
                    506:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    507:        
                    508:        if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
                    509:                RETURN_FALSE;
                    510:        }
                    511:        RETURN_LONG(lob_length);
                    512: }
                    513: /* }}} */
                    514: 
                    515: /* {{{ proto int oci_lob_write( string string [, int length ])
                    516:    Writes data to current position of a LOB */
                    517: PHP_FUNCTION(oci_lob_write)
                    518: {
                    519:        zval **tmp, *z_descriptor = getThis();
                    520:        php_oci_descriptor *descriptor;
                    521:        int data_len;
                    522:        long write_len = 0;
                    523:        ub4 bytes_written;
                    524:        char *data;
                    525:        
                    526:        if (getThis()) {
                    527:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &write_len) == FAILURE) {
                    528:                        return;
                    529:                }
                    530:                
                    531:                if (ZEND_NUM_ARGS() == 2) {
                    532:                        data_len = MIN(data_len, write_len);
                    533:                }
                    534:        }
                    535:        else {
                    536:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &write_len) == FAILURE) {
                    537:                        return;
                    538:                }
                    539: 
                    540:                if (ZEND_NUM_ARGS() == 3) {
                    541:                        data_len = MIN(data_len, write_len);
                    542:                }
                    543:        }
                    544:        
                    545:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    546:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    547:                RETURN_FALSE;
                    548:        }
                    549:        
                    550:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    551:        
                    552:        if (data_len <= 0) {
                    553:                RETURN_LONG(0);
                    554:        }
                    555:        
                    556:        if (php_oci_lob_write(descriptor, descriptor->lob_current_position, data, data_len, &bytes_written TSRMLS_CC)) {
                    557:                RETURN_FALSE;
                    558:        }
                    559:        RETURN_LONG(bytes_written);
                    560: }
                    561: /* }}} */
                    562: 
                    563: /* {{{ proto bool oci_lob_append( object lob )
                    564:    Appends data from a LOB to another LOB */
                    565: PHP_FUNCTION(oci_lob_append)
                    566: {
                    567:        zval **tmp_dest, **tmp_from, *z_descriptor_dest = getThis(), *z_descriptor_from;
                    568:        php_oci_descriptor *descriptor_dest, *descriptor_from;
                    569:        
                    570:        if (getThis()) {
                    571:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor_from, oci_lob_class_entry_ptr) == FAILURE) {
                    572:                        return;
                    573:                }
                    574:        }
                    575:        else {
                    576:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_descriptor_dest, oci_lob_class_entry_ptr, &z_descriptor_from, oci_lob_class_entry_ptr) == FAILURE) {
                    577:                        return;
                    578:                }       
                    579:        }
                    580:        
                    581:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) {
                    582:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
                    583:                RETURN_FALSE;
                    584:        }
                    585:        
                    586:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) {
                    587:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
                    588:                RETURN_FALSE;
                    589:        }
                    590:        
                    591:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest);
                    592:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from);
                    593:        
                    594:        if (php_oci_lob_append(descriptor_dest, descriptor_from TSRMLS_CC)) {
                    595:                RETURN_FALSE;
                    596:        }
                    597:        /* XXX should we increase lob_size here ? */
                    598:        RETURN_TRUE;
                    599: }
                    600: /* }}} */
                    601: 
                    602: /* {{{ proto bool oci_lob_truncate( [ int length ])
                    603:    Truncates a LOB */
                    604: PHP_FUNCTION(oci_lob_truncate)
                    605: {
                    606:        zval **tmp, *z_descriptor = getThis();
                    607:        php_oci_descriptor *descriptor;
                    608:        long trim_length = 0;
                    609:        ub4 ub_trim_length;
                    610:        
                    611:        if (getThis()) {
                    612:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &trim_length) == FAILURE) {
                    613:                        return;
                    614:                }
                    615:        }
                    616:        else {
                    617:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &trim_length) == FAILURE) {
                    618:                        return;
                    619:                }       
                    620:        }
                    621:        
                    622:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    623:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    624:                RETURN_FALSE;
                    625:        }
                    626: 
                    627:        if (trim_length < 0) {
                    628:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to zero");
                    629:                RETURN_FALSE;
                    630:        }
                    631: 
                    632:        ub_trim_length = (ub4) trim_length;
                    633:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    634:        
                    635:        if (php_oci_lob_truncate(descriptor, ub_trim_length TSRMLS_CC)) {
                    636:                RETURN_FALSE;
                    637:        }
                    638:        RETURN_TRUE;
                    639: }
                    640: /* }}} */
                    641: 
                    642: /* {{{ proto int oci_lob_erase( [ int offset [, int length ] ] )
                    643:    Erases a specified portion of the internal LOB, starting at a specified offset */
                    644: PHP_FUNCTION(oci_lob_erase)
                    645: {
                    646:        zval **tmp, *z_descriptor = getThis();
                    647:        php_oci_descriptor *descriptor;
                    648:        ub4 bytes_erased;
                    649:        long offset = -1, length = -1;
                    650:        
                    651:        if (getThis()) {
                    652:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &offset, &length) == FAILURE) {
                    653:                        return;
                    654:                }
                    655: 
                    656:                if (ZEND_NUM_ARGS() > 0 && offset < 0) {
                    657:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0");
                    658:                        RETURN_FALSE;
                    659:                }
                    660: 
                    661:                if (ZEND_NUM_ARGS() > 1 && length < 0) {
                    662:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0");
                    663:                        RETURN_FALSE;
                    664:                }
                    665:        }
                    666:        else {
                    667:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|ll", &z_descriptor, oci_lob_class_entry_ptr, &offset, &length) == FAILURE) {
                    668:                        return;
                    669:                }
                    670: 
                    671:                if (ZEND_NUM_ARGS() > 1 && offset < 0) {
                    672:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0");
                    673:                        RETURN_FALSE;
                    674:                }
                    675:                
                    676:                if (ZEND_NUM_ARGS() > 2 && length < 0) {
                    677:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0");
                    678:                        RETURN_FALSE;
                    679:                }
                    680:        }
                    681: 
                    682:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    683:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    684:                RETURN_FALSE;
                    685:        }
                    686: 
                    687:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    688: 
                    689:        if (php_oci_lob_erase(descriptor, offset, length, &bytes_erased TSRMLS_CC)) {
                    690:                RETURN_FALSE;
                    691:        }
                    692:        RETURN_LONG(bytes_erased);
                    693: }
                    694: /* }}} */
                    695: 
                    696: /* {{{ proto bool oci_lob_flush( [ int flag ] )
                    697:    Flushes the LOB buffer */
                    698: PHP_FUNCTION(oci_lob_flush)
                    699: {
                    700:        zval **tmp, *z_descriptor = getThis();
                    701:        php_oci_descriptor *descriptor;
                    702:        long flush_flag = 0;
                    703:        
                    704:        if (getThis()) {
                    705:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flush_flag) == FAILURE) {
                    706:                        return;
                    707:                }
                    708:        }
                    709:        else {
                    710:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &flush_flag) == FAILURE) {
                    711:                        return;
                    712:                }
                    713:        }
                    714:        
                    715:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    716:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    717:                RETURN_FALSE;
                    718:        }
                    719:        
                    720:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    721:        
                    722:        if (descriptor->buffering == PHP_OCI_LOB_BUFFER_DISABLED) {
                    723:                /* buffering wasn't enabled, there is nothing to flush */
                    724:                RETURN_FALSE;
                    725:        }
                    726: 
                    727:        if (php_oci_lob_flush(descriptor, flush_flag TSRMLS_CC)) {
                    728:                RETURN_FALSE;
                    729:        }
                    730:        RETURN_TRUE;
                    731: }
                    732: /* }}} */
                    733: 
                    734: /* {{{ proto bool ocisetbufferinglob( boolean flag )
                    735:    Enables/disables buffering for a LOB */
                    736: PHP_FUNCTION(ocisetbufferinglob)
                    737: {
                    738:        zval **tmp, *z_descriptor = getThis();
                    739:        php_oci_descriptor *descriptor;
                    740:        zend_bool flag;
                    741:        
                    742:        if (getThis()) {
                    743:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &flag) == FAILURE) {
                    744:                        return;
                    745:                }
                    746:        }
                    747:        else {
                    748:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ob", &z_descriptor, oci_lob_class_entry_ptr, &flag) == FAILURE) {
                    749:                        return;
                    750:                }       
                    751:        }
                    752:        
                    753:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    754:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    755:                RETURN_FALSE;
                    756:        }
                    757:        
                    758:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    759:        
                    760:        if (php_oci_lob_set_buffering(descriptor, flag TSRMLS_CC)) {
                    761:                RETURN_FALSE;
                    762:        }
                    763:        RETURN_TRUE;
                    764: }
                    765: /* }}} */
                    766: 
                    767: /* {{{ proto bool ocigetbufferinglob()
                    768:    Returns current state of buffering for a LOB */
                    769: PHP_FUNCTION(ocigetbufferinglob)
                    770: {
                    771:        zval **tmp, *z_descriptor = getThis();
                    772:        php_oci_descriptor *descriptor;
                    773:        
                    774:        if (!getThis()) {
                    775:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                    776:                        return;
                    777:                }       
                    778:        }
                    779: 
                    780:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    781:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    782:                RETURN_FALSE;
                    783:        }
                    784:        
                    785:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    786:        
                    787:        if (descriptor->buffering != PHP_OCI_LOB_BUFFER_DISABLED) {
                    788:                RETURN_TRUE;
                    789:        }
                    790:        RETURN_FALSE;
                    791: }
                    792: /* }}} */
                    793: 
                    794: /* {{{ proto bool oci_lob_copy( object lob_to, object lob_from [, int length ] )
                    795:    Copies data from a LOB to another LOB */
                    796: PHP_FUNCTION(oci_lob_copy)
                    797: {
                    798:        zval **tmp_dest, **tmp_from, *z_descriptor_dest, *z_descriptor_from;
                    799:        php_oci_descriptor *descriptor_dest, *descriptor_from;
                    800:        long length = 0;
                    801:        
                    802:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO|l", &z_descriptor_dest, oci_lob_class_entry_ptr, &z_descriptor_from, oci_lob_class_entry_ptr, &length) == FAILURE) {
                    803:                return;
                    804:        }
                    805:        
                    806:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) {
                    807:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
                    808:                RETURN_FALSE;
                    809:        }
                    810:        
                    811:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) {
                    812:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
                    813:                RETURN_FALSE;
                    814:        }
                    815:        
                    816:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest);
                    817:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from);
                    818:        
                    819:        if (ZEND_NUM_ARGS() == 3 && length < 0) {
                    820:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
                    821:                RETURN_FALSE;
                    822:        }
                    823:        
                    824:        if (ZEND_NUM_ARGS() == 2) {
                    825:                /* indicate that we want to copy from the current position to the end of the LOB */
                    826:                length = -1;
                    827:        }
                    828: 
                    829:        if (php_oci_lob_copy(descriptor_dest, descriptor_from, length TSRMLS_CC)) {
                    830:                RETURN_FALSE;
                    831:        }
                    832:        RETURN_TRUE;
                    833: }
                    834: /* }}} */
                    835: 
                    836: /* {{{ proto bool oci_lob_is_equal( object lob1, object lob2 )
                    837:    Tests to see if two LOB/FILE locators are equal */
                    838: PHP_FUNCTION(oci_lob_is_equal)
                    839: {
                    840:        zval **tmp_first, **tmp_second, *z_descriptor_first, *z_descriptor_second;
                    841:        php_oci_descriptor *descriptor_first, *descriptor_second;
                    842:        boolean is_equal;
                    843:                
                    844:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_descriptor_first, oci_lob_class_entry_ptr, &z_descriptor_second, oci_lob_class_entry_ptr) == FAILURE) {
                    845:                return;
                    846:        }
                    847:        
                    848:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_first), "descriptor", sizeof("descriptor"), (void **)&tmp_first) == FAILURE) {
                    849:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
                    850:                RETURN_FALSE;
                    851:        }
                    852:        
                    853:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor_second), "descriptor", sizeof("descriptor"), (void **)&tmp_second) == FAILURE) {
                    854:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
                    855:                RETURN_FALSE;
                    856:        }
                    857:        
                    858:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_first, descriptor_first);
                    859:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_second, descriptor_second);
                    860: 
                    861:        if (php_oci_lob_is_equal(descriptor_first, descriptor_second, &is_equal TSRMLS_CC)) {
                    862:                RETURN_FALSE;
                    863:        }
                    864:        
                    865:        if (is_equal == TRUE) {
                    866:                RETURN_TRUE;
                    867:        }
                    868:        RETURN_FALSE;
                    869: }
                    870: /* }}} */
                    871: 
                    872: /* {{{ proto bool oci_lob_export([string filename [, int start [, int length]]])
                    873:    Writes a large object into a file */
                    874: PHP_FUNCTION(oci_lob_export)
                    875: {      
                    876:        zval **tmp, *z_descriptor = getThis();
                    877:        php_oci_descriptor *descriptor;
                    878:        char *filename;
                    879:        char *buffer;
                    880:        int filename_len;
                    881:        long start = -1, length = -1, block_length;
                    882:        php_stream *stream;
                    883:        ub4 lob_length;
                    884: 
                    885:        if (getThis()) {
                    886: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
                    887:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ll", &filename, &filename_len, &start, &length) == FAILURE) {
                    888: #else
                    889:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &start, &length) == FAILURE) {
                    890: #endif
                    891:                        return;
                    892:                }
                    893:        
                    894:                if (ZEND_NUM_ARGS() > 1 && start < 0) {
                    895:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0");
                    896:                        RETURN_FALSE;
                    897:                }
                    898:                if (ZEND_NUM_ARGS() > 2 && length < 0) {
                    899:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0");
                    900:                        RETURN_FALSE;
                    901:                }
                    902:        }
                    903:        else {
                    904: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
                    905:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Op|ll", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len, &start, &length) == FAILURE) {
                    906: #else
                    907:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|ll", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len, &start, &length) == FAILURE) {
                    908: #endif
                    909:                        return;
                    910:                }
                    911:                        
                    912:                if (ZEND_NUM_ARGS() > 2 && start < 0) {
                    913:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0");
                    914:                        RETURN_FALSE;
                    915:                }
                    916:                if (ZEND_NUM_ARGS() > 3 && length < 0) {
                    917:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0");
                    918:                        RETURN_FALSE;
                    919:                }
                    920:        }
                    921: 
                    922: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
                    923:        /* The "p" parsing parameter handles this case in PHP 5.4+ */
                    924:        if (strlen(filename) != filename_len) {
                    925:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename cannot contain null bytes");
                    926:                RETURN_FALSE;  
                    927:        }
                    928: #endif
                    929: 
                    930:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                    931:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                    932:                RETURN_FALSE;
                    933:        }
                    934:        
                    935:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                    936:        
                    937:        if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
                    938:                RETURN_FALSE;
                    939:        }               
                    940:        
                    941:        if (start == -1) {
                    942:                start = 0;
                    943:        }
                    944: 
                    945:        if (length == -1) {
                    946:                length = lob_length - descriptor->lob_current_position;
                    947:        }
                    948:        
                    949:        if (length == 0) {
                    950:                /* nothing to write, fail silently */
                    951:                RETURN_FALSE;
                    952:        }
                    953: 
                    954: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
                    955:        /* Safe mode has been removed in PHP 5.4 */
                    956:        if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
                    957:                RETURN_FALSE;
                    958:        }
                    959: #endif
                    960: 
                    961:        if (php_check_open_basedir(filename TSRMLS_CC)) {
                    962:                RETURN_FALSE;
                    963:        }
                    964: 
                    965: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
                    966:        stream = php_stream_open_wrapper_ex(filename, "w", REPORT_ERRORS, NULL, NULL);
                    967: #else
                    968:        stream = php_stream_open_wrapper_ex(filename, "w", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, NULL);
                    969: #endif
                    970: 
                    971:        block_length = PHP_OCI_LOB_BUFFER_SIZE;
                    972:        if (block_length > length) {
                    973:                block_length = length;
                    974:        }
                    975: 
                    976:        while(length > 0) {
                    977:                ub4 tmp_bytes_read = 0;
                    978:                if (php_oci_lob_read(descriptor, block_length, start, &buffer, &tmp_bytes_read TSRMLS_CC)) {
                    979:                        php_stream_close(stream);
                    980:                        RETURN_FALSE;
                    981:                }
                    982:                if (tmp_bytes_read && !php_stream_write(stream, buffer, tmp_bytes_read)) {
                    983:                        php_stream_close(stream);
                    984:                        efree(buffer);
                    985:                        RETURN_FALSE;
                    986:                }
                    987:                if (buffer) {
                    988:                        efree(buffer);
                    989:                }
                    990:                
                    991:                length -= tmp_bytes_read;
                    992:                descriptor->lob_current_position += tmp_bytes_read;
                    993:                start += tmp_bytes_read;
                    994: 
                    995:                if (block_length > length) {
                    996:                        block_length = length;
                    997:                }
                    998:        }
                    999: 
                   1000:        php_stream_close(stream);
                   1001:        RETURN_TRUE;
                   1002: }
                   1003: /* }}} */
                   1004: 
                   1005: /* {{{ proto bool oci_lob_write_temporary(string var [, int lob_type])
                   1006:    Writes temporary blob */
                   1007: PHP_FUNCTION(oci_lob_write_temporary)
                   1008: {
                   1009:        zval **tmp, *z_descriptor = getThis();
                   1010:        php_oci_descriptor *descriptor;
                   1011:        char *data;
                   1012:        int data_len;
                   1013:        long type = OCI_TEMP_CLOB;
                   1014: 
                   1015:        if (getThis()) {
                   1016:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &type) == FAILURE) {
                   1017:                        return;
                   1018:                }
                   1019:        }
                   1020:        else {
                   1021:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &type) == FAILURE) {
                   1022:                        return;
                   1023:                }       
                   1024:        }
                   1025:        
                   1026:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                   1027:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                   1028:                RETURN_FALSE;
                   1029:        }
                   1030:        
                   1031:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                   1032: 
                   1033:        if (php_oci_lob_write_tmp(descriptor, type, data, data_len TSRMLS_CC)) {
                   1034:                RETURN_FALSE;
                   1035:        }
                   1036:        RETURN_TRUE;
                   1037: }
                   1038: /* }}} */
                   1039: 
                   1040: /* {{{ proto bool oci_lob_close()
                   1041:    Closes lob descriptor */
                   1042: PHP_FUNCTION(oci_lob_close)
                   1043: {
                   1044:        zval **tmp, *z_descriptor = getThis();
                   1045:        php_oci_descriptor *descriptor;
                   1046:        
                   1047:        if (!getThis()) {
                   1048:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
                   1049:                        return;
                   1050:                }       
                   1051:        }
                   1052:        
                   1053:        if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
                   1054:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
                   1055:                RETURN_FALSE;
                   1056:        }
                   1057:        
                   1058:        PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
                   1059: 
                   1060:        if (php_oci_lob_close(descriptor TSRMLS_CC)) {
                   1061:                RETURN_FALSE;
                   1062:        }
                   1063:        RETURN_TRUE;
                   1064: }
                   1065: /* }}} */
                   1066: 
                   1067: /* {{{ proto object oci_new_descriptor(resource connection [, int type])
                   1068:    Initialize a new empty descriptor LOB/FILE (LOB is default) */
                   1069: PHP_FUNCTION(oci_new_descriptor)
                   1070: {
                   1071:        zval *z_connection;
                   1072:        php_oci_connection *connection;
                   1073:        php_oci_descriptor *descriptor;
                   1074:        long type = OCI_DTYPE_LOB;
                   1075: 
                   1076:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_connection, &type) == FAILURE) {
                   1077:                return;
                   1078:        }
                   1079: 
                   1080:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1081: 
                   1082:        /* php_oci_lob_create() checks type */
                   1083:        descriptor = php_oci_lob_create(connection, type TSRMLS_CC);    
                   1084:        
                   1085:        if (!descriptor) {
                   1086:                RETURN_NULL();
                   1087:        }
                   1088: 
                   1089:        object_init_ex(return_value, oci_lob_class_entry_ptr);
                   1090:        add_property_resource(return_value, "descriptor", descriptor->id);
                   1091: }
                   1092: /* }}} */
                   1093: 
                   1094: /* {{{ proto bool oci_rollback(resource connection)
                   1095:    Rollback the current context */
                   1096: PHP_FUNCTION(oci_rollback)
                   1097: {
                   1098:        zval *z_connection;
                   1099:        php_oci_connection *connection;
                   1100: 
                   1101:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
                   1102:                return;
                   1103:        }
                   1104: 
                   1105:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1106: 
                   1107:        if (connection->descriptors) {
                   1108:                php_oci_connection_descriptors_free(connection TSRMLS_CC);
                   1109:        }
                   1110: 
                   1111:        if (php_oci_connection_rollback(connection TSRMLS_CC)) {
                   1112:                RETURN_FALSE;
                   1113:        }
                   1114:        RETURN_TRUE;
                   1115: }
                   1116: /* }}} */
                   1117: 
                   1118: /* {{{ proto bool oci_commit(resource connection)
                   1119:    Commit the current context */
                   1120: PHP_FUNCTION(oci_commit)
                   1121: {
                   1122:        zval *z_connection;
                   1123:        php_oci_connection *connection;
                   1124: 
                   1125:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
                   1126:                return;
                   1127:        }
                   1128: 
                   1129:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1130: 
                   1131:        if (connection->descriptors) {
                   1132:                php_oci_connection_descriptors_free(connection TSRMLS_CC);
                   1133:        }
                   1134:        
                   1135:        if (php_oci_connection_commit(connection TSRMLS_CC)) {
                   1136:                RETURN_FALSE;
                   1137:        }
                   1138:        RETURN_TRUE;
                   1139: }
                   1140: /* }}} */
                   1141: 
                   1142: /* {{{ proto string oci_field_name(resource stmt, int col)
                   1143:    Tell the name of a column */
                   1144: PHP_FUNCTION(oci_field_name)
                   1145: {
                   1146:        php_oci_out_column *column;
                   1147: 
                   1148:        if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
                   1149:                RETURN_STRINGL(column->name, column->name_len, 1);
                   1150:        }
                   1151:        RETURN_FALSE;
                   1152: }
                   1153: /* }}} */
                   1154: 
                   1155: /* {{{ proto int oci_field_size(resource stmt, int col)
                   1156:    Tell the maximum data size of a column */
                   1157: PHP_FUNCTION(oci_field_size)
                   1158: {
                   1159:        php_oci_out_column *column;
                   1160: 
                   1161:        if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
                   1162:                /* Handle data type of LONG */
                   1163:                if (column->data_type == SQLT_LNG){
                   1164:                        RETURN_LONG(column->storage_size4);
                   1165:                }
                   1166:                RETURN_LONG(column->data_size);
                   1167:        }
                   1168:        RETURN_FALSE;
                   1169: }
                   1170: /* }}} */
                   1171: 
                   1172: /* {{{ proto int oci_field_scale(resource stmt, int col)
                   1173:    Tell the scale of a column */
                   1174: PHP_FUNCTION(oci_field_scale)
                   1175: {
                   1176:        php_oci_out_column *column;
                   1177: 
                   1178:        if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
                   1179:                RETURN_LONG(column->scale);
                   1180:        }
                   1181:        RETURN_FALSE;
                   1182: }
                   1183: /* }}} */
                   1184: 
                   1185: /* {{{ proto int oci_field_precision(resource stmt, int col)
                   1186:    Tell the precision of a column */
                   1187: PHP_FUNCTION(oci_field_precision)
                   1188: {
                   1189:        php_oci_out_column *column;
                   1190: 
                   1191:        if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
                   1192:                RETURN_LONG(column->precision);
                   1193:        }
                   1194:        RETURN_FALSE;
                   1195: }
                   1196: /* }}} */
                   1197: 
                   1198: /* {{{ proto mixed oci_field_type(resource stmt, int col)
                   1199:    Tell the data type of a column */
                   1200: PHP_FUNCTION(oci_field_type)
                   1201: {
                   1202:        php_oci_out_column *column;
                   1203: 
                   1204:        column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
                   1205: 
                   1206:        if (!column) {
                   1207:                RETURN_FALSE;
                   1208:        }
                   1209:        
                   1210:        switch (column->data_type) {
                   1211: #ifdef SQLT_TIMESTAMP
                   1212:                case SQLT_TIMESTAMP:
                   1213:                        RETVAL_STRING("TIMESTAMP",1);
                   1214:                        break;
                   1215: #endif
                   1216: #ifdef SQLT_TIMESTAMP_TZ
                   1217:                case SQLT_TIMESTAMP_TZ:
                   1218:                        RETVAL_STRING("TIMESTAMP WITH TIMEZONE",1);
                   1219:                        break;
                   1220: #endif
                   1221: #ifdef SQLT_TIMESTAMP_LTZ
                   1222:                case SQLT_TIMESTAMP_LTZ:
                   1223:                        RETVAL_STRING("TIMESTAMP WITH LOCAL TIMEZONE",1);
                   1224:                        break;
                   1225: #endif
                   1226: #ifdef SQLT_INTERVAL_YM
                   1227:                case SQLT_INTERVAL_YM:
                   1228:                        RETVAL_STRING("INTERVAL YEAR TO MONTH",1);
                   1229:                        break;
                   1230: #endif
                   1231: #ifdef SQLT_INTERVAL_DS
                   1232:                case SQLT_INTERVAL_DS:
                   1233:                        RETVAL_STRING("INTERVAL DAY TO SECOND",1);
                   1234:                        break;
                   1235: #endif
                   1236:                case SQLT_DAT:
                   1237:                        RETVAL_STRING("DATE",1);
                   1238:                        break;
                   1239:                case SQLT_NUM:
                   1240:                        RETVAL_STRING("NUMBER",1);
                   1241:                        break;
                   1242:                case SQLT_LNG:
                   1243:                        RETVAL_STRING("LONG",1);
                   1244:                        break;
                   1245:                case SQLT_BIN:
                   1246:                        RETVAL_STRING("RAW",1);
                   1247:                        break;
                   1248:                case SQLT_LBI:
                   1249:                        RETVAL_STRING("LONG RAW",1);
                   1250:                        break;
                   1251:                case SQLT_CHR:
                   1252:                        RETVAL_STRING("VARCHAR2",1);
                   1253:                        break;
                   1254:                case SQLT_RSET:
                   1255:                        RETVAL_STRING("REFCURSOR",1);
                   1256:                        break;
                   1257:                case SQLT_AFC:
                   1258:                        RETVAL_STRING("CHAR",1);
                   1259:                        break;
                   1260:                case SQLT_BLOB:
                   1261:                        RETVAL_STRING("BLOB",1);
                   1262:                        break;
                   1263:                case SQLT_CLOB:
                   1264:                        RETVAL_STRING("CLOB",1);
                   1265:                        break;
                   1266:                case SQLT_BFILE:
                   1267:                        RETVAL_STRING("BFILE",1);
                   1268:                        break;
                   1269:                case SQLT_RDD:
                   1270:                        RETVAL_STRING("ROWID",1);
                   1271:                        break;
                   1272:                default:
                   1273:                        RETVAL_LONG(column->data_type);
                   1274:        }
                   1275: }
                   1276: /* }}} */
                   1277: 
                   1278: /* {{{ proto int oci_field_type_raw(resource stmt, int col)
                   1279:    Tell the raw oracle data type of a column */
                   1280: PHP_FUNCTION(oci_field_type_raw)
                   1281: {
                   1282:        php_oci_out_column *column;
                   1283: 
                   1284:        column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
                   1285:        if (column) {
                   1286:                RETURN_LONG(column->data_type);
                   1287:        }
                   1288:        RETURN_FALSE;
                   1289: }
                   1290: /* }}} */
                   1291: 
                   1292: /* {{{ proto bool oci_field_is_null(resource stmt, int col)
                   1293:    Tell whether a column is NULL */
                   1294: PHP_FUNCTION(oci_field_is_null)
                   1295: {
                   1296:        php_oci_out_column *column;
                   1297: 
                   1298:        if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
                   1299:                if (column->indicator == -1) {
                   1300:                        RETURN_TRUE;
                   1301:                }
                   1302:        }
                   1303:        RETURN_FALSE;
                   1304: }
                   1305: /* }}} */
                   1306: 
                   1307: /* {{{ proto void oci_internal_debug(int onoff)
                   1308:    Toggle internal debugging output for the OCI extension */
                   1309: PHP_FUNCTION(oci_internal_debug)
                   1310: {
                   1311:        zend_bool on_off;
                   1312: 
                   1313:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &on_off) == FAILURE) {
                   1314:                return;
                   1315:        }
                   1316:        OCI_G(debug_mode) = on_off;
                   1317: }
                   1318: /* }}} */
                   1319: 
                   1320: /* {{{ proto bool oci_execute(resource stmt [, int mode])
                   1321:    Execute a parsed statement */
                   1322: PHP_FUNCTION(oci_execute)
                   1323: {
                   1324:        zval *z_statement;
                   1325:        php_oci_statement *statement;
                   1326:        long mode = OCI_COMMIT_ON_SUCCESS;
                   1327: 
                   1328:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_statement, &mode) == FAILURE) {
                   1329:                return;
                   1330:        }
                   1331: 
                   1332:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1333: 
                   1334:        if (php_oci_statement_execute(statement, mode TSRMLS_CC)) {
                   1335:                RETURN_FALSE;
                   1336:        }
                   1337:        RETURN_TRUE;
                   1338: }
                   1339: /* }}} */
                   1340: 
                   1341: /* {{{ proto bool oci_cancel(resource stmt)
                   1342:    Cancel reading from a cursor */
                   1343: PHP_FUNCTION(oci_cancel)
                   1344: {
                   1345:        zval *z_statement;
                   1346:        php_oci_statement *statement;
                   1347: 
                   1348:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   1349:                return;
                   1350:        }
                   1351: 
                   1352:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1353: 
                   1354:        if (php_oci_statement_cancel(statement TSRMLS_CC)) {
                   1355:                RETURN_FALSE;
                   1356:        }
                   1357:        RETURN_TRUE;
                   1358: }
                   1359: /* }}} */
                   1360: 
                   1361: /* {{{ proto bool oci_fetch(resource stmt)
                   1362:    Prepare a new row of data for reading */
                   1363: PHP_FUNCTION(oci_fetch)
                   1364: {
                   1365:        zval *z_statement;
                   1366:        php_oci_statement *statement;
                   1367:        ub4 nrows = 1; /* only one row at a time is supported for now */
                   1368: 
                   1369:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   1370:                return;
                   1371:        }
                   1372: 
                   1373:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1374: 
                   1375:        if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
                   1376:                RETURN_FALSE;
                   1377:        }
                   1378:        RETURN_TRUE;
                   1379: }
                   1380: /* }}} */
                   1381: 
                   1382: /* {{{ proto int ocifetchinto(resource stmt, array &output [, int mode])
                   1383:    Fetch a row of result data into an array */
                   1384: PHP_FUNCTION(ocifetchinto)
                   1385: {
                   1386:        php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM, 3);
                   1387: }
                   1388: /* }}} */
                   1389: 
                   1390: /* {{{ proto int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]])
                   1391:    Fetch all rows of result data into an array */
                   1392: PHP_FUNCTION(oci_fetch_all)
                   1393: {
                   1394:        zval *z_statement, *array, *element, *tmp;
                   1395:        php_oci_statement *statement;
                   1396:        php_oci_out_column **columns;
                   1397:        zval ***outarrs;
                   1398:        ub4 nrows = 1;
                   1399:        int i;
                   1400:        long rows = 0, flags = 0, skip = 0, maxrows = -1;
                   1401: 
                   1402:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz/|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) {
                   1403:                return;
                   1404:        }
                   1405: 
                   1406:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1407: 
                   1408:        zval_dtor(array);
                   1409:        array_init(array);
                   1410: 
                   1411:        while (skip--) {
                   1412:                if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
                   1413:                        RETURN_LONG(0);
                   1414:                }
                   1415:        }
                   1416: 
                   1417:        if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) {
                   1418:                columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0);
                   1419: 
                   1420:                for (i = 0; i < statement->ncolumns; i++) {
                   1421:                        columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
                   1422:                }
                   1423: 
                   1424:                while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
                   1425:                        zval *row;
                   1426:                        
                   1427:                        MAKE_STD_ZVAL(row);
                   1428:                        array_init(row);
                   1429: 
                   1430:                        for (i = 0; i < statement->ncolumns; i++) {
                   1431:                                MAKE_STD_ZVAL(element);
                   1432:                                php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC);
                   1433: 
                   1434:                                if (flags & PHP_OCI_NUM) {
                   1435:                                        zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL);
                   1436:                                } else { /* default to ASSOC */
                   1437: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
                   1438:                                        /* zend_symtable_update is only available in 5.2+ */
                   1439:                                        zend_symtable_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL);
                   1440: #else
                   1441:                                        /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */
                   1442:                                        zend_hash_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL);
                   1443: #endif
                   1444:                                }
                   1445:                        }
                   1446: 
                   1447:                        zend_hash_next_index_insert(Z_ARRVAL_P(array), &row, sizeof(zval*), NULL);
                   1448:                        rows++;
                   1449: 
                   1450:                        if (maxrows != -1 && rows == maxrows) {
                   1451:                                php_oci_statement_cancel(statement TSRMLS_CC);
                   1452:                                break;
                   1453:                        }
                   1454:                }
                   1455:                efree(columns);
                   1456: 
                   1457:        } else { /* default to BY_COLUMN */
                   1458:                columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0);
                   1459:                outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0);
                   1460:                
                   1461:                if (flags & PHP_OCI_NUM) {
                   1462:                        for (i = 0; i < statement->ncolumns; i++) {
                   1463:                                columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
                   1464:                                
                   1465:                                MAKE_STD_ZVAL(tmp);
                   1466:                                array_init(tmp);
                   1467:                                zend_hash_next_index_insert(Z_ARRVAL_P(array), &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
                   1468:                        }
                   1469:                } else { /* default to ASSOC */
                   1470:                        for (i = 0; i < statement->ncolumns; i++) {
                   1471:                                columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
                   1472:                                
                   1473:                                MAKE_STD_ZVAL(tmp);
                   1474:                                array_init(tmp);
                   1475: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
                   1476:                                /* zend_symtable_update is only available in 5.2+ */
                   1477:                                zend_symtable_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
                   1478: #else
                   1479:                                /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */
                   1480:                                zend_hash_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
                   1481: #endif
                   1482:                        }
                   1483:                }
                   1484: 
                   1485:                while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
                   1486:                        for (i = 0; i < statement->ncolumns; i++) {
                   1487:                                MAKE_STD_ZVAL(element);
                   1488:                                php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC);
                   1489:                                zend_hash_index_update((*(outarrs[ i ]))->value.ht, rows, (void *)&element, sizeof(zval*), NULL);
                   1490:                        }
                   1491: 
                   1492:                        rows++;
                   1493: 
                   1494:                        if (maxrows != -1 && rows == maxrows) {
                   1495:                                php_oci_statement_cancel(statement TSRMLS_CC);
                   1496:                                break;
                   1497:                        }
                   1498:                }
                   1499:                
                   1500:                efree(columns);
                   1501:                efree(outarrs);
                   1502:        }
                   1503: 
                   1504:        RETURN_LONG(rows);
                   1505: }
                   1506: /* }}} */
                   1507: 
                   1508: /* {{{ proto object oci_fetch_object( resource stmt )
                   1509:    Fetch a result row as an object */
                   1510: PHP_FUNCTION(oci_fetch_object)
                   1511: {
                   1512:        php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 2);
                   1513: 
                   1514:        if (Z_TYPE_P(return_value) == IS_ARRAY) {
                   1515:                object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
                   1516:        }
                   1517: }
                   1518: /* }}} */
                   1519: 
                   1520: /* {{{ proto array oci_fetch_row( resource stmt )
                   1521:    Fetch a result row as an enumerated array */
                   1522: PHP_FUNCTION(oci_fetch_row)
                   1523: {
                   1524:        php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM | PHP_OCI_RETURN_NULLS, 1);
                   1525: }
                   1526: /* }}} */
                   1527: 
                   1528: /* {{{ proto array oci_fetch_assoc( resource stmt )
                   1529:    Fetch a result row as an associative array */
                   1530: PHP_FUNCTION(oci_fetch_assoc)
                   1531: {
                   1532:        php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 1);
                   1533: }
                   1534: /* }}} */
                   1535: 
                   1536: /* {{{ proto array oci_fetch_array( resource stmt [, int mode ])
                   1537:    Fetch a result row as an array */
                   1538: PHP_FUNCTION(oci_fetch_array)
                   1539: {
                   1540:        php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_BOTH | PHP_OCI_RETURN_NULLS, 2);
                   1541: }
                   1542: /* }}} */
                   1543: 
                   1544: /* {{{ proto bool oci_free_statement(resource stmt)
                   1545:    Free all resources associated with a statement */
                   1546: PHP_FUNCTION(oci_free_statement)
                   1547: {
                   1548:        zval *z_statement;
                   1549:        php_oci_statement *statement;
                   1550: 
                   1551:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   1552:                return;
                   1553:        }
                   1554: 
                   1555:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1556: 
                   1557:        zend_list_delete(statement->id);
                   1558:        RETURN_TRUE;
                   1559: }
                   1560: /* }}} */
                   1561: 
                   1562: /* {{{ proto bool oci_close(resource connection)
                   1563:    Disconnect from database */
                   1564: PHP_FUNCTION(oci_close)
                   1565: {
                   1566:        /* oci_close for pconnect (if old_oci_close_semantics not set) would
                   1567:         * release the connection back to the client-side session pool (and to the
                   1568:         * server-side pool if Database Resident Connection Pool is being used).
                   1569:         * Subsequent pconnects in the same script are not guaranteed to get the
                   1570:         * same database session.
                   1571:         */
                   1572: 
                   1573:        zval *z_connection;
                   1574:        php_oci_connection *connection;
                   1575: 
                   1576:        if (OCI_G(old_oci_close_semantics)) {
                   1577:                /* do nothing to keep BC */
                   1578:                return;
                   1579:        }
                   1580:        
                   1581:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
                   1582:                return;
                   1583:        }
                   1584: 
                   1585:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1586:        zend_list_delete(connection->rsrc_id);
                   1587: 
                   1588:        ZVAL_NULL(z_connection);
                   1589:        
                   1590:        RETURN_TRUE;
                   1591: }
                   1592: /* }}} */
                   1593: 
                   1594: /* {{{ proto resource oci_new_connect(string user, string pass [, string db])
                   1595:    Connect to an Oracle database and log on. Returns a new session. */
                   1596: PHP_FUNCTION(oci_new_connect)
                   1597: {
                   1598:        php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1);
                   1599: }
                   1600: /* }}} */
                   1601: 
                   1602: /* {{{ proto resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]])
                   1603:    Connect to an Oracle database and log on. Returns a new session. */
                   1604: PHP_FUNCTION(oci_connect)
                   1605: {
                   1606:        php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
                   1607: }
                   1608: /* }}} */
                   1609: 
                   1610: /* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset ]])
                   1611:    Connect to an Oracle database using a persistent connection and log on. Returns a new session. */
                   1612: PHP_FUNCTION(oci_pconnect)
                   1613: {
                   1614:        php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0);
                   1615: }
                   1616: /* }}} */
                   1617: 
                   1618: /* {{{ proto array oci_error([resource stmt|connection|global])
                   1619:    Return the last error of stmt|connection|global. If no error happened returns false. */
                   1620: PHP_FUNCTION(oci_error)
                   1621: {
                   1622:        zval *arg = NULL;
                   1623:        php_oci_statement *statement;
                   1624:        php_oci_connection *connection;
                   1625:        text *errbuf;
                   1626:        sb4 errcode = 0;
                   1627:        sword error = OCI_SUCCESS;
                   1628:        dvoid *errh = NULL;
                   1629:        ub2 error_offset = 0;
                   1630:        text *sqltext = NULL;
                   1631: 
                   1632:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg) == FAILURE) {
                   1633:                return;
                   1634:        }
                   1635: 
                   1636:        if (ZEND_NUM_ARGS() > 0) {
                   1637:                statement = (php_oci_statement *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_statement);
                   1638:        
                   1639:                if (statement) {
                   1640:                        errh = statement->err;
                   1641:                        error = statement->errcode;
                   1642: 
                   1643:                        if (php_oci_fetch_sqltext_offset(statement, &sqltext, &error_offset TSRMLS_CC)) {
                   1644:                                RETURN_FALSE;
                   1645:                        }
                   1646:                        goto go_out;
                   1647:                }
                   1648: 
                   1649:                connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_connection);
                   1650:                if (connection) {
                   1651:                        errh = connection->err;
                   1652:                        error = connection->errcode;
                   1653:                        goto go_out;
                   1654:                }
                   1655: 
                   1656:                connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_pconnection);
                   1657:                if (connection) {
                   1658:                        errh = connection->err;
                   1659:                        error = connection->errcode;
                   1660:                        goto go_out;
                   1661:                }
                   1662:        } else {
                   1663:                errh = OCI_G(err);
                   1664:                error = OCI_G(errcode);
                   1665:        }
                   1666: 
                   1667: go_out:
                   1668:        if (error == OCI_SUCCESS) { /* no error set in the handle */
                   1669:                RETURN_FALSE;
                   1670:        }
                   1671: 
                   1672:        if (!errh) {
                   1673:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Oci_error: unable to find error handle");
                   1674:                RETURN_FALSE;
                   1675:        }
                   1676: 
                   1677:        errcode = php_oci_fetch_errmsg(errh, &errbuf TSRMLS_CC);
                   1678: 
                   1679:        if (errcode) {
                   1680:                array_init(return_value);
                   1681:                add_assoc_long(return_value, "code", errcode);
                   1682:                add_assoc_string(return_value, "message", (char*) errbuf, 0);
                   1683:                add_assoc_long(return_value, "offset", error_offset);
                   1684:                add_assoc_string(return_value, "sqltext", sqltext ? (char *) sqltext : "", 1);
                   1685:        } else {
                   1686:                RETURN_FALSE;
                   1687:        }
                   1688: }
                   1689: /* }}} */
                   1690: 
                   1691: /* {{{ proto int oci_num_fields(resource stmt)
                   1692:    Return the number of result columns in a statement */
                   1693: PHP_FUNCTION(oci_num_fields)
                   1694: {
                   1695:        zval *z_statement;
                   1696:        php_oci_statement *statement;
                   1697: 
                   1698:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   1699:                return;
                   1700:        }
                   1701: 
                   1702:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1703: 
                   1704:        RETURN_LONG(statement->ncolumns);
                   1705: }
                   1706: /* }}} */
                   1707: 
                   1708: /* {{{ proto resource oci_parse(resource connection, string statement)
                   1709:    Parse a SQL or PL/SQL statement and return a statement resource */
                   1710: PHP_FUNCTION(oci_parse)
                   1711: {
                   1712:        zval *z_connection;
                   1713:        php_oci_connection *connection;
                   1714:        php_oci_statement *statement;
                   1715:        char *query;
                   1716:        int query_len;
                   1717: 
                   1718:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &query, &query_len) == FAILURE) {
                   1719:                return;
                   1720:        }
                   1721: 
                   1722:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1723: 
                   1724:        statement = php_oci_statement_create(connection, query, query_len TSRMLS_CC);
                   1725: 
                   1726:        if (statement) {
                   1727:                RETURN_RESOURCE(statement->id);
                   1728:        }
                   1729:        RETURN_FALSE;
                   1730: }
                   1731: /* }}} */
                   1732: 
                   1733: /* {{{ proto bool oci_set_prefetch(resource stmt, int prefetch_rows)
                   1734:   Sets the number of rows to be prefetched on execute to prefetch_rows for stmt */
                   1735: PHP_FUNCTION(oci_set_prefetch)
                   1736: {
                   1737:        zval *z_statement;
                   1738:        php_oci_statement *statement;
                   1739:        long size;
                   1740: 
                   1741:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &z_statement, &size) == FAILURE) {
                   1742:                return;
                   1743:        }
                   1744: 
                   1745:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   1746: 
                   1747:        if (php_oci_statement_set_prefetch(statement, size TSRMLS_CC)) {
                   1748:                RETURN_FALSE;
                   1749:        }
                   1750:        RETURN_TRUE;
                   1751: }
                   1752: /* }}} */
                   1753: 
                   1754: /* {{{ proto bool oci_set_client_identifier(resource connection, string value)
                   1755:   Sets the client identifier attribute on the connection */
                   1756: PHP_FUNCTION(oci_set_client_identifier)
                   1757: {
                   1758:        zval *z_connection;
                   1759:        php_oci_connection *connection;
                   1760:        char *client_id;
                   1761:        int client_id_len;
                   1762: 
                   1763:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_id, &client_id_len) == FAILURE) {
                   1764:                return;
                   1765:        }
                   1766: 
                   1767:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1768: 
                   1769:        PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err)));
                   1770: 
                   1771:        if (OCI_G(errcode) != OCI_SUCCESS) {
                   1772:                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                   1773:                RETURN_FALSE;
                   1774:        }
                   1775: 
                   1776:        RETURN_TRUE;
                   1777: }
                   1778: /* }}} */
                   1779: 
                   1780: /* {{{ proto bool oci_set_edition(string value)
                   1781:   Sets the edition attribute for all subsequent connections created */
                   1782: PHP_FUNCTION(oci_set_edition)
                   1783: {
                   1784: #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2)))
                   1785:        char *edition;
                   1786:        int edition_len;
                   1787: 
                   1788:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &edition, &edition_len) == FAILURE) {
                   1789:                return;
                   1790:        }
                   1791: 
                   1792:        if (OCI_G(edition)) {
                   1793:                efree(OCI_G(edition));
                   1794:                OCI_G(edition) = NULL;
                   1795:        }
                   1796: 
                   1797:        if (edition) {
                   1798:                OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(text), 0);
                   1799:                memcpy(OCI_G(edition), edition, edition_len);
                   1800:                OCI_G(edition)[edition_len] = '\0';
                   1801:        }
                   1802: 
                   1803:        RETURN_TRUE;
                   1804: #else
                   1805:        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
                   1806:        RETURN_FALSE;
                   1807: #endif
                   1808: }
                   1809: /* }}} */
                   1810: 
                   1811: /* {{{ proto bool oci_set_module_name(resource connection, string value)
                   1812:   Sets the module attribute on the connection */
                   1813: PHP_FUNCTION(oci_set_module_name)
                   1814: {
                   1815: #if (OCI_MAJOR_VERSION >= 10)
                   1816:        zval *z_connection;
                   1817:        php_oci_connection *connection;
                   1818:        char *module;
                   1819:        int module_len;
                   1820: 
                   1821:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &module, &module_len) == FAILURE) {
                   1822:                return;
                   1823:        }
                   1824: 
                   1825:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1826: 
                   1827:        PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err)));
                   1828: 
                   1829:        if (OCI_G(errcode) != OCI_SUCCESS) {
                   1830:                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                   1831:                RETURN_FALSE;
                   1832:        }
                   1833: 
                   1834:        RETURN_TRUE;
                   1835: #else
                   1836:        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
                   1837:        RETURN_FALSE;
                   1838: #endif
                   1839: }
                   1840: /* }}} */
                   1841: 
                   1842: /* {{{ proto bool oci_set_action(resource connection, string value)
                   1843:   Sets the action attribute on the connection */
                   1844: PHP_FUNCTION(oci_set_action)
                   1845: {
                   1846: #if (OCI_MAJOR_VERSION >= 10)
                   1847:        zval *z_connection;
                   1848:        php_oci_connection *connection;
                   1849:        char *action;
                   1850:        int action_len;
                   1851: 
                   1852:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &action, &action_len) == FAILURE) {
                   1853:                return;
                   1854:        }
                   1855: 
                   1856:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1857: 
                   1858:        PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err)));
                   1859: 
                   1860:        if (OCI_G(errcode) != OCI_SUCCESS) {
                   1861:                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                   1862:                RETURN_FALSE;
                   1863:        }
                   1864: 
                   1865:        RETURN_TRUE;
                   1866: #else
                   1867:        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
                   1868:        RETURN_FALSE;
                   1869: #endif
                   1870: }
                   1871: /* }}} */
                   1872: 
                   1873: /* {{{ proto bool oci_set_client_info(resource connection, string value)
                   1874:   Sets the client info attribute on the connection */
                   1875: PHP_FUNCTION(oci_set_client_info)
                   1876: {
                   1877: #if (OCI_MAJOR_VERSION >= 10)
                   1878:        zval *z_connection;
                   1879:        php_oci_connection *connection;
                   1880:        char *client_info;
                   1881:        int client_info_len;
                   1882: 
                   1883:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_info, &client_info_len) == FAILURE) {
                   1884:                return;
                   1885:        }
                   1886: 
                   1887:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1888: 
                   1889:        PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err)));
                   1890: 
                   1891:        if (OCI_G(errcode) != OCI_SUCCESS) {
                   1892:                php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
                   1893:                RETURN_FALSE;
                   1894:        }
                   1895: 
                   1896:        RETURN_TRUE;
                   1897: #else
                   1898:        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
                   1899:        RETURN_FALSE;
                   1900: #endif
                   1901: }
                   1902: /* }}} */
                   1903: 
                   1904: /* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password)
                   1905:   Changes the password of an account */
                   1906: PHP_FUNCTION(oci_password_change)
                   1907: {
                   1908:        zval *z_connection;
                   1909:        char *user, *pass_old, *pass_new, *dbname;
                   1910:        int user_len, pass_old_len, pass_new_len, dbname_len;
                   1911:        php_oci_connection *connection;
                   1912: 
                   1913: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
                   1914:        /* Safe mode has been removed in PHP 5.4 */
                   1915:        if (PG(safe_mode)) {
                   1916:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "is disabled in Safe Mode");
                   1917:                RETURN_FALSE;
                   1918:        }
                   1919: #endif
                   1920: 
                   1921:        if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "rsss", &z_connection, &user, &user_len, &pass_old, &pass_old_len, &pass_new, &pass_new_len) == SUCCESS) {
                   1922:                PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1923: 
                   1924:                if (!user_len) {
                   1925:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty");
                   1926:                        RETURN_FALSE;
                   1927:                }
                   1928:                if (!pass_old_len) {
                   1929:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty");
                   1930:                        RETURN_FALSE;
                   1931:                }
                   1932:                if (!pass_new_len) {
                   1933:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty");
                   1934:                        RETURN_FALSE;
                   1935:                }
                   1936: 
                   1937:                if (php_oci_password_change(connection, user, user_len, pass_old, pass_old_len, pass_new, pass_new_len TSRMLS_CC)) {
                   1938:                        RETURN_FALSE;
                   1939:                }
                   1940:                RETURN_TRUE;
                   1941:        } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "ssss", &dbname, &dbname_len, &user, &user_len, &pass_old, &pass_old_len, &pass_new, &pass_new_len) == SUCCESS) {
                   1942: 
                   1943:                if (!user_len) {
                   1944:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty");
                   1945:                        RETURN_FALSE;
                   1946:                }
                   1947:                if (!pass_old_len) {
                   1948:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty");
                   1949:                        RETURN_FALSE;
                   1950:                }
                   1951:                if (!pass_new_len) {
                   1952:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty");
                   1953:                        RETURN_FALSE;
                   1954:                }
                   1955: 
                   1956:                connection = php_oci_do_connect_ex(user, user_len, pass_old, pass_old_len, pass_new, pass_new_len, dbname, dbname_len, NULL, OCI_DEFAULT, 0, 0 TSRMLS_CC);
                   1957:                if (!connection) {
                   1958:                        RETURN_FALSE;
                   1959:                }
                   1960:                RETURN_RESOURCE(connection->rsrc_id);
                   1961:        }
                   1962:        WRONG_PARAM_COUNT;
                   1963: }
                   1964: /* }}} */
                   1965: 
                   1966: /* {{{ proto resource oci_new_cursor(resource connection)
                   1967:    Return a new cursor (Statement-Handle) - use this to bind ref-cursors! */
                   1968: PHP_FUNCTION(oci_new_cursor)
                   1969: {
                   1970:        zval *z_connection;
                   1971:        php_oci_connection *connection;
                   1972:        php_oci_statement *statement;
                   1973: 
                   1974:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
                   1975:                return;
                   1976:        }
                   1977: 
                   1978:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   1979: 
                   1980:        statement = php_oci_statement_create(connection, NULL, 0 TSRMLS_CC);
                   1981:        
                   1982:        if (statement) {
                   1983:                RETURN_RESOURCE(statement->id);
                   1984:        }
                   1985:        RETURN_FALSE;
                   1986: }
                   1987: /* }}} */
                   1988: 
                   1989: /* {{{ proto string oci_result(resource stmt, mixed column)
                   1990:    Return a single column of result data */
                   1991: PHP_FUNCTION(oci_result)
                   1992: {
                   1993:        php_oci_out_column *column;
                   1994:        
                   1995:        column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
                   1996:        if(column) {
                   1997:                php_oci_column_to_zval(column, return_value, 0 TSRMLS_CC);
                   1998:        }
                   1999:        else {
                   2000:                RETURN_FALSE;
                   2001:        }
                   2002: }
                   2003: /* }}} */
                   2004: 
                   2005: /* {{{ proto string oci_client_version()
                   2006:    Return a string containing runtime client library version information */
                   2007: PHP_FUNCTION(oci_client_version)
                   2008: {
                   2009:        char *version = NULL;
                   2010: 
                   2011:        php_oci_client_get_version(&version TSRMLS_CC);
                   2012:        RETURN_STRING(version, 0);
                   2013: }
                   2014: /* }}} */
                   2015: 
                   2016: /* {{{ proto string oci_server_version(resource connection)
                   2017:    Return a string containing server version information */
                   2018: PHP_FUNCTION(oci_server_version)
                   2019: {
                   2020:        zval *z_connection;
                   2021:        php_oci_connection *connection;
                   2022:        char *version = NULL;
                   2023: 
                   2024:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
                   2025:                return;
                   2026:        }
                   2027: 
                   2028:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   2029: 
                   2030:        if (php_oci_server_get_version(connection, &version TSRMLS_CC)) {
                   2031:                RETURN_FALSE;
                   2032:        }
                   2033:        
                   2034:        RETURN_STRING(version, 0);
                   2035: }
                   2036: /* }}} */
                   2037: 
                   2038: /* {{{ proto string oci_statement_type(resource stmt)
                   2039:    Return the query type of an OCI statement */
                   2040: PHP_FUNCTION(oci_statement_type)
                   2041: {
                   2042:        zval *z_statement;
                   2043:        php_oci_statement *statement;
                   2044:        ub2 type;
                   2045: 
                   2046:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   2047:                return;
                   2048:        }
                   2049: 
                   2050:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   2051: 
                   2052:        if (php_oci_statement_get_type(statement, &type TSRMLS_CC)) {
                   2053:                RETURN_FALSE;
                   2054:        }
                   2055: 
                   2056:        switch (type) {
                   2057:                case OCI_STMT_SELECT:
                   2058:                        RETVAL_STRING("SELECT",1);
                   2059:                        break;
                   2060:                case OCI_STMT_UPDATE:
                   2061:                        RETVAL_STRING("UPDATE",1);
                   2062:                        break;
                   2063:                case OCI_STMT_DELETE:
                   2064:                        RETVAL_STRING("DELETE",1);
                   2065:                        break;
                   2066:                case OCI_STMT_INSERT:
                   2067:                        RETVAL_STRING("INSERT",1);
                   2068:                        break;
                   2069:                case OCI_STMT_CREATE:
                   2070:                        RETVAL_STRING("CREATE",1);
                   2071:                        break;
                   2072:                case OCI_STMT_DROP:
                   2073:                        RETVAL_STRING("DROP",1);
                   2074:                        break;
                   2075:                case OCI_STMT_ALTER:
                   2076:                        RETVAL_STRING("ALTER",1);
                   2077:                        break;
                   2078:                case OCI_STMT_BEGIN:
                   2079:                        RETVAL_STRING("BEGIN",1);
                   2080:                        break;
                   2081:                case OCI_STMT_DECLARE:
                   2082:                        RETVAL_STRING("DECLARE",1);
                   2083:                        break;
                   2084:                case OCI_STMT_CALL:
                   2085:                        RETVAL_STRING("CALL",1);
                   2086:                        break;
                   2087:                default:
                   2088:                        RETVAL_STRING("UNKNOWN",1);
                   2089:        }
                   2090: }
                   2091: /* }}} */
                   2092: 
                   2093: /* {{{ proto int oci_num_rows(resource stmt)
                   2094:    Return the row count of an OCI statement */
                   2095: PHP_FUNCTION(oci_num_rows)
                   2096: {
                   2097:        zval *z_statement;
                   2098:        php_oci_statement *statement;
                   2099:        ub4 rowcount;
                   2100: 
                   2101:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
                   2102:                return;
                   2103:        }
                   2104: 
                   2105:        PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
                   2106: 
                   2107:        if (php_oci_statement_get_numrows(statement, &rowcount TSRMLS_CC)) {
                   2108:                RETURN_FALSE;
                   2109:        }
                   2110:        RETURN_LONG(rowcount);
                   2111: }
                   2112: /* }}} */
                   2113: 
                   2114: /* {{{ proto bool oci_free_collection()
                   2115:    Deletes collection object*/
                   2116: PHP_FUNCTION(oci_free_collection)
                   2117: {
                   2118:        zval **tmp, *z_collection = getThis();
                   2119:        php_oci_collection *collection;
                   2120: 
                   2121:        if (!getThis()) {
                   2122:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
                   2123:                        return;
                   2124:                }       
                   2125:        }
                   2126:        
                   2127:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2128:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2129:                RETURN_FALSE;
                   2130:        }
                   2131:        
                   2132:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2133: 
                   2134:        zend_list_delete(collection->id);
                   2135:        RETURN_TRUE;
                   2136: }
                   2137: /* }}} */
                   2138: 
                   2139: /* {{{ proto bool oci_collection_append(string value)
                   2140:    Append an object to the collection */
                   2141: PHP_FUNCTION(oci_collection_append)
                   2142: {
                   2143:        zval **tmp, *z_collection = getThis();
                   2144:        php_oci_collection *collection;
                   2145:        char *value;
                   2146:        int value_len;
                   2147: 
                   2148:        if (getThis()) {
                   2149:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
                   2150:                        return;
                   2151:                }
                   2152:        }
                   2153:        else {
                   2154:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_collection, oci_coll_class_entry_ptr, &value, &value_len) == FAILURE) {
                   2155:                        return;
                   2156:                }       
                   2157:        }
                   2158:        
                   2159:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2160:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2161:                RETURN_FALSE;
                   2162:        }
                   2163:        
                   2164:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2165: 
                   2166:        if (php_oci_collection_append(collection, value, value_len TSRMLS_CC)) {
                   2167:                RETURN_FALSE;
                   2168:        }
                   2169:        RETURN_TRUE;
                   2170: }
                   2171: /* }}} */
                   2172: 
                   2173: /* {{{ proto string oci_collection_element_get(int ndx)
                   2174:    Retrieve the value at collection index ndx */
                   2175: PHP_FUNCTION(oci_collection_element_get)
                   2176: {
                   2177:        zval **tmp, *z_collection = getThis();
                   2178:        php_oci_collection *collection;
                   2179:        long element_index;
                   2180:        zval *value;
                   2181: 
                   2182:        if (getThis()) {
                   2183:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &element_index) == FAILURE) {
                   2184:                        return;
                   2185:                }
                   2186:        }
                   2187:        else {
                   2188:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &element_index) == FAILURE) {
                   2189:                        return;
                   2190:                }       
                   2191:        }
                   2192:        
                   2193:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2194:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2195:                RETURN_FALSE;
                   2196:        }
                   2197:        
                   2198:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2199: 
                   2200:        if (php_oci_collection_element_get(collection, element_index, &value TSRMLS_CC)) {
                   2201:                RETURN_FALSE;
                   2202:        }
                   2203:        
                   2204:        *return_value = *value;
                   2205:        zval_copy_ctor(return_value);
                   2206:        zval_ptr_dtor(&value);
                   2207: }
                   2208: /* }}} */
                   2209: 
                   2210: /* {{{ proto bool oci_collection_assign(object from)
                   2211:    Assign a collection from another existing collection */
                   2212: PHP_FUNCTION(oci_collection_assign)
                   2213: {
                   2214:        zval **tmp_dest, **tmp_from, *z_collection_dest = getThis(), *z_collection_from;
                   2215:        php_oci_collection *collection_dest, *collection_from;
                   2216: 
                   2217:        if (getThis()) {
                   2218:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection_from, oci_coll_class_entry_ptr) == FAILURE) {
                   2219:                        return;
                   2220:                }
                   2221:        }
                   2222:        else {
                   2223:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_collection_dest, oci_coll_class_entry_ptr, &z_collection_from, oci_coll_class_entry_ptr) == FAILURE) {
                   2224:                        return;
                   2225:                }       
                   2226:        }
                   2227:        
                   2228:        if (zend_hash_find(Z_OBJPROP_P(z_collection_dest), "collection", sizeof("collection"), (void **)&tmp_dest) == FAILURE) {
                   2229:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The first argument should be valid collection object");
                   2230:                RETURN_FALSE;
                   2231:        }
                   2232: 
                   2233:        if (zend_hash_find(Z_OBJPROP_P(z_collection_from), "collection", sizeof("collection"), (void **)&tmp_from) == FAILURE) {
                   2234:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The second argument should be valid collection object");
                   2235:                RETURN_FALSE;
                   2236:        }
                   2237: 
                   2238:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp_dest, collection_dest);
                   2239:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp_from, collection_from);
                   2240: 
                   2241:        if (php_oci_collection_assign(collection_dest, collection_from TSRMLS_CC)) {
                   2242:                RETURN_FALSE;
                   2243:        }
                   2244:        RETURN_TRUE;
                   2245: }
                   2246: /* }}} */
                   2247: 
                   2248: /* {{{ proto bool oci_collection_element_assign(int index, string val)
                   2249:    Assign element val to collection at index ndx */
                   2250: PHP_FUNCTION(oci_collection_element_assign)
                   2251: {
                   2252:        zval **tmp, *z_collection = getThis();
                   2253:        php_oci_collection *collection;
                   2254:        int value_len;
                   2255:        long element_index;
                   2256:        char *value;
                   2257: 
                   2258:        if (getThis()) {
                   2259:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &element_index, &value, &value_len) == FAILURE) {
                   2260:                        return;
                   2261:                }
                   2262:        }
                   2263:        else {
                   2264:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ols", &z_collection, oci_coll_class_entry_ptr, &element_index, &value, &value_len) == FAILURE) {
                   2265:                        return;
                   2266:                }       
                   2267:        }
                   2268:        
                   2269:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2270:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2271:                RETURN_FALSE;
                   2272:        }
                   2273:        
                   2274:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2275: 
                   2276:        if (php_oci_collection_element_set(collection, element_index, value, value_len TSRMLS_CC)) {
                   2277:                RETURN_FALSE;
                   2278:        }
                   2279:        RETURN_TRUE;
                   2280: }
                   2281: /* }}} */
                   2282: 
                   2283: /* {{{ proto int oci_collection_size()
                   2284:    Return the size of a collection */
                   2285: PHP_FUNCTION(oci_collection_size)
                   2286: {
                   2287:        zval **tmp, *z_collection = getThis();
                   2288:        php_oci_collection *collection;
                   2289:        sb4 size = 0;
                   2290:        
                   2291:        if (!getThis()) {
                   2292:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
                   2293:                        return;
                   2294:                }       
                   2295:        }
                   2296:        
                   2297:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2298:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2299:                RETURN_FALSE;
                   2300:        }
                   2301:        
                   2302:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2303: 
                   2304:        if (php_oci_collection_size(collection, &size TSRMLS_CC)) {
                   2305:                RETURN_FALSE;
                   2306:        }
                   2307:        RETURN_LONG(size);
                   2308: }
                   2309: /* }}} */
                   2310: 
                   2311: /* {{{ proto int oci_collection_max()
                   2312:    Return the max value of a collection. For a varray this is the maximum length of the array */
                   2313: PHP_FUNCTION(oci_collection_max)
                   2314: {
                   2315:        zval **tmp, *z_collection = getThis();
                   2316:        php_oci_collection *collection;
                   2317:        long max;
                   2318:        
                   2319:        if (!getThis()) {
                   2320:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
                   2321:                        return;
                   2322:                }       
                   2323:        }
                   2324:        
                   2325:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2326:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2327:                RETURN_FALSE;
                   2328:        }
                   2329:        
                   2330:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2331: 
                   2332:        if (php_oci_collection_max(collection, &max TSRMLS_CC)) {
                   2333:                RETURN_FALSE;
                   2334:        }
                   2335:        RETURN_LONG(max);
                   2336: }
                   2337: /* }}} */
                   2338: 
                   2339: /* {{{ proto bool oci_collection_trim(int num)
                   2340:    Trim num elements from the end of a collection */
                   2341: PHP_FUNCTION(oci_collection_trim)
                   2342: {
                   2343:        zval **tmp, *z_collection = getThis();
                   2344:        php_oci_collection *collection;
                   2345:        long trim_size;
                   2346: 
                   2347:        if (getThis()) {
                   2348:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &trim_size) == FAILURE) {
                   2349:                        return;
                   2350:                }
                   2351:        }
                   2352:        else {
                   2353:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &trim_size) == FAILURE) {
                   2354:                        return;
                   2355:                }       
                   2356:        }
                   2357:        
                   2358:        if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
                   2359:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
                   2360:                RETURN_FALSE;
                   2361:        }
                   2362:        
                   2363:        PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
                   2364: 
                   2365:        if (php_oci_collection_trim(collection, trim_size TSRMLS_CC)) {
                   2366:                RETURN_FALSE;
                   2367:        }
                   2368:        RETURN_TRUE;    
                   2369: }
                   2370: /* }}} */
                   2371: 
                   2372: /* {{{ proto object oci_new_collection(resource connection, string tdo [, string schema])
                   2373:    Initialize a new collection */
                   2374: PHP_FUNCTION(oci_new_collection)
                   2375: {
                   2376:        zval *z_connection;
                   2377:        php_oci_connection *connection;
                   2378:        php_oci_collection *collection;
                   2379:        char *tdo, *schema = NULL;
                   2380:        int tdo_len, schema_len = 0;
                   2381:        
                   2382:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &z_connection, &tdo, &tdo_len, &schema, &schema_len) == FAILURE) {
                   2383:                return;
                   2384:        }
                   2385:        
                   2386:        PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
                   2387:        
                   2388:        if ( (collection = php_oci_collection_create(connection, tdo, tdo_len, schema, schema_len TSRMLS_CC)) ) {
                   2389:                object_init_ex(return_value, oci_coll_class_entry_ptr);
                   2390:                add_property_resource(return_value, "collection", collection->id);
                   2391:        }
                   2392:        else {
                   2393:                RETURN_FALSE;
                   2394:        }
                   2395: }
                   2396: /* }}} */
                   2397: 
                   2398: #endif /* HAVE_OCI8 */
                   2399: 
                   2400: /*
                   2401:  * Local variables:
                   2402:  * tab-width: 4
                   2403:  * c-basic-offset: 4
                   2404:  * End:
                   2405:  * vim600: noet sw=4 ts=4 fdm=marker
                   2406:  * vim<600: noet sw=4 ts=4
                   2407:  */

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