Annotation of embedaddon/php/ext/oci8/oci8_collection.c, revision 1.1.1.3

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
1.1.1.3 ! misho       5:    | Copyright (c) 1997-2013 The PHP Group                                |
1.1       misho       6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Authors: Stig Sæther Bakken <ssb@php.net>                            |
                     16:    |          Thies C. Arntzen <thies@thieso.net>                         |
                     17:    |                                                                      |
                     18:    | Collection support by Andy Sautins <asautins@veripost.net>           |
                     19:    | Temporary LOB support by David Benson <dbenson@mancala.com>          |
                     20:    | ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at>        |
                     21:    |                                                                      |
                     22:    | Redesigned by: Antony Dovgal <antony@zend.com>                       |
                     23:    |                Andi Gutmans <andi@zend.com>                          |
                     24:    |                Wez Furlong <wez@omniti.com>                          |
                     25:    +----------------------------------------------------------------------+
                     26: */
                     27: 
1.1.1.2   misho      28: /* $Id$ */
1.1       misho      29: 
                     30: 
                     31: 
                     32: #ifdef HAVE_CONFIG_H
                     33: #include "config.h"
                     34: #endif
                     35: 
                     36: #include "php.h"
                     37: #include "ext/standard/info.h"
                     38: #include "php_ini.h"
                     39: 
                     40: #if HAVE_OCI8
                     41: 
                     42: #include "php_oci8.h"
                     43: #include "php_oci8_int.h"
                     44: 
                     45: /* {{{ php_oci_collection_create()
                     46:  Create and return connection handle */
                     47: php_oci_collection * php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC)
                     48: {      
                     49:        dvoid *dschp1 = NULL;
                     50:        dvoid *parmp1;
                     51:        dvoid *parmp2;
                     52:        php_oci_collection *collection;
                     53:        
                     54:        collection = emalloc(sizeof(php_oci_collection));
                     55: 
                     56:        collection->connection = connection;
                     57:        collection->collection = NULL;
                     58:        zend_list_addref(collection->connection->rsrc_id);
                     59: 
                     60:        /* get type handle by name */
                     61:        PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByName,
                     62:                        (
                     63:                         connection->env,
                     64:                         connection->err,
                     65:                         connection->svc,
                     66:                         (text *) schema,
                     67:                         (ub4) schema_len,
                     68:                         (text *) tdo,
                     69:                         (ub4) tdo_len,
                     70:                         (CONST text *) 0,
                     71:                         (ub4) 0,
                     72:                         OCI_DURATION_SESSION,
                     73:                         OCI_TYPEGET_ALL,
                     74:                         &(collection->tdo)
                     75:                        )
                     76:        );
                     77: 
                     78:        if (connection->errcode != OCI_SUCCESS) {
                     79:                goto CLEANUP;
                     80:        }
                     81: 
                     82:        /* allocate describe handle */
                     83:        PHP_OCI_CALL_RETURN(connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0));
                     84: 
                     85:        if (connection->errcode != OCI_SUCCESS) {
                     86:                goto CLEANUP;
                     87:        }
                     88: 
                     89:        /* describe TDO */
                     90:        PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny,
                     91:                        (
                     92:                         connection->svc,
                     93:                         connection->err,
                     94:                         (dvoid *) collection->tdo,
                     95:                         (ub4) 0,
                     96:                         OCI_OTYPE_PTR,
                     97:                         (ub1) OCI_DEFAULT,
                     98:                         (ub1) OCI_PTYPE_TYPE,
                     99:                         dschp1
                    100:                        )
                    101:        );
                    102: 
                    103:        if (connection->errcode != OCI_SUCCESS) {
                    104:                goto CLEANUP;
                    105:        }
                    106: 
                    107:        /* get first parameter handle */
                    108:        PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM,      connection->err));
                    109: 
                    110:        if (connection->errcode != OCI_SUCCESS) {
                    111:                goto CLEANUP;
                    112:        }
                    113: 
                    114:        /* get the collection type code of the attribute */
                    115:        PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
                    116:                        (
                    117:                         (dvoid*) parmp1,
                    118:                         (ub4) OCI_DTYPE_PARAM,
                    119:                         (dvoid*) &(collection->coll_typecode),
                    120:                         (ub4 *) 0,
                    121:                         (ub4) OCI_ATTR_COLLECTION_TYPECODE,
                    122:                         connection->err
                    123:                        )
                    124:        );
                    125: 
                    126:        if (connection->errcode != OCI_SUCCESS) {
                    127:                goto CLEANUP;
                    128:        }
                    129: 
                    130:        switch(collection->coll_typecode) {
                    131:                case OCI_TYPECODE_TABLE:
                    132:                case OCI_TYPECODE_VARRAY:
                    133:                        /* get collection element handle */
                    134:                        PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
                    135:                                        (
                    136:                                         (dvoid*) parmp1,
                    137:                                         (ub4) OCI_DTYPE_PARAM,
                    138:                                         (dvoid*) &parmp2,
                    139:                                         (ub4 *) 0,
                    140:                                         (ub4) OCI_ATTR_COLLECTION_ELEMENT,
                    141:                                         connection->err
                    142:                                        )
                    143:                        );
                    144: 
                    145:                        if (connection->errcode != OCI_SUCCESS) {
                    146:                                goto CLEANUP;
                    147:                        }
                    148: 
                    149:                        /* get REF of the TDO for the type */
                    150:                        PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
                    151:                                        (
                    152:                                         (dvoid*) parmp2,
                    153:                                         (ub4) OCI_DTYPE_PARAM,
                    154:                                         (dvoid*) &(collection->elem_ref),
                    155:                                         (ub4 *) 0,
                    156:                                         (ub4) OCI_ATTR_REF_TDO,
                    157:                                         connection->err
                    158:                                        )
                    159:                        );
                    160: 
                    161:                        if (connection->errcode != OCI_SUCCESS) {
                    162:                                goto CLEANUP;
                    163:                        }
                    164: 
                    165:                        /* get the TDO (only header) */
                    166:                        PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef,
                    167:                                        (
                    168:                                         connection->env,
                    169:                                         connection->err,
                    170:                                         collection->elem_ref,
                    171:                                         OCI_DURATION_SESSION,
                    172:                                         OCI_TYPEGET_HEADER,
                    173:                                         &(collection->element_type)
                    174:                                        )
                    175:                        );
                    176: 
                    177:                        if (connection->errcode != OCI_SUCCESS) {
                    178:                                goto CLEANUP;
                    179:                        }
                    180: 
                    181:                        /* get typecode */
                    182:                        PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet,
                    183:                                        (
                    184:                                         (dvoid*) parmp2,
                    185:                                         (ub4) OCI_DTYPE_PARAM,
                    186:                                         (dvoid*) &(collection->element_typecode),
                    187:                                         (ub4 *) 0,
                    188:                                         (ub4) OCI_ATTR_TYPECODE,
                    189:                                         connection->err
                    190:                                        )
                    191:                        );
                    192: 
                    193:                        if (connection->errcode != OCI_SUCCESS) {
                    194:                                goto CLEANUP;
                    195:                        }
                    196:                        break;
                    197:                        /* we only support VARRAYs and TABLEs */
                    198:                default:
                    199:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "unknown collection type %d", collection->coll_typecode);
                    200:                        break;
                    201:        }       
                    202: 
                    203:        /* Create object to hold return table */
                    204:        PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew,
                    205:                (
                    206:                        connection->env,
                    207:                        connection->err,
                    208:                        connection->svc,
                    209:                        OCI_TYPECODE_TABLE,
                    210:                        collection->tdo,
                    211:                        (dvoid *)0,
                    212:                        OCI_DURATION_DEFAULT,
                    213:                        TRUE,
                    214:                        (dvoid **) &(collection->collection)
                    215:                )
                    216:        );
                    217: 
                    218:        if (connection->errcode != OCI_SUCCESS) {
                    219:                goto CLEANUP;
                    220:        }
                    221: 
                    222:        /* free the describe handle (Bug #44113) */
                    223:        PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
                    224:        PHP_OCI_REGISTER_RESOURCE(collection, le_collection);
                    225:        return collection;
                    226:        
                    227: CLEANUP:
                    228: 
                    229:        if (dschp1) {
                    230:                /* free the describe handle (Bug #44113) */
                    231:                PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
                    232:        }
                    233:        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    234:        PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    235:        php_oci_collection_close(collection TSRMLS_CC); 
                    236:        return NULL;
                    237: } /* }}} */
                    238: 
                    239: /* {{{ php_oci_collection_size()
                    240:  Return size of the collection */
                    241: int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC)
                    242: {
                    243:        php_oci_connection *connection = collection->connection;
                    244:        
                    245:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size));
                    246: 
                    247:        if (connection->errcode != OCI_SUCCESS) {
                    248:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    249:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    250:                return 1;
                    251:        }
                    252:        return 0;
                    253: } /* }}} */
                    254: 
                    255: /* {{{ php_oci_collection_max()
                    256:  Return max number of elements in the collection */
                    257: int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC)
                    258: {
                    259:        php_oci_connection *connection = collection->connection;
                    260:        
                    261:        PHP_OCI_CALL_RETURN(*max, OCICollMax, (connection->env, collection->collection));
                    262: 
                    263:        /* error handling is not necessary here? */
                    264:        return 0;
                    265: } /* }}} */
                    266: 
                    267: /* {{{ php_oci_collection_trim()
                    268:  Trim collection to the given number of elements */
                    269: int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRMLS_DC)
                    270: {
                    271:        php_oci_connection *connection = collection->connection;
                    272:        
                    273:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection));
                    274: 
                    275:        if (connection->errcode != OCI_SUCCESS) {
                    276:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    277:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    278:                return 1;
                    279:        }
                    280:        return 0;
                    281: } /* }}} */
                    282: 
                    283: /* {{{ php_oci_collection_append_null()
                    284:  Append NULL element to the end of the collection */
                    285: int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC)
                    286: {
                    287:        OCIInd null_index = OCI_IND_NULL;
                    288:        php_oci_connection *connection = collection->connection;
                    289: 
                    290:        /* append NULL element */
                    291:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection));
                    292:        
                    293:        if (connection->errcode != OCI_SUCCESS) {
                    294:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    295:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    296:                return 1;
                    297:        }
                    298:        return 0;
                    299: } /* }}} */
                    300: 
                    301: /* {{{ php_oci_collection_append_date()
                    302:  Append DATE element to the end of the collection (use "DD-MON-YY" format) */
                    303: int php_oci_collection_append_date(php_oci_collection *collection, char *date, int date_len TSRMLS_DC)
                    304: {
                    305:        OCIInd new_index = OCI_IND_NOTNULL;
                    306:        OCIDate oci_date;
                    307:        php_oci_connection *connection = collection->connection;
                    308: 
                    309:        /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
                    310:        PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
                    311: 
                    312:        if (connection->errcode != OCI_SUCCESS) {
                    313:                /* failed to convert string to date */
                    314:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    315:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    316:                return 1;
                    317:        }
                    318: 
                    319:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
                    320:                        (
                    321:                         connection->env,
                    322:                         connection->err,
                    323:                         (dvoid *) &oci_date,
                    324:                         (dvoid *) &new_index,
                    325:                         (OCIColl *) collection->collection
                    326:                        )
                    327:        );
                    328: 
                    329:        if (connection->errcode != OCI_SUCCESS) {
                    330:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    331:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    332:                return 1;
                    333:        }
                    334:                        
                    335:        return 0;
                    336: } /* }}} */
                    337: 
                    338: /* {{{ php_oci_collection_append_number()
                    339:  Append NUMBER to the end of the collection */
                    340: int php_oci_collection_append_number(php_oci_collection *collection, char *number, int number_len TSRMLS_DC)
                    341: {
                    342:        OCIInd new_index = OCI_IND_NOTNULL;
                    343:        double element_double;
                    344:        OCINumber oci_number;
                    345:        php_oci_connection *connection = collection->connection;
                    346: 
                    347: #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10)
                    348:        /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */
                    349:        element_double = strtod(number, NULL);
                    350: #else
                    351:        /* zend_strtod was introduced in PHP 4.3.10 */
                    352:        element_double = zend_strtod(number, NULL);
                    353: #endif
                    354:                        
                    355:        PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
                    356: 
                    357:        if (connection->errcode != OCI_SUCCESS) {
                    358:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    359:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    360:                return 1;
                    361:        }
                    362: 
                    363:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
                    364:                        (
                    365:                         connection->env,
                    366:                         connection->err,
                    367:                         (dvoid *) &oci_number,
                    368:                         (dvoid *) &new_index,
                    369:                         (OCIColl *) collection->collection
                    370:                        )
                    371:        );
                    372: 
                    373:        if (connection->errcode != OCI_SUCCESS) {
                    374:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    375:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    376:                return 1;
                    377:        }
                    378: 
                    379:        return 0;
                    380: } /* }}} */
                    381: 
                    382: /* {{{ php_oci_collection_append_string()
                    383:  Append STRING to the end of the collection */
                    384: int php_oci_collection_append_string(php_oci_collection *collection, char *element, int element_len TSRMLS_DC)
                    385: {
                    386:        OCIInd new_index = OCI_IND_NOTNULL;
                    387:        OCIString *ocistr = (OCIString *)0;
                    388:        php_oci_connection *connection = collection->connection;
                    389:                        
                    390:        PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
                    391: 
                    392:        if (connection->errcode != OCI_SUCCESS) {
                    393:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    394:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    395:                return 1;
                    396:        }
                    397: 
                    398:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend,
                    399:                        (
                    400:                         connection->env,
                    401:                         connection->err,
                    402:                         (dvoid *) ocistr,
                    403:                         (dvoid *) &new_index,
                    404:                         (OCIColl *) collection->collection
                    405:                        )
                    406:        );
                    407: 
                    408:        if (connection->errcode != OCI_SUCCESS) {
                    409:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    410:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    411:                return 1;
                    412:        }
                    413: 
                    414:        return 0;
                    415: } /* }}} */
                    416: 
                    417: /* {{{ php_oci_collection_append()
                    418:  Append wrapper. Appends any supported element to the end of the collection */
                    419: int php_oci_collection_append(php_oci_collection *collection, char *element, int element_len TSRMLS_DC)
                    420: {
                    421:        if (element_len == 0) {
                    422:                return php_oci_collection_append_null(collection TSRMLS_CC);
                    423:        }
                    424:        
                    425:        switch(collection->element_typecode) {
                    426:                case OCI_TYPECODE_DATE:
                    427:                        return php_oci_collection_append_date(collection, element, element_len TSRMLS_CC);
                    428:                        break;
                    429:                        
                    430:                case OCI_TYPECODE_VARCHAR2 :
                    431:                        return php_oci_collection_append_string(collection, element, element_len TSRMLS_CC);
                    432:                        break;
                    433: 
                    434:                case OCI_TYPECODE_UNSIGNED16 :                                           /* UNSIGNED SHORT      */
                    435:                case OCI_TYPECODE_UNSIGNED32 :                                            /* UNSIGNED LONG      */
                    436:                case OCI_TYPECODE_REAL :                                                                         /* REAL        */
                    437:                case OCI_TYPECODE_DOUBLE :                                                                       /* DOUBLE      */
                    438:                case OCI_TYPECODE_INTEGER :                                                                             /* INT  */
                    439:                case OCI_TYPECODE_SIGNED16 :                                                              /* SHORT      */
                    440:                case OCI_TYPECODE_SIGNED32 :                                                               /* LONG      */
                    441:                case OCI_TYPECODE_DECIMAL :                                                                     /* DECIMAL      */
                    442:                case OCI_TYPECODE_FLOAT :                                                                       /* FLOAT        */
                    443:                case OCI_TYPECODE_NUMBER :                                                                      /* NUMBER       */
                    444:                case OCI_TYPECODE_SMALLINT :                                                            /* SMALLINT */
                    445:                        return php_oci_collection_append_number(collection, element, element_len TSRMLS_CC);
                    446:                        break;
                    447: 
                    448:                default:
                    449:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
                    450:                        return 1;
                    451:                        break;
                    452:        }
                    453:        /* never reached */
                    454:        return 1;
                    455: } /* }}} */
                    456: 
                    457: /* {{{ php_oci_collection_element_get()
                    458:  Get the element with the given index */
                    459: int php_oci_collection_element_get(php_oci_collection *collection, long index, zval **result_element TSRMLS_DC)
                    460: {
                    461:        php_oci_connection *connection = collection->connection;
                    462:        dvoid *element;
                    463:        OCIInd *element_index;
                    464:        boolean exists;
                    465:        oratext buff[1024];
                    466:        ub4 buff_len = 1024;
                    467:        
                    468:        MAKE_STD_ZVAL(*result_element);
                    469:        ZVAL_NULL(*result_element);
                    470: 
                    471:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem,
                    472:                        (
                    473:                         connection->env,
                    474:                         connection->err,
                    475:                         collection->collection,
                    476:                         (ub4)index,
                    477:                         &exists,
                    478:                         &element,
                    479:                         (dvoid **)&element_index
                    480:                        )
                    481:        );
                    482: 
                    483:        if (connection->errcode != OCI_SUCCESS) {
                    484:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    485:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    486:                FREE_ZVAL(*result_element);
                    487:                return 1;
                    488:        }
                    489:        
                    490:        if (exists == 0) {
                    491:                /* element doesn't exist */
                    492:                FREE_ZVAL(*result_element);
                    493:                return 1;
                    494:        }
                    495: 
                    496:        if (*element_index == OCI_IND_NULL) {
                    497:                /* this is not an error, we're returning NULL here */
                    498:                return 0;
                    499:        }
                    500: 
                    501:        switch (collection->element_typecode) {
                    502:                case OCI_TYPECODE_DATE:
                    503:                        PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff));
                    504:        
                    505:                        if (connection->errcode != OCI_SUCCESS) {
                    506:                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    507:                                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    508:                                FREE_ZVAL(*result_element);
                    509:                                return 1;
                    510:                        }
                    511: 
                    512:                        ZVAL_STRINGL(*result_element, (char *)buff, buff_len, 1);
                    513:                        Z_STRVAL_P(*result_element)[buff_len] = '\0';
                    514:                        
                    515:                        return 0;
                    516:                        break;
                    517: 
                    518:                case OCI_TYPECODE_VARCHAR2:
                    519:                {
                    520:                        OCIString *oci_string = *(OCIString **)element;
                    521:                        text *str;
                    522:                        
                    523:                        PHP_OCI_CALL_RETURN(str, OCIStringPtr, (connection->env, oci_string));
                    524:                        
                    525:                        if (str) {
                    526:                                ZVAL_STRING(*result_element, (char *)str, 1);
                    527:                        }
                    528:                        return 0;
                    529:                }
                    530:                        break;
                    531: 
                    532:                case OCI_TYPECODE_UNSIGNED16:                                           /* UNSIGNED SHORT  */
                    533:                case OCI_TYPECODE_UNSIGNED32:                                           /* UNSIGNED LONG  */
                    534:                case OCI_TYPECODE_REAL:                                                         /* REAL    */
                    535:                case OCI_TYPECODE_DOUBLE:                                                       /* DOUBLE  */
                    536:                case OCI_TYPECODE_INTEGER:                                                      /* INT  */
                    537:                case OCI_TYPECODE_SIGNED16:                                                     /* SHORT  */
                    538:                case OCI_TYPECODE_SIGNED32:                                                     /* LONG  */
                    539:                case OCI_TYPECODE_DECIMAL:                                                      /* DECIMAL      */
                    540:                case OCI_TYPECODE_FLOAT:                                                        /* FLOAT        */
                    541:                case OCI_TYPECODE_NUMBER:                                                       /* NUMBER       */
                    542:                case OCI_TYPECODE_SMALLINT:                                                     /* SMALLINT */
                    543:                {
                    544:                        double double_number;
                    545:                        
                    546:                        PHP_OCI_CALL_RETURN(connection->errcode, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number));
                    547: 
                    548:                        if (connection->errcode != OCI_SUCCESS) {
                    549:                                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    550:                                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    551:                                FREE_ZVAL(*result_element);
                    552:                                return 1;
                    553:                        }
                    554:                        
                    555:                        ZVAL_DOUBLE(*result_element, double_number);
                    556: 
                    557:                        return 0;
                    558:                }
                    559:                        break;
                    560:                default:
                    561:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
                    562:                        FREE_ZVAL(*result_element);
                    563:                        return 1;
                    564:                        break;
                    565:        }
                    566:        /* never reached */
                    567:        return 1;
                    568: } /* }}} */
                    569: 
                    570: /* {{{ php_oci_collection_element_set_null()
                    571:  Set the element with the given index to NULL */
                    572: int php_oci_collection_element_set_null(php_oci_collection *collection, long index TSRMLS_DC)
                    573: {
                    574:        OCIInd null_index = OCI_IND_NULL;
                    575:        php_oci_connection *connection = collection->connection;
                    576: 
                    577:        /* set NULL element */
                    578:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection));
                    579:        
                    580:        if (connection->errcode != OCI_SUCCESS) {
                    581:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    582:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    583:                return 1;
                    584:        }
                    585:        return 0;
                    586: } /* }}} */
                    587: 
                    588: /* {{{ php_oci_collection_element_set_date()
                    589:  Change element's value to the given DATE */
                    590: int php_oci_collection_element_set_date(php_oci_collection *collection, long index, char *date, int date_len TSRMLS_DC)
                    591: {
                    592:        OCIInd new_index = OCI_IND_NOTNULL;
                    593:        OCIDate oci_date;
                    594:        php_oci_connection *connection = collection->connection;
                    595: 
                    596:        /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
                    597:        PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
                    598: 
                    599:        if (connection->errcode != OCI_SUCCESS) {
                    600:                /* failed to convert string to date */
                    601:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    602:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    603:                return 1;
                    604:        }
                    605: 
                    606:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
                    607:                        (
                    608:                         connection->env,
                    609:                         connection->err,
                    610:                         (ub4)index,
                    611:                         (dvoid *) &oci_date,
                    612:                         (dvoid *) &new_index,
                    613:                         (OCIColl *) collection->collection
                    614:                         )
                    615:        );
                    616: 
                    617:        if (connection->errcode != OCI_SUCCESS) {
                    618:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    619:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    620:                return 1;
                    621:        }
                    622:                        
                    623:        return 0;
                    624: } /* }}} */
                    625: 
                    626: /* {{{ php_oci_collection_element_set_number()
                    627:  Change element's value to the given NUMBER */
                    628: int php_oci_collection_element_set_number(php_oci_collection *collection, long index, char *number, int number_len TSRMLS_DC)
                    629: {
                    630:        OCIInd new_index = OCI_IND_NOTNULL;
                    631:        double element_double;
                    632:        OCINumber oci_number;
                    633:        php_oci_connection *connection = collection->connection;
                    634: 
                    635: #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10)
                    636:        /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */
                    637:        element_double = strtod(number, NULL);
                    638: #else
                    639:        /* zend_strtod was introduced in PHP 4.3.10 */
                    640:        element_double = zend_strtod(number, NULL);
                    641: #endif
                    642:                        
                    643:        PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
                    644: 
                    645:        if (connection->errcode != OCI_SUCCESS) {
                    646:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    647:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    648:                return 1;
                    649:        }
                    650: 
                    651:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
                    652:                        (
                    653:                         connection->env,
                    654:                         connection->err,
                    655:                         (ub4) index,
                    656:                         (dvoid *) &oci_number,
                    657:                         (dvoid *) &new_index,
                    658:                         (OCIColl *) collection->collection
                    659:                         )
                    660:        );
                    661: 
                    662:        if (connection->errcode != OCI_SUCCESS) {
                    663:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    664:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    665:                return 1;
                    666:        }
                    667: 
                    668:        return 0;
                    669: } /* }}} */
                    670: 
                    671: /* {{{ php_oci_collection_element_set_string()
                    672:  Change element's value to the given string */
                    673: int php_oci_collection_element_set_string(php_oci_collection *collection, long index, char *element, int element_len TSRMLS_DC)
                    674: {
                    675:        OCIInd new_index = OCI_IND_NOTNULL;
                    676:        OCIString *ocistr = (OCIString *)0;
                    677:        php_oci_connection *connection = collection->connection;
                    678:                        
                    679:        PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
                    680: 
                    681:        if (connection->errcode != OCI_SUCCESS) {
                    682:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    683:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    684:                return 1;
                    685:        }
                    686: 
                    687:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem,
                    688:                        (
                    689:                         connection->env,
                    690:                         connection->err,
                    691:                         (ub4)index,
                    692:                         (dvoid *) ocistr,
                    693:                         (dvoid *) &new_index,
                    694:                         (OCIColl *) collection->collection
                    695:                         )
                    696:        );
                    697: 
                    698:        if (connection->errcode != OCI_SUCCESS) {
                    699:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    700:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    701:                return 1;
                    702:        }
                    703: 
                    704:        return 0;
                    705: } /* }}} */
                    706: 
                    707: /* {{{ php_oci_collection_element_set()
                    708:  Collection element setter */
                    709: int php_oci_collection_element_set(php_oci_collection *collection, long index, char *value, int value_len TSRMLS_DC)
                    710: {
                    711:        if (value_len == 0) {
                    712:                return php_oci_collection_element_set_null(collection, index TSRMLS_CC);
                    713:        }
                    714:        
                    715:        switch(collection->element_typecode) {
                    716:                case OCI_TYPECODE_DATE:
                    717:                        return php_oci_collection_element_set_date(collection, index, value, value_len TSRMLS_CC);
                    718:                        break;
                    719:                        
                    720:                case OCI_TYPECODE_VARCHAR2 :
                    721:                        return php_oci_collection_element_set_string(collection, index, value, value_len TSRMLS_CC);
                    722:                        break;
                    723: 
                    724:                case OCI_TYPECODE_UNSIGNED16 :                                           /* UNSIGNED SHORT      */
                    725:                case OCI_TYPECODE_UNSIGNED32 :                                            /* UNSIGNED LONG      */
                    726:                case OCI_TYPECODE_REAL :                                                                         /* REAL        */
                    727:                case OCI_TYPECODE_DOUBLE :                                                                       /* DOUBLE      */
                    728:                case OCI_TYPECODE_INTEGER :                                                                             /* INT  */
                    729:                case OCI_TYPECODE_SIGNED16 :                                                              /* SHORT      */
                    730:                case OCI_TYPECODE_SIGNED32 :                                                               /* LONG      */
                    731:                case OCI_TYPECODE_DECIMAL :                                                                     /* DECIMAL      */
                    732:                case OCI_TYPECODE_FLOAT :                                                                       /* FLOAT        */
                    733:                case OCI_TYPECODE_NUMBER :                                                                      /* NUMBER       */
                    734:                case OCI_TYPECODE_SMALLINT :                                                            /* SMALLINT */
                    735:                        return php_oci_collection_element_set_number(collection, index, value, value_len TSRMLS_CC);
                    736:                        break;
                    737: 
                    738:                default:
                    739:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
                    740:                        return 1;
                    741:                        break;
                    742:        }
                    743:        /* never reached */
                    744:        return 1;
                    745: } /* }}} */
                    746: 
                    747: /* {{{ php_oci_collection_assign()
                    748:  Assigns a value to the collection from another collection */
                    749: int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from TSRMLS_DC)
                    750: {
                    751:        php_oci_connection *connection = collection_dest->connection;
                    752:        
                    753:        PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection));
                    754: 
                    755:        if (connection->errcode != OCI_SUCCESS) {
                    756:                connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    757:                PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    758:                return 1;
                    759:        }
                    760:        return 0;
                    761: } /* }}} */
                    762: 
                    763: /* {{{ php_oci_collection_close()
                    764:  Destroy collection and all associated resources */
                    765: void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC)
                    766: {
                    767:        php_oci_connection *connection = collection->connection;
                    768: 
                    769:        if (collection->collection) {
                    770:                PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE));
                    771: 
                    772:                if (connection->errcode != OCI_SUCCESS) {
                    773:                        connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC);
                    774:                        PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
                    775:                }
                    776:        }
                    777:        
                    778:        zend_list_delete(collection->connection->rsrc_id);
                    779:        
                    780:        efree(collection);
                    781:        return;
                    782: } /* }}} */
                    783: 
                    784: #endif /* HAVE_OCI8 */
                    785: 
                    786: /*
                    787:  * Local variables:
                    788:  * tab-width: 4
                    789:  * c-basic-offset: 4
                    790:  * End:
                    791:  * vim600: noet sw=4 ts=4 fdm=marker
                    792:  * vim<600: noet sw=4 ts=4
                    793:  */

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