diff options
Diffstat (limited to 'ext/oci8/oci8_interface.c')
-rw-r--r-- | ext/oci8/oci8_interface.c | 2157 |
1 files changed, 0 insertions, 2157 deletions
diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c deleted file mode 100644 index ce8fafb478..0000000000 --- a/ext/oci8/oci8_interface.c +++ /dev/null @@ -1,2157 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 5 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2006 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | 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. | - +----------------------------------------------------------------------+ - | Authors: Stig Sæther Bakken <ssb@php.net> | - | 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> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "ext/standard/info.h" -#include "php_ini.h" - -#if HAVE_OCI8 - -#include "php_oci8.h" -#include "php_oci8_int.h" - -/* {{{ proto bool oci_define_by_name(resource stmt, string name, mixed &var [, int type]) - Define a PHP variable to an Oracle column by name */ -/* if you want to define a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE defining!!! */ -PHP_FUNCTION(oci_define_by_name) -{ - zval *stmt, *var; - char *name; - int name_len; - long type = SQLT_CHR; - php_oci_statement *statement; - php_oci_define *define, *tmp_define; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|l", &stmt, &name, &name_len, &var, &type) == FAILURE) { - return; - } - - if (!name_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Column name cannot be empty"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_STATEMENT(stmt, statement); - - if (statement->defines == NULL) { - ALLOC_HASHTABLE(statement->defines); - zend_hash_init(statement->defines, 13, NULL, php_oci_define_hash_dtor, 0); - } - - define = ecalloc(1,sizeof(php_oci_define)); - - if (zend_hash_add(statement->defines, name, name_len, define, sizeof(php_oci_define), (void **)&tmp_define) == SUCCESS) { - efree(define); - define = tmp_define; - } else { - efree(define); - RETURN_FALSE; - } - - define->name = (text*) estrndup(name, name_len); - define->name_len = name_len; - define->type = type; - define->zval = var; - zval_add_ref(&var); - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]]) - Bind a PHP variable to an Oracle placeholder by name */ -/* if you want to bind a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE binding!!! */ -PHP_FUNCTION(oci_bind_by_name) -{ - ub2 bind_type = SQLT_CHR; /* unterminated string */ - int name_len; - long maxlen = -1, type = 0; - char *name; - zval *z_statement; - zval *bind_var = NULL; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|ll", &z_statement, &name, &name_len, &bind_var, &maxlen, &type) == FAILURE) { - return; - } - - if (type) { - bind_type = (ub2) type; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_bind_by_name(statement, name, name_len, bind_var, maxlen, bind_type TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]]) - Bind a PHP array to an Oracle PL/SQL type by name */ -PHP_FUNCTION(oci_bind_array_by_name) -{ - int name_len; - long max_item_len = -1; - long max_array_len = 0; - long type = SQLT_AFC; - char *name; - zval *z_statement; - zval *bind_var = NULL; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/l|ll", &z_statement, &name, &name_len, &bind_var, &max_array_len, &max_item_len, &type) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (ZEND_NUM_ARGS() == 5 && max_item_len <= 0) { - max_item_len = -1; - } - - if (max_array_len <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Maximum array length must be greater than zero"); - RETURN_FALSE; - } - - if (php_oci_bind_array_by_name(statement, name, name_len, bind_var, max_array_len, max_item_len, type TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_free_descriptor() - Deletes large object description */ -PHP_FUNCTION(oci_free_descriptor) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - zend_list_delete(descriptor->id); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_save( string data [, int offset ]) - Saves a large object */ -PHP_FUNCTION(oci_lob_save) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - char *data; - int data_len; - long offset = 0; - ub4 bytes_written; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &offset) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &offset) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (offset < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset parameter must be greater than or equal to 0"); - RETURN_FALSE; - } - - if (php_oci_lob_write(descriptor, offset, data, data_len, &bytes_written TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_import( string filename ) - Loads file into a LOB */ -PHP_FUNCTION(oci_lob_import) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - char *filename; - int filename_len; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_import(descriptor, filename TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string oci_lob_load() - Loads a large object */ -PHP_FUNCTION(oci_lob_load) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - char *buffer = NULL; - ub4 buffer_len; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_read(descriptor, -1, 0, &buffer, &buffer_len TSRMLS_CC)) { - RETURN_FALSE; - } - if (buffer_len > 0) { - RETURN_STRINGL(buffer, buffer_len, 0); - } - else { - RETURN_EMPTY_STRING(); - } -} -/* }}} */ - -/* {{{ proto string oci_lob_read( int length ) - Reads particular part of a large object */ -PHP_FUNCTION(oci_lob_read) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - long length; - char *buffer; - ub4 buffer_len; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_descriptor, oci_lob_class_entry_ptr, &length) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (length <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0"); - RETURN_FALSE; - } - - if (php_oci_lob_read(descriptor, length, descriptor->lob_current_position, &buffer, &buffer_len TSRMLS_CC)) { - RETURN_FALSE; - } - if (buffer_len > 0) { - RETURN_STRINGL(buffer, buffer_len, 0); - } - else { - RETURN_EMPTY_STRING(); - } -} -/* }}} */ - -/* {{{ proto bool oci_lob_eof() - Checks if EOF is reached */ -PHP_FUNCTION(oci_lob_eof) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - ub4 lob_length; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (!php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC) && lob_length >= 0) { - if (lob_length == descriptor->lob_current_position) { - RETURN_TRUE; - } - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int oci_lob_tell() - Tells LOB pointer position */ -PHP_FUNCTION(oci_lob_tell) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - RETURN_LONG(descriptor->lob_current_position); -} -/* }}} */ - -/* {{{ proto bool oci_lob_rewind() - Rewind pointer of a LOB */ -PHP_FUNCTION(oci_lob_rewind) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - descriptor->lob_current_position = 0; - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_seek( int offset [, int whence ]) - Moves the pointer of a LOB */ -PHP_FUNCTION(oci_lob_seek) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - long offset, whence = PHP_OCI_SEEK_SET; - ub4 lob_length; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &offset, &whence) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|l", &z_descriptor, oci_lob_class_entry_ptr, &offset, &whence) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - - if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { - RETURN_FALSE; - } - - switch(whence) { - case PHP_OCI_SEEK_CUR: - descriptor->lob_current_position += offset; - break; - case PHP_OCI_SEEK_END: - if (descriptor->lob_size + offset >= 0) { - descriptor->lob_current_position = descriptor->lob_size + offset; - } - else { - descriptor->lob_current_position = 0; - } - break; - case PHP_OCI_SEEK_SET: - default: - descriptor->lob_current_position = (offset > 0) ? offset : 0; - break; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int oci_lob_size() - Returns size of a large object */ -PHP_FUNCTION(oci_lob_size) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - ub4 lob_length; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(lob_length); -} -/* }}} */ - -/* {{{ proto int oci_lob_write( string string [, int length ]) - Writes data to current position of a LOB */ -PHP_FUNCTION(oci_lob_write) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - int data_len; - long write_len = 0; - ub4 bytes_written; - char *data; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &write_len) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() == 2) { - data_len = MIN(data_len, write_len); - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &write_len) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() == 3) { - data_len = MIN(data_len, write_len); - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (data_len <= 0) { - RETURN_LONG(0); - } - - if (php_oci_lob_write(descriptor, descriptor->lob_current_position, data, data_len, &bytes_written TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(bytes_written); -} -/* }}} */ - -/* {{{ proto bool oci_lob_append( object lob ) - Appends data from a LOB to another LOB */ -PHP_FUNCTION(oci_lob_append) -{ - zval **tmp_dest, **tmp_from, *z_descriptor_dest = getThis(), *z_descriptor_from; - php_oci_descriptor *descriptor_dest, *descriptor_from; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor_from, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_descriptor_dest, oci_lob_class_entry_ptr, &z_descriptor_from, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); - RETURN_FALSE; - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest); - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from); - - if (php_oci_lob_append(descriptor_dest, descriptor_from TSRMLS_CC)) { - RETURN_FALSE; - } - /* XXX should we increase lob_size here ? */ - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_truncate( [ int length ]) - Truncates a LOB */ -PHP_FUNCTION(oci_lob_truncate) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - ub4 trim_length = 0; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &trim_length) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &trim_length) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_truncate(descriptor, trim_length TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int oci_lob_erase( [ int offset [, int length ] ] ) - Erases a specified portion of the internal LOB, starting at a specified offset */ -PHP_FUNCTION(oci_lob_erase) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - ub4 bytes_erased; - long offset = -1, length = -1; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &offset, &length) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() > 0 && offset < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0"); - RETURN_FALSE; - } - - if (ZEND_NUM_ARGS() > 1 && length < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0"); - RETURN_FALSE; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|ll", &z_descriptor, oci_lob_class_entry_ptr, &offset, &length) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() > 1 && offset < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0"); - RETURN_FALSE; - } - - if (ZEND_NUM_ARGS() > 2 && length < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0"); - RETURN_FALSE; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_erase(descriptor, offset, length, &bytes_erased TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(bytes_erased); -} -/* }}} */ - -/* {{{ proto bool oci_lob_flush( [ int flag ] ) - Flushes the LOB buffer */ -PHP_FUNCTION(oci_lob_flush) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - ub4 flush_flag = 0; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flush_flag) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &flush_flag) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (descriptor->buffering == PHP_OCI_LOB_BUFFER_DISABLED) { - /* buffering wasn't enabled, there is nothing to flush */ - RETURN_FALSE; - } - - if (php_oci_lob_flush(descriptor, flush_flag TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ocisetbufferinglob( boolean flag ) - Enables/disables buffering for a LOB */ -PHP_FUNCTION(ocisetbufferinglob) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - zend_bool flag; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &flag) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ob", &z_descriptor, oci_lob_class_entry_ptr, &flag) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_set_buffering(descriptor, flag TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ocigetbufferinglob() - Returns current state of buffering for a LOB */ -PHP_FUNCTION(ocigetbufferinglob) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (descriptor->buffering != PHP_OCI_LOB_BUFFER_DISABLED) { - RETURN_TRUE; - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_copy( object lob_to, object lob_from [, int length ] ) - Copies data from a LOB to another LOB */ -PHP_FUNCTION(oci_lob_copy) -{ - zval **tmp_dest, **tmp_from, *z_descriptor_dest, *z_descriptor_from; - php_oci_descriptor *descriptor_dest, *descriptor_from; - long length = 0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO|l", &z_descriptor_dest, oci_lob_class_entry_ptr, &z_descriptor_from, oci_lob_class_entry_ptr, &length) == FAILURE) { - return; - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); - RETURN_FALSE; - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest); - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from); - - if (ZEND_NUM_ARGS() == 3 && length < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0"); - RETURN_FALSE; - } - - if (ZEND_NUM_ARGS() == 2) { - /* indicate that we want to copy from the current position to the end of the LOB */ - length = -1; - } - - if (php_oci_lob_copy(descriptor_dest, descriptor_from, length TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_is_equal( object lob1, object lob2 ) - Tests to see if two LOB/FILE locators are equal */ -PHP_FUNCTION(oci_lob_is_equal) -{ - zval **tmp_first, **tmp_second, *z_descriptor_first, *z_descriptor_second; - php_oci_descriptor *descriptor_first, *descriptor_second; - boolean is_equal; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_descriptor_first, oci_lob_class_entry_ptr, &z_descriptor_second, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_first), "descriptor", sizeof("descriptor"), (void **)&tmp_first) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object"); - RETURN_FALSE; - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor_second), "descriptor", sizeof("descriptor"), (void **)&tmp_second) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_first, descriptor_first); - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_second, descriptor_second); - - if (php_oci_lob_is_equal(descriptor_first, descriptor_second, &is_equal TSRMLS_CC)) { - RETURN_FALSE; - } - - if (is_equal == TRUE) { - RETURN_TRUE; - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_export([string filename [, int start [, int length]]]) - Writes a large object into a file */ -PHP_FUNCTION(oci_lob_export) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - char *filename, *buffer; - int filename_len; - long start = -1, length = -1, block_length; - php_stream *stream; - ub4 lob_length; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &start, &length) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() > 1 && start < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0"); - RETURN_FALSE; - } - if (ZEND_NUM_ARGS() > 2 && length < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0"); - RETURN_FALSE; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|ll", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len, &start, &length) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() > 2 && start < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0"); - RETURN_FALSE; - } - if (ZEND_NUM_ARGS() > 3 && length < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0"); - RETURN_FALSE; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { - RETURN_FALSE; - } - - if (start == -1) { - start = 0; - } - - if (length == -1) { - length = lob_length - descriptor->lob_current_position; - } - - if (length == 0) { - /* nothing to write, fail silently */ - RETURN_FALSE; - } - - if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { - RETURN_FALSE; - } - - if (php_check_open_basedir(filename TSRMLS_CC)) { - RETURN_FALSE; - } - - stream = php_stream_open_wrapper_ex(filename, "w", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, NULL); - - block_length = PHP_OCI_LOB_BUFFER_SIZE; - if (block_length > length) { - block_length = length; - } - - while(length > 0) { - ub4 tmp_bytes_read = 0; - if (php_oci_lob_read(descriptor, block_length, start, &buffer, &tmp_bytes_read TSRMLS_CC)) { - php_stream_close(stream); - RETURN_FALSE; - } - if (tmp_bytes_read && !php_stream_write(stream, buffer, tmp_bytes_read)) { - php_stream_close(stream); - efree(buffer); - RETURN_FALSE; - } - if (buffer) { - efree(buffer); - } - - length -= tmp_bytes_read; - descriptor->lob_current_position += tmp_bytes_read; - start += tmp_bytes_read; - - if (block_length > length) { - block_length = length; - } - } - - php_stream_close(stream); - RETURN_TRUE; -} -/* }}} */ - -#ifdef HAVE_OCI8_TEMP_LOB -/* {{{ proto bool oci_lob_write_temporary(string var [, int lob_type]) - Writes temporary blob */ -PHP_FUNCTION(oci_lob_write_temporary) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - char *data; - int data_len; - long type = OCI_TEMP_CLOB; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &type) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &type) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_write_tmp(descriptor, type, data, data_len TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_lob_close() - Closes lob descriptor */ -PHP_FUNCTION(oci_lob_close) -{ - zval **tmp, *z_descriptor = getThis(); - php_oci_descriptor *descriptor; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - if (php_oci_lob_close(descriptor TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ -#endif - -/* {{{ proto object oci_new_descriptor(resource connection [, int type]) - Initialize a new empty descriptor LOB/FILE (LOB is default) */ -PHP_FUNCTION(oci_new_descriptor) -{ - zval *z_connection; - php_oci_connection *connection; - php_oci_descriptor *descriptor; - long type = OCI_DTYPE_LOB; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_connection, &type) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - /* php_oci_lob_create() checks type */ - descriptor = php_oci_lob_create(connection, type TSRMLS_CC); - - if (!descriptor) { - RETURN_NULL(); - } - - object_init_ex(return_value, oci_lob_class_entry_ptr); - add_property_resource(return_value, "descriptor", descriptor->id); -} -/* }}} */ - -/* {{{ proto bool oci_rollback(resource connection) - Rollback the current context */ -PHP_FUNCTION(oci_rollback) -{ - zval *z_connection; - php_oci_connection *connection; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; - } - - if (php_oci_connection_rollback(connection TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_commit(resource connection) - Commit the current context */ -PHP_FUNCTION(oci_commit) -{ - zval *z_connection; - php_oci_connection *connection; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; - } - - if (php_oci_connection_commit(connection TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string oci_field_name(resource stmt, int col) - Tell the name of a column */ -PHP_FUNCTION(oci_field_name) -{ - php_oci_out_column *column; - - if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) { - RETURN_STRINGL(column->name, column->name_len, 1); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int oci_field_size(resource stmt, int col) - Tell the maximum data size of a column */ -PHP_FUNCTION(oci_field_size) -{ - php_oci_out_column *column; - - if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) { - /* Handle data type of LONG */ - if (column->data_type == SQLT_LNG){ - RETURN_LONG(column->storage_size4); - } - RETURN_LONG(column->data_size); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int oci_field_scale(resource stmt, int col) - Tell the scale of a column */ -PHP_FUNCTION(oci_field_scale) -{ - php_oci_out_column *column; - - if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) { - RETURN_LONG(column->scale); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int oci_field_precision(resource stmt, int col) - Tell the precision of a column */ -PHP_FUNCTION(oci_field_precision) -{ - php_oci_out_column *column; - - if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) { - RETURN_LONG(column->precision); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto mixed oci_field_type(resource stmt, int col) - Tell the data type of a column */ -PHP_FUNCTION(oci_field_type) -{ - php_oci_out_column *column; - - column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); - - if (!column) { - RETURN_FALSE; - } - - switch (column->data_type) { -#ifdef SQLT_TIMESTAMP - case SQLT_TIMESTAMP: - RETVAL_STRING("TIMESTAMP",1); - break; -#endif -#ifdef SQLT_TIMESTAMP_TZ - case SQLT_TIMESTAMP_TZ: - RETVAL_STRING("TIMESTAMP_TZ",1); - break; -#endif - case SQLT_DAT: - RETVAL_STRING("DATE",1); - break; - case SQLT_NUM: - RETVAL_STRING("NUMBER",1); - break; - case SQLT_LNG: - RETVAL_STRING("LONG",1); - break; - case SQLT_BIN: - RETVAL_STRING("RAW",1); - break; - case SQLT_LBI: - RETVAL_STRING("LONG RAW",1); - break; - case SQLT_CHR: - RETVAL_STRING("VARCHAR2",1); - break; - case SQLT_RSET: - RETVAL_STRING("REFCURSOR",1); - break; - case SQLT_AFC: - RETVAL_STRING("CHAR",1); - break; - case SQLT_BLOB: - RETVAL_STRING("BLOB",1); - break; - case SQLT_CLOB: - RETVAL_STRING("CLOB",1); - break; - case SQLT_BFILE: - RETVAL_STRING("BFILE",1); - break; - case SQLT_RDD: - RETVAL_STRING("ROWID",1); - break; - default: - RETVAL_LONG(column->data_type); - } -} -/* }}} */ - -/* {{{ proto int oci_field_type_raw(resource stmt, int col) - Tell the raw oracle data type of a column */ -PHP_FUNCTION(oci_field_type_raw) -{ - php_oci_out_column *column; - - column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); - if (column) { - RETURN_LONG(column->data_type); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto bool oci_field_is_null(resource stmt, int col) - Tell whether a column is NULL */ -PHP_FUNCTION(oci_field_is_null) -{ - php_oci_out_column *column; - - if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) { - if (column->indicator == -1) { - RETURN_TRUE; - } - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto void oci_internal_debug(int onoff) - Toggle internal debugging output for the OCI extension */ -PHP_FUNCTION(oci_internal_debug) -{ - zend_bool on_off; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &on_off) == FAILURE) { - return; - } - OCI_G(debug_mode) = on_off; -} -/* }}} */ - -/* {{{ proto bool oci_execute(resource stmt [, int mode]) - Execute a parsed statement */ -PHP_FUNCTION(oci_execute) -{ - zval *z_statement; - php_oci_statement *statement; - long mode = OCI_COMMIT_ON_SUCCESS; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_statement, &mode) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_execute(statement, mode TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_cancel(resource stmt) - Cancel reading from a cursor */ -PHP_FUNCTION(oci_cancel) -{ - zval *z_statement; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_cancel(statement TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_fetch(resource stmt) - Prepare a new row of data for reading */ -PHP_FUNCTION(oci_fetch) -{ - zval *z_statement; - php_oci_statement *statement; - ub4 nrows = 1; /* only one row at a time is supported for now */ - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int ocifetchinto(resource stmt, array &output [, int mode]) - Fetch a row of result data into an array */ -PHP_FUNCTION(ocifetchinto) -{ - php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM, 3); -} -/* }}} */ - -/* {{{ proto int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]]) - Fetch all rows of result data into an array */ -PHP_FUNCTION(oci_fetch_all) -{ - zval *z_statement, *array, *element, *tmp; - php_oci_statement *statement; - php_oci_out_column **columns; - zval ***outarrs; - ub4 nrows = 1; - int i; - long rows = 0, flags = 0, skip = 0, maxrows = -1; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz/|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - zval_dtor(array); - array_init(array); - - while (skip--) { - if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { - RETURN_LONG(0); - } - } - - if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) { - columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); - - for (i = 0; i < statement->ncolumns; i++) { - columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC); - } - - while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { - zval *row; - - MAKE_STD_ZVAL(row); - array_init(row); - - for (i = 0; i < statement->ncolumns; i++) { - MAKE_STD_ZVAL(element); - php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC); - - if (flags & PHP_OCI_NUM) { - zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL); - } else { /* default to ASSOC */ - zend_hash_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL); - } - } - - zend_hash_next_index_insert(Z_ARRVAL_P(array), &row, sizeof(zval*), NULL); - rows++; - - if (maxrows != -1 && rows == maxrows) { - php_oci_statement_cancel(statement TSRMLS_CC); - break; - } - } - efree(columns); - - } else { /* default to BY_COLUMN */ - columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); - outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0); - - if (flags & PHP_OCI_NUM) { - for (i = 0; i < statement->ncolumns; i++) { - columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC); - - MAKE_STD_ZVAL(tmp); - array_init(tmp); - zend_hash_next_index_insert(Z_ARRVAL_P(array), &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); - } - } else { /* default to ASSOC */ - for (i = 0; i < statement->ncolumns; i++) { - columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC); - - MAKE_STD_ZVAL(tmp); - array_init(tmp); - zend_hash_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); - } - } - - while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { - for (i = 0; i < statement->ncolumns; i++) { - MAKE_STD_ZVAL(element); - php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC); - zend_hash_index_update((*(outarrs[ i ]))->value.ht, rows, (void *)&element, sizeof(zval*), NULL); - } - - rows++; - - if (maxrows != -1 && rows == maxrows) { - php_oci_statement_cancel(statement TSRMLS_CC); - break; - } - } - - efree(columns); - efree(outarrs); - } - - RETURN_LONG(rows); -} -/* }}} */ - -/* {{{ proto object oci_fetch_object( resource stmt ) - Fetch a result row as an object */ -PHP_FUNCTION(oci_fetch_object) -{ - php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 2); - - if (Z_TYPE_P(return_value) == IS_ARRAY) { - object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value)); - } -} -/* }}} */ - -/* {{{ proto array oci_fetch_row( resource stmt ) - Fetch a result row as an enumerated array */ -PHP_FUNCTION(oci_fetch_row) -{ - php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM | PHP_OCI_RETURN_NULLS, 1); -} -/* }}} */ - -/* {{{ proto array oci_fetch_assoc( resource stmt ) - Fetch a result row as an associative array */ -PHP_FUNCTION(oci_fetch_assoc) -{ - php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 1); -} -/* }}} */ - -/* {{{ proto array oci_fetch_array( resource stmt [, int mode ]) - Fetch a result row as an array */ -PHP_FUNCTION(oci_fetch_array) -{ - php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_BOTH | PHP_OCI_RETURN_NULLS, 2); -} -/* }}} */ - -/* {{{ proto bool oci_free_statement(resource stmt) - Free all resources associated with a statement */ -PHP_FUNCTION(oci_free_statement) -{ - zval *z_statement; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - if (!statement->nested) { - /* nested cursors cannot be freed, they are allocated once and used during the fetch */ - zend_list_delete(statement->id); - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_close(resource connection) - Disconnect from database */ -PHP_FUNCTION(oci_close) -{ - zval *z_connection; - php_oci_connection *connection; - - if (OCI_G(old_oci_close_semantics)) { - /* do nothing to keep BC */ - return; - } - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - zend_list_delete(connection->rsrc_id); - ZVAL_NULL(z_connection); - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto resource oci_new_connect(string user, string pass [, string db]) - Connect to an Oracle database and log on. Returns a new session. */ -PHP_FUNCTION(oci_new_connect) -{ - php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1); -} -/* }}} */ - -/* {{{ proto resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]]) - Connect to an Oracle database and log on. Returns a new session. */ -PHP_FUNCTION(oci_connect) -{ - php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0); -} -/* }}} */ - -/* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset ]]) - Connect to an Oracle database using a persistent connection and log on. Returns a new session. */ -PHP_FUNCTION(oci_pconnect) -{ - php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0); -} -/* }}} */ - -/* {{{ proto array oci_error([resource stmt|connection|global]) - Return the last error of stmt|connection|global. If no error happened returns false. */ -PHP_FUNCTION(oci_error) -{ - zval *arg; - php_oci_statement *statement; - php_oci_connection *connection; - text *errbuf; - sb4 errcode = 0; - sword error = 0; - dvoid *errh = NULL; -#ifdef HAVE_OCI8_ATTR_STATEMENT - ub2 error_offset = 0; - text *sqltext = NULL; -#endif - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg) == FAILURE) { - return; - } - - if (ZEND_NUM_ARGS() > 0) { - statement = (php_oci_statement *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_statement); - - if (statement) { - errh = statement->err; - error = statement->errcode; - -#ifdef HAVE_OCI8_ATTR_STATEMENT - if (php_oci_fetch_sqltext_offset(statement, &sqltext, &error_offset TSRMLS_CC)) { - RETURN_FALSE; - } -#endif - } else { - connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_connection); - - if (connection) { - errh = connection->err; - error = connection->errcode; - } - } - } else { - errh = OCI_G(err); - error = OCI_G(errcode); - } - - if (error == OCI_SUCCESS) { /* no error set in the handle */ - RETURN_FALSE; - } - - if (!errh) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCIError: unable to find error handle"); - RETURN_FALSE; - } - - errcode = php_oci_fetch_errmsg(errh, &errbuf TSRMLS_CC); - - if (errcode) { - array_init(return_value); - add_assoc_long(return_value, "code", errcode); - add_assoc_string(return_value, "message", (char*) errbuf, 0); -#ifdef HAVE_OCI8_ATTR_STATEMENT - add_assoc_long(return_value, "offset", error_offset); - add_assoc_string(return_value, "sqltext", sqltext ? (char *) sqltext : "", 1); -#endif - } else { - RETURN_FALSE; - } -} -/* }}} */ - -/* {{{ proto int oci_num_fields(resource stmt) - Return the number of result columns in a statement */ -PHP_FUNCTION(oci_num_fields) -{ - zval *z_statement; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - RETURN_LONG(statement->ncolumns); -} -/* }}} */ - -/* {{{ proto resource oci_parse(resource connection, string query) - Parse a query and return a statement */ -PHP_FUNCTION(oci_parse) -{ - zval *z_connection; - php_oci_connection *connection; - php_oci_statement *statement; - char *query; - int query_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &query, &query_len) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - statement = php_oci_statement_create(connection, query, query_len TSRMLS_CC); - - if (statement) { - RETURN_RESOURCE(statement->id); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto bool oci_set_prefetch(resource stmt, int prefetch_rows) - Sets the number of rows to be prefetched on execute to prefetch_rows for stmt */ -PHP_FUNCTION(oci_set_prefetch) -{ - zval *z_statement; - php_oci_statement *statement; - long size; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &z_statement, &size) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_set_prefetch(statement, size TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password) - Changes the password of an account */ -PHP_FUNCTION(oci_password_change) -{ - zval *z_connection; - text *user, *pass_old, *pass_new, *dbname; - int user_len, pass_old_len, pass_new_len, dbname_len; - php_oci_connection *connection; - - /* Disable in Safe Mode */ - if (PG(safe_mode)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "is disabled in Safe Mode"); - RETURN_FALSE; - } - - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "rsss", &z_connection, &user, &user_len, &pass_old, &pass_old_len, &pass_new, &pass_new_len) == SUCCESS) { - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - if (!user_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty"); - RETURN_FALSE; - } - if (!pass_old_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty"); - RETURN_FALSE; - } - if (!pass_new_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty"); - RETURN_FALSE; - } - - if (php_oci_password_change(connection, user, user_len, pass_old, pass_old_len, pass_new, pass_new_len TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; - } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "ssss", &dbname, &dbname_len, &user, &user_len, &pass_old, &pass_old_len, &pass_new, &pass_new_len) == SUCCESS) { - - if (!user_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty"); - RETURN_FALSE; - } - if (!pass_old_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty"); - RETURN_FALSE; - } - if (!pass_new_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty"); - RETURN_FALSE; - } - - connection = php_oci_do_connect_ex(user, user_len, pass_old, pass_old_len, pass_new, pass_new_len, dbname, dbname_len, NULL, OCI_DEFAULT, 0, 0 TSRMLS_CC); - if (!connection) { - RETURN_FALSE; - } - RETURN_RESOURCE(connection->rsrc_id); - } - WRONG_PARAM_COUNT; -} -/* }}} */ - -/* {{{ proto resource oci_new_cursor(resource connection) - Return a new cursor (Statement-Handle) - use this to bind ref-cursors! */ -PHP_FUNCTION(oci_new_cursor) -{ - zval *z_connection; - php_oci_connection *connection; - php_oci_statement *statement; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - statement = php_oci_statement_create(connection, NULL, 0 TSRMLS_CC); - - if (statement) { - RETURN_RESOURCE(statement->id); - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto string oci_result(resource stmt, mixed column) - Return a single column of result data */ -PHP_FUNCTION(oci_result) -{ - php_oci_out_column *column; - - column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); - if(column) { - php_oci_column_to_zval(column, return_value, 0 TSRMLS_CC); - } - else { - RETURN_FALSE; - } -} -/* }}} */ - -/* {{{ proto string oci_server_version(resource connection) - Return a string containing server version information */ -PHP_FUNCTION(oci_server_version) -{ - zval *z_connection; - php_oci_connection *connection; - char *version = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - if (php_oci_server_get_version(connection, &version TSRMLS_CC)) { - RETURN_FALSE; - } - - RETURN_STRING(version, 0); -} -/* }}} */ - -/* {{{ proto string oci_statement_type(resource stmt) - Return the query type of an OCI statement */ -PHP_FUNCTION(oci_statement_type) -{ - zval *z_statement; - php_oci_statement *statement; - ub2 type; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_get_type(statement, &type TSRMLS_CC)) { - RETURN_FALSE; - } - - switch (type) { - case OCI_STMT_SELECT: - RETVAL_STRING("SELECT",1); - break; - case OCI_STMT_UPDATE: - RETVAL_STRING("UPDATE",1); - break; - case OCI_STMT_DELETE: - RETVAL_STRING("DELETE",1); - break; - case OCI_STMT_INSERT: - RETVAL_STRING("INSERT",1); - break; - case OCI_STMT_CREATE: - RETVAL_STRING("CREATE",1); - break; - case OCI_STMT_DROP: - RETVAL_STRING("DROP",1); - break; - case OCI_STMT_ALTER: - RETVAL_STRING("ALTER",1); - break; - case OCI_STMT_BEGIN: - RETVAL_STRING("BEGIN",1); - break; - case OCI_STMT_DECLARE: - RETVAL_STRING("DECLARE",1); - break; - default: - RETVAL_STRING("UNKNOWN",1); - } -} -/* }}} */ - -/* {{{ proto int oci_num_rows(resource stmt) - Return the row count of an OCI statement */ -PHP_FUNCTION(oci_num_rows) -{ - zval *z_statement; - php_oci_statement *statement; - ub4 rowcount; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - - if (php_oci_statement_get_numrows(statement, &rowcount TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(rowcount); -} -/* }}} */ - -#ifdef PHP_OCI8_HAVE_COLLECTIONS -/* {{{ proto bool oci_free_collection() - Deletes collection object*/ -PHP_FUNCTION(oci_free_collection) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - zend_list_delete(collection->id); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_collection_append(string value) - Append an object to the collection */ -PHP_FUNCTION(oci_collection_append) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - char *value; - int value_len; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_collection, oci_coll_class_entry_ptr, &value, &value_len) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_append(collection, value, value_len TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string oci_collection_element_get(int ndx) - Retrieve the value at collection index ndx */ -PHP_FUNCTION(oci_collection_element_get) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - long element_index; - zval *value; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &element_index) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &element_index) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_element_get(collection, element_index, &value TSRMLS_CC)) { - RETURN_FALSE; - } - - *return_value = *value; - zval_copy_ctor(return_value); - zval_ptr_dtor(&value); -} -/* }}} */ - -/* {{{ proto bool oci_collection_assign(object from) - Assign a collection from another existing collection */ -PHP_FUNCTION(oci_collection_assign) -{ - zval **tmp_dest, **tmp_from, *z_collection_dest = getThis(), *z_collection_from; - php_oci_collection *collection_dest, *collection_from; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection_from, oci_coll_class_entry_ptr) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "OO", &z_collection_dest, oci_coll_class_entry_ptr, &z_collection_from, oci_coll_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection_dest), "collection", sizeof("collection"), (void **)&tmp_dest) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The first argument should be valid collection object"); - RETURN_FALSE; - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection_from), "collection", sizeof("collection"), (void **)&tmp_from) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The second argument should be valid collection object"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp_dest, collection_dest); - PHP_OCI_ZVAL_TO_COLLECTION(*tmp_from, collection_from); - - if (php_oci_collection_assign(collection_dest, collection_from TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool oci_collection_element_assign(int index, string val) - Assign element val to collection at index ndx */ -PHP_FUNCTION(oci_collection_element_assign) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - int value_len; - long element_index; - char *value; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &element_index, &value, &value_len) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ols", &z_collection, oci_coll_class_entry_ptr, &element_index, &value, &value_len) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_element_set(collection, element_index, value, value_len TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int oci_collection_size() - Return the size of a collection */ -PHP_FUNCTION(oci_collection_size) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - sb4 size = 0; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_size(collection, &size TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(size); -} -/* }}} */ - -/* {{{ proto int oci_collection_max() - Return the max value of a collection. For a varray this is the maximum length of the array */ -PHP_FUNCTION(oci_collection_max) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - long max; - - if (!getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_max(collection, &max TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_LONG(max); -} -/* }}} */ - -/* {{{ proto bool oci_collection_trim(int num) - Trim num elements from the end of a collection */ -PHP_FUNCTION(oci_collection_trim) -{ - zval **tmp, *z_collection = getThis(); - php_oci_collection *collection; - long trim_size; - - if (getThis()) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &trim_size) == FAILURE) { - return; - } - } - else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &trim_size) == FAILURE) { - return; - } - } - - if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property"); - RETURN_FALSE; - } - - PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection); - - if (php_oci_collection_trim(collection, trim_size TSRMLS_CC)) { - RETURN_FALSE; - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto object oci_new_collection(resource connection, string tdo [, string schema]) - Initialize a new collection */ -PHP_FUNCTION(oci_new_collection) -{ - zval *z_connection; - php_oci_connection *connection; - php_oci_collection *collection; - char *tdo, *schema = NULL; - int tdo_len, schema_len = 0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &z_connection, &tdo, &tdo_len, &schema, &schema_len) == FAILURE) { - return; - } - - PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - - if ( (collection = php_oci_collection_create(connection, tdo, tdo_len, schema, schema_len TSRMLS_CC)) ) { - object_init_ex(return_value, oci_coll_class_entry_ptr); - add_property_resource(return_value, "collection", collection->id); - } - else { - RETURN_FALSE; - } -} -/* }}} */ - -#endif - -#endif /* HAVE_OCI8 */ |