php-src/ext/oci8/oci8_collection.c

818 lines
24 KiB
C
Raw Normal View History

2005-12-01 13:39:48 +00:00
/*
+----------------------------------------------------------------------+
2014-09-19 16:33:14 +00:00
| PHP Version 7 |
2005-12-01 13:39:48 +00:00
+----------------------------------------------------------------------+
2018-01-02 04:55:14 +00:00
| Copyright (c) 1997-2018 The PHP Group |
2005-12-01 13:39:48 +00:00
+----------------------------------------------------------------------+
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license, |
2005-12-01 13:39:48 +00:00
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
2006-01-01 12:51:34 +00:00
| http://www.php.net/license/3_01.txt |
2005-12-01 13:39:48 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
2017-01-02 15:30:12 +00:00
| Authors: Stig Sæther Bakken <ssb@php.net> |
2005-12-01 13:39:48 +00:00
| Thies C. Arntzen <thies@thieso.net> |
| |
| Collection support by Andy Sautins <asautins@veripost.net> |
| Temporary LOB support by David Benson <dbenson@mancala.com> |
| ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at> |
| |
| Redesigned by: Antony Dovgal <antony@zend.com> |
| Andi Gutmans <andi@zend.com> |
| Wez Furlong <wez@omniti.com> |
+----------------------------------------------------------------------+
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "ext/standard/info.h"
#include "php_ini.h"
#if HAVE_OCI8
2005-12-01 13:39:48 +00:00
#include "php_oci8.h"
#include "php_oci8_int.h"
/* {{{ php_oci_collection_create()
2005-12-01 13:39:48 +00:00
Create and return connection handle */
2014-12-13 22:06:14 +00:00
php_oci_collection *php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len)
2005-12-01 13:39:48 +00:00
{
dvoid *dschp1 = NULL;
2005-12-01 13:39:48 +00:00
dvoid *parmp1;
dvoid *parmp2;
php_oci_collection *collection;
sword errstatus;
2005-12-01 13:39:48 +00:00
collection = emalloc(sizeof(php_oci_collection));
collection->connection = connection;
collection->collection = NULL;
++GC_REFCOUNT(collection->connection->id);
2005-12-01 13:39:48 +00:00
/* get type handle by name */
PHP_OCI_CALL_RETURN(errstatus, OCITypeByName,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
connection->svc,
(text *) schema,
(ub4) schema_len,
(text *) tdo,
(ub4) tdo_len,
(CONST text *) 0,
(ub4) 0,
OCI_DURATION_SESSION,
OCI_TYPEGET_ALL,
&(collection->tdo)
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* allocate describe handle */
PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* describe TDO */
PHP_OCI_CALL_RETURN(errstatus, OCIDescribeAny,
2006-08-15 13:08:34 +00:00
(
connection->svc,
connection->err,
(dvoid *) collection->tdo,
(ub4) 0,
OCI_OTYPE_PTR,
(ub1) OCI_DEFAULT,
(ub1) OCI_PTYPE_TYPE,
dschp1
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* get first parameter handle */
PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* get the collection type code of the attribute */
PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet,
2006-08-15 13:08:34 +00:00
(
(dvoid*) parmp1,
(ub4) OCI_DTYPE_PARAM,
(dvoid*) &(collection->coll_typecode),
(ub4 *) 0,
(ub4) OCI_ATTR_COLLECTION_TYPECODE,
connection->err
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
switch(collection->coll_typecode) {
case OCI_TYPECODE_TABLE:
case OCI_TYPECODE_VARRAY:
/* get collection element handle */
PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet,
2006-08-15 13:08:34 +00:00
(
(dvoid*) parmp1,
(ub4) OCI_DTYPE_PARAM,
(dvoid*) &parmp2,
(ub4 *) 0,
(ub4) OCI_ATTR_COLLECTION_ELEMENT,
connection->err
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* get REF of the TDO for the type */
PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet,
2006-08-15 13:08:34 +00:00
(
(dvoid*) parmp2,
(ub4) OCI_DTYPE_PARAM,
(dvoid*) &(collection->elem_ref),
(ub4 *) 0,
(ub4) OCI_ATTR_REF_TDO,
connection->err
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* get the TDO (only header) */
PHP_OCI_CALL_RETURN(errstatus, OCITypeByRef,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
collection->elem_ref,
OCI_DURATION_SESSION,
OCI_TYPEGET_HEADER,
&(collection->element_type)
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* get typecode */
PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet,
2006-08-15 13:08:34 +00:00
(
(dvoid*) parmp2,
(ub4) OCI_DTYPE_PARAM,
(dvoid*) &(collection->element_typecode),
(ub4 *) 0,
(ub4) OCI_ATTR_TYPECODE,
connection->err
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
break;
/* we only support VARRAYs and TABLEs */
default:
2014-12-13 22:06:14 +00:00
php_error_docref(NULL, E_WARNING, "unknown collection type %d", collection->coll_typecode);
2005-12-01 13:39:48 +00:00
break;
}
/* Create object to hold return table */
PHP_OCI_CALL_RETURN(errstatus, OCIObjectNew,
2005-12-01 13:39:48 +00:00
(
connection->env,
connection->err,
connection->svc,
OCI_TYPECODE_TABLE,
collection->tdo,
(dvoid *)0,
OCI_DURATION_DEFAULT,
TRUE,
2005-12-01 13:39:48 +00:00
(dvoid **) &(collection->collection)
)
);
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
goto CLEANUP;
}
/* free the describe handle (Bug #44113) */
PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
2005-12-01 13:39:48 +00:00
PHP_OCI_REGISTER_RESOURCE(collection, le_collection);
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return collection;
CLEANUP:
if (dschp1) {
/* free the describe handle (Bug #44113) */
PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE));
}
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2014-12-13 22:06:14 +00:00
php_oci_collection_close(collection);
2005-12-01 13:39:48 +00:00
return NULL;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_size()
2005-12-01 13:39:48 +00:00
Return size of the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_size(php_oci_collection *collection, sb4 *size)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
PHP_OCI_CALL_RETURN(errstatus, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_max()
2005-12-01 13:39:48 +00:00
Return max number of elements in the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_max(php_oci_collection *collection, zend_long *max)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection->connection;
PHP_OCI_CALL_RETURN(*max, OCICollMax, (connection->env, collection->collection));
2005-12-01 13:39:48 +00:00
/* error handling is not necessary here? */
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_trim()
2005-12-01 13:39:48 +00:00
Trim collection to the given number of elements */
2014-12-13 22:06:14 +00:00
int php_oci_collection_trim(php_oci_collection *collection, zend_long trim_size)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection->connection;
sword errstatus;
2015-08-12 11:57:16 +00:00
PHP_OCI_CALL_RETURN(errstatus, OCICollTrim, (connection->env, connection->err, (sb4) trim_size, collection->collection));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
errstatus = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_append_null()
2005-12-01 13:39:48 +00:00
Append NULL element to the end of the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_append_null(php_oci_collection *collection)
2005-12-01 13:39:48 +00:00
{
OCIInd null_index = OCI_IND_NULL;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
/* append NULL element */
PHP_OCI_CALL_RETURN(errstatus, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
errstatus = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_append_date()
2005-12-01 13:39:48 +00:00
Append DATE element to the end of the collection (use "DD-MON-YY" format) */
2014-12-13 22:06:14 +00:00
int php_oci_collection_append_date(php_oci_collection *collection, char *date, int date_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
OCIDate oci_date;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
/* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
/* failed to convert string to date */
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAppend,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(dvoid *) &oci_date,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_append_number()
Append NUMBER to the end of the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_append_number(php_oci_collection *collection, char *number, int number_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
double element_double;
OCINumber oci_number;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
element_double = zend_strtod(number, NULL);
PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAppend,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(dvoid *) &oci_number,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_append_string()
2005-12-01 13:39:48 +00:00
Append STRING to the end of the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_append_string(php_oci_collection *collection, char *element, int element_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
OCIString *ocistr = (OCIString *)0;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
PHP_OCI_CALL_RETURN(errstatus, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAppend,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(dvoid *) ocistr,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_append()
2005-12-01 13:39:48 +00:00
Append wrapper. Appends any supported element to the end of the collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_append(php_oci_collection *collection, char *element, int element_len)
2005-12-01 13:39:48 +00:00
{
if (element_len == 0) {
2014-12-13 22:06:14 +00:00
return php_oci_collection_append_null(collection);
2005-12-01 13:39:48 +00:00
}
switch(collection->element_typecode) {
case OCI_TYPECODE_DATE:
2014-12-13 22:06:14 +00:00
return php_oci_collection_append_date(collection, element, element_len);
2005-12-01 13:39:48 +00:00
break;
case OCI_TYPECODE_VARCHAR2 :
2014-12-13 22:06:14 +00:00
return php_oci_collection_append_string(collection, element, element_len);
2005-12-01 13:39:48 +00:00
break;
case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */
case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */
case OCI_TYPECODE_REAL : /* REAL */
case OCI_TYPECODE_DOUBLE : /* DOUBLE */
case OCI_TYPECODE_INTEGER : /* INT */
case OCI_TYPECODE_SIGNED16 : /* SHORT */
case OCI_TYPECODE_SIGNED32 : /* LONG */
case OCI_TYPECODE_DECIMAL : /* DECIMAL */
case OCI_TYPECODE_FLOAT : /* FLOAT */
case OCI_TYPECODE_NUMBER : /* NUMBER */
case OCI_TYPECODE_SMALLINT : /* SMALLINT */
2014-12-13 22:06:14 +00:00
return php_oci_collection_append_number(collection, element, element_len);
2005-12-01 13:39:48 +00:00
break;
default:
2014-12-13 22:06:14 +00:00
php_error_docref(NULL, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
2005-12-01 13:39:48 +00:00
return 1;
break;
}
/* never reached */
return 1;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_get()
2005-12-01 13:39:48 +00:00
Get the element with the given index */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_get(php_oci_collection *collection, zend_long index, zval *result_element)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection->connection;
dvoid *element;
OCIInd *element_index;
boolean exists;
oratext buff[1024];
ub4 buff_len = 1024;
sword errstatus;
2005-12-01 13:39:48 +00:00
2014-09-09 19:50:26 +00:00
ZVAL_NULL(result_element);
2005-12-01 13:39:48 +00:00
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
PHP_OCI_CALL_RETURN(errstatus, OCICollGetElem,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
collection->collection,
(ub4)index,
&exists,
&element,
(dvoid **)&element_index
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
if (exists == 0) {
/* element doesn't exist */
return 1;
}
if (*element_index == OCI_IND_NULL) {
/* this is not an error, we're returning NULL here */
return 0;
}
switch (collection->element_typecode) {
case OCI_TYPECODE_DATE:
PHP_OCI_CALL_RETURN(errstatus, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
ZVAL_STRINGL(result_element, (char *)buff, buff_len);
2014-09-09 19:50:26 +00:00
Z_STRVAL_P(result_element)[buff_len] = '\0';
2005-12-01 13:39:48 +00:00
return 0;
break;
case OCI_TYPECODE_VARCHAR2:
{
OCIString *oci_string = *(OCIString **)element;
text *str;
PHP_OCI_CALL_RETURN(str, OCIStringPtr, (connection->env, oci_string));
2005-12-01 13:39:48 +00:00
if (str) {
2014-09-09 19:50:26 +00:00
ZVAL_STRING(result_element, (char *)str);
2005-12-01 13:39:48 +00:00
}
return 0;
}
break;
case OCI_TYPECODE_UNSIGNED16: /* UNSIGNED SHORT */
case OCI_TYPECODE_UNSIGNED32: /* UNSIGNED LONG */
case OCI_TYPECODE_REAL: /* REAL */
case OCI_TYPECODE_DOUBLE: /* DOUBLE */
case OCI_TYPECODE_INTEGER: /* INT */
case OCI_TYPECODE_SIGNED16: /* SHORT */
case OCI_TYPECODE_SIGNED32: /* LONG */
case OCI_TYPECODE_DECIMAL: /* DECIMAL */
case OCI_TYPECODE_FLOAT: /* FLOAT */
case OCI_TYPECODE_NUMBER: /* NUMBER */
case OCI_TYPECODE_SMALLINT: /* SMALLINT */
2005-12-01 13:39:48 +00:00
{
double double_number;
PHP_OCI_CALL_RETURN(errstatus, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
2014-09-09 19:50:26 +00:00
ZVAL_DOUBLE(result_element, double_number);
2005-12-01 13:39:48 +00:00
return 0;
}
break;
default:
2014-12-13 22:06:14 +00:00
php_error_docref(NULL, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
2005-12-01 13:39:48 +00:00
return 1;
break;
}
/* never reached */
return 1;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_set_null()
2005-12-01 13:39:48 +00:00
Set the element with the given index to NULL */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_set_null(php_oci_collection *collection, zend_long index)
2005-12-01 13:39:48 +00:00
{
OCIInd null_index = OCI_IND_NULL;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
/* set NULL element */
PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_set_date()
2005-12-01 13:39:48 +00:00
Change element's value to the given DATE */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_set_date(php_oci_collection *collection, zend_long index, char *date, int date_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
OCIDate oci_date;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
/* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */
PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2005-12-01 13:39:48 +00:00
/* failed to convert string to date */
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(ub4)index,
(dvoid *) &oci_date,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_set_number()
Change element's value to the given NUMBER */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_set_number(php_oci_collection *collection, zend_long index, char *number, int number_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
double element_double;
OCINumber oci_number;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
element_double = zend_strtod(number, NULL);
PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(ub4) index,
(dvoid *) &oci_number,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_set_string()
Change element's value to the given string */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_set_string(php_oci_collection *collection, zend_long index, char *element, int element_len)
2005-12-01 13:39:48 +00:00
{
OCIInd new_index = OCI_IND_NOTNULL;
OCIString *ocistr = (OCIString *)0;
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
PHP_OCI_CALL_RETURN(errstatus, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem,
2006-08-15 13:08:34 +00:00
(
connection->env,
connection->err,
(ub4)index,
(dvoid *) ocistr,
(dvoid *) &new_index,
(OCIColl *) collection->collection
)
);
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_element_set()
Collection element setter */
2014-12-13 22:06:14 +00:00
int php_oci_collection_element_set(php_oci_collection *collection, zend_long index, char *value, int value_len)
2005-12-01 13:39:48 +00:00
{
if (value_len == 0) {
2014-12-13 22:06:14 +00:00
return php_oci_collection_element_set_null(collection, index);
2005-12-01 13:39:48 +00:00
}
switch(collection->element_typecode) {
case OCI_TYPECODE_DATE:
2014-12-13 22:06:14 +00:00
return php_oci_collection_element_set_date(collection, index, value, value_len);
2005-12-01 13:39:48 +00:00
break;
case OCI_TYPECODE_VARCHAR2 :
2014-12-13 22:06:14 +00:00
return php_oci_collection_element_set_string(collection, index, value, value_len);
2005-12-01 13:39:48 +00:00
break;
case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */
case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */
case OCI_TYPECODE_REAL : /* REAL */
case OCI_TYPECODE_DOUBLE : /* DOUBLE */
case OCI_TYPECODE_INTEGER : /* INT */
case OCI_TYPECODE_SIGNED16 : /* SHORT */
case OCI_TYPECODE_SIGNED32 : /* LONG */
case OCI_TYPECODE_DECIMAL : /* DECIMAL */
case OCI_TYPECODE_FLOAT : /* FLOAT */
case OCI_TYPECODE_NUMBER : /* NUMBER */
case OCI_TYPECODE_SMALLINT : /* SMALLINT */
2014-12-13 22:06:14 +00:00
return php_oci_collection_element_set_number(collection, index, value, value_len);
2005-12-01 13:39:48 +00:00
break;
default:
2014-12-13 22:06:14 +00:00
php_error_docref(NULL, E_NOTICE, "Unknown or unsupported type of element: %d", collection->element_typecode);
2005-12-01 13:39:48 +00:00
return 1;
break;
}
/* never reached */
return 1;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_assign()
2005-12-01 13:39:48 +00:00
Assigns a value to the collection from another collection */
2014-12-13 22:06:14 +00:00
int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection_dest->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
PHP_OCI_CALL_RETURN(errstatus, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
2005-12-01 13:39:48 +00:00
return 1;
}
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
return 0;
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_close()
Destroy collection and all associated resources */
2014-12-13 22:06:14 +00:00
void php_oci_collection_close(php_oci_collection *collection)
2005-12-01 13:39:48 +00:00
{
php_oci_connection *connection = collection->connection;
sword errstatus;
2005-12-01 13:39:48 +00:00
if (collection->collection) {
PHP_OCI_CALL_RETURN(errstatus, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE));
2005-12-01 13:39:48 +00:00
if (errstatus != OCI_SUCCESS) {
2014-12-13 22:06:14 +00:00
connection->errcode = php_oci_error(connection->err, errstatus);
2008-03-22 01:27:50 +00:00
PHP_OCI_HANDLE_ERROR(connection, connection->errcode);
} else {
connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */
2005-12-01 13:39:48 +00:00
}
}
zend_list_delete(collection->connection->id);
2005-12-01 13:39:48 +00:00
efree(collection);
return;
}
/* }}} */
2005-12-01 13:39:48 +00:00
#endif /* HAVE_OCI8 */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
*/