PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - ext/oci8 - oci8_collection.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 0 266 0.0 %
Date: 2014-04-16 Functions: 0 17 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10

Generated at Wed, 16 Apr 2014 12:47:51 +0000 (8 days ago)

Copyright © 2005-2014 The PHP Group
All rights reserved.