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

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: 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: 
        !            28: /* $Id: oci8_interface.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            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>