Annotation of embedaddon/php/ext/oci8/oci8_collection.c, revision 1.1.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>