File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / oci8 / oci8_collection.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 20:03:52 2014 UTC (10 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_29, HEAD
php 5.4.29

    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: oci8_collection.c,v 1.1.1.4 2014/06/15 20:03:52 misho Exp $ */
   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>