Annotation of embedaddon/php/ext/oci8/oci8_collection.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Stig Sæther Bakken <ssb@php.net> |
! 16: | Thies C. Arntzen <thies@thieso.net> |
! 17: | |
! 18: | Collection support by Andy Sautins <asautins@veripost.net> |
! 19: | Temporary LOB support by David Benson <dbenson@mancala.com> |
! 20: | ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at> |
! 21: | |
! 22: | Redesigned by: Antony Dovgal <antony@zend.com> |
! 23: | Andi Gutmans <andi@zend.com> |
! 24: | Wez Furlong <wez@omniti.com> |
! 25: +----------------------------------------------------------------------+
! 26: */
! 27:
! 28: /* $Id: oci8_collection.c 321634 2012-01-01 13:15:04Z felipe $ */
! 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>