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

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | PHP Version 5                                                        |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1997-2014 The PHP Group                                |
    6:    +----------------------------------------------------------------------+
    7:    | This source file is subject to version 3.01 of the PHP license,      |
    8:    | that is bundled with this package in the file LICENSE, and is        |
    9:    | available through the world-wide-web at the following url:           |
   10:    | http://www.php.net/license/3_01.txt                                  |
   11:    | If you did not receive a copy of the PHP license and are unable to   |
   12:    | obtain it through the world-wide-web, please send a note to          |
   13:    | license@php.net so we can mail you a copy immediately.               |
   14:    +----------------------------------------------------------------------+
   15:    | Authors: Stig Sæther Bakken <ssb@php.net>                            |
   16:    |          Thies C. Arntzen <thies@thieso.net>                         |
   17:    |                                                                      |
   18:    | Collection support by Andy Sautins <asautins@veripost.net>           |
   19:    | Temporary LOB support by David Benson <dbenson@mancala.com>          |
   20:    | ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at>        |
   21:    |                                                                      |
   22:    | Redesigned by: Antony Dovgal <antony@zend.com>                       |
   23:    |                Andi Gutmans <andi@zend.com>                          |
   24:    |                Wez Furlong <wez@omniti.com>                          |
   25:    +----------------------------------------------------------------------+
   26: */
   27: 
   28: /* $Id: oci8_interface.c,v 1.1.1.4 2014/06/15 20:03:52 misho Exp $ */
   29: 
   30: #ifdef HAVE_CONFIG_H
   31: #include "config.h"
   32: #endif
   33: 
   34: #include "php.h"
   35: #include "ext/standard/info.h"
   36: #include "php_ini.h"
   37: 
   38: #if HAVE_OCI8
   39: 
   40: #include "php_oci8.h"
   41: #include "php_oci8_int.h"
   42: 
   43: #ifndef OCI_STMT_CALL
   44: #define OCI_STMT_CALL 10
   45: #endif
   46: 
   47: /* {{{ proto bool oci_define_by_name(resource stmt, string name, mixed &var [, int type])
   48:    Define a PHP variable to an Oracle column by name */
   49: /* if you want to define a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE defining!!! */
   50: PHP_FUNCTION(oci_define_by_name)
   51: {
   52: 	zval *stmt, *var;
   53: 	char *name;
   54: 	int name_len;
   55: 	long type = 0;
   56: 	php_oci_statement *statement;
   57: 	php_oci_define *define, *tmp_define;
   58: 
   59: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|l", &stmt, &name, &name_len, &var, &type) == FAILURE) {
   60: 		return;
   61: 	}
   62: 
   63: 	if (!name_len) {
   64: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Column name cannot be empty");
   65: 		RETURN_FALSE;
   66: 	}
   67: 
   68: 	PHP_OCI_ZVAL_TO_STATEMENT(stmt, statement);
   69: 
   70: 	if (statement->defines == NULL) {
   71: 		ALLOC_HASHTABLE(statement->defines);
   72: 		zend_hash_init(statement->defines, 13, NULL, php_oci_define_hash_dtor, 0);
   73: 	}
   74: 
   75: 	define = ecalloc(1,sizeof(php_oci_define));
   76: 
   77: 	if (zend_hash_add(statement->defines, name, name_len, define, sizeof(php_oci_define), (void **)&tmp_define) == SUCCESS) {
   78: 		efree(define);
   79: 		define = tmp_define;
   80: 	} else {
   81: 		efree(define);
   82: 		RETURN_FALSE;
   83: 	}
   84: 
   85: 	define->name = (text*) estrndup(name, name_len);
   86: 	define->name_len = name_len;
   87: 	define->type = type;
   88: 	define->zval = var;
   89: 	zval_add_ref(&var);
   90: 
   91: 	RETURN_TRUE;
   92: }
   93: /* }}} */
   94: 
   95: /* {{{ proto bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]])
   96:    Bind a PHP variable to an Oracle placeholder by name */
   97: /* if you want to bind a LOB/CLOB etc make sure you allocate it via OCINewDescriptor BEFORE binding!!! */
   98: PHP_FUNCTION(oci_bind_by_name)
   99: {
  100: 	ub2	bind_type = SQLT_CHR; /* unterminated string */
  101: 	int name_len;
  102: 	long maxlen = -1, type = 0;
  103: 	char *name;
  104: 	zval *z_statement;
  105: 	zval *bind_var = NULL;
  106: 	php_oci_statement *statement;
  107: 	
  108: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz/|ll", &z_statement, &name, &name_len, &bind_var, &maxlen, &type) == FAILURE) {
  109: 		return;
  110: 	}
  111: 
  112: 	if (type) {
  113: 		bind_type = (ub2) type;
  114: 	}
  115: 	
  116: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
  117: 
  118: 	if (php_oci_bind_by_name(statement, name, name_len, bind_var, maxlen, bind_type TSRMLS_CC)) {
  119: 		RETURN_FALSE;
  120: 	}
  121: 	RETURN_TRUE;
  122: }
  123: /* }}} */
  124: 
  125: /* {{{ proto bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]])
  126:    Bind a PHP array to an Oracle PL/SQL type by name */
  127: PHP_FUNCTION(oci_bind_array_by_name)
  128: {
  129: 	int name_len;
  130: 	long max_item_len = -1;
  131: 	long max_array_len = 0;
  132: 	long type = SQLT_AFC;
  133: 	char *name;
  134: 	zval *z_statement;
  135: 	zval *bind_var = NULL;
  136: 	php_oci_statement *statement;
  137: 	
  138: 	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) {
  139: 		return;
  140: 	}
  141: 
  142: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
  143: 
  144: 	if (ZEND_NUM_ARGS() == 5 && max_item_len <= 0) {
  145: 		max_item_len = -1;
  146: 	}
  147: 	
  148: 	if (max_array_len <= 0) {
  149: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Maximum array length must be greater than zero");
  150: 		RETURN_FALSE;
  151: 	}
  152: 	
  153: 	if (php_oci_bind_array_by_name(statement, name, name_len, bind_var, max_array_len, max_item_len, type TSRMLS_CC)) {
  154: 		RETURN_FALSE;
  155: 	}
  156: 	RETURN_TRUE;
  157: }
  158: /* }}} */
  159: 
  160: /* {{{ proto bool oci_free_descriptor()
  161:    Deletes large object description */
  162: PHP_FUNCTION(oci_free_descriptor)
  163: {
  164: 	zval **tmp, *z_descriptor = getThis();
  165: 	php_oci_descriptor *descriptor;
  166: 
  167: 	if (!getThis()) {
  168: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  169: 			return;
  170: 		}
  171: 	}
  172: 	
  173: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  174: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  175: 		RETURN_FALSE;
  176: 	}
  177: 
  178: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  179: 
  180: 	zend_list_delete(descriptor->id);
  181: 	RETURN_TRUE;
  182: }
  183: /* }}} */
  184: 
  185: /* {{{ proto bool oci_lob_save( string data [, int offset ])
  186:    Saves a large object */
  187: PHP_FUNCTION(oci_lob_save)
  188: {
  189: 	zval **tmp, *z_descriptor = getThis();
  190: 	php_oci_descriptor *descriptor;
  191: 	char *data;
  192: 	int data_len;
  193: 	long offset = 0;
  194: 	ub4 bytes_written;
  195: 
  196: 	if (getThis()) {
  197: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &offset) == FAILURE) {
  198: 			return;
  199: 		}
  200: 	}
  201: 	else {
  202: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &offset) == FAILURE) {
  203: 			return;
  204: 		}
  205: 	}
  206: 	
  207: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  208: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  209: 		RETURN_FALSE;
  210: 	}
  211: 
  212: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  213: 
  214: 	if (offset < 0) {
  215: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset parameter must be greater than or equal to 0");
  216: 		RETURN_FALSE;
  217: 	}
  218: 	
  219: 	if (php_oci_lob_write(descriptor, offset, data, data_len, &bytes_written TSRMLS_CC)) {
  220: 		RETURN_FALSE;
  221: 	}
  222: 	RETURN_TRUE;
  223: }
  224: /* }}} */
  225: 
  226: /* {{{ proto bool oci_lob_import( string filename )
  227:    Loads file into a LOB */
  228: PHP_FUNCTION(oci_lob_import)
  229: {
  230: 	zval **tmp, *z_descriptor = getThis();
  231: 	php_oci_descriptor *descriptor;
  232: 	char *filename;
  233: 	int filename_len;
  234: 
  235: 	if (getThis()) {
  236: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
  237: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) {
  238: #else
  239: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
  240: #endif
  241: 			return;
  242: 		}
  243: 	}
  244: 	else {
  245: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
  246: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Op", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len) == FAILURE) {
  247: #else
  248: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len) == FAILURE) {
  249: #endif
  250: 			return;
  251: 		}	
  252: 	}
  253: 
  254: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
  255: 	/* The "p" parsing parameter handles this case in PHP 5.4+ */
  256: 	if (strlen(filename) != filename_len) {
  257: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename cannot contain null bytes");
  258: 		RETURN_FALSE;  
  259: 	}
  260: #endif
  261: 
  262: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  263: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  264: 		RETURN_FALSE;
  265: 	}
  266: 
  267: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  268: 
  269: 	if (php_oci_lob_import(descriptor, filename TSRMLS_CC)) {
  270: 		RETURN_FALSE;
  271: 	}
  272: 	RETURN_TRUE;
  273: }
  274: /* }}} */
  275: 
  276: /* {{{ proto string oci_lob_load()
  277:    Loads a large object */
  278: PHP_FUNCTION(oci_lob_load)
  279: {
  280: 	zval **tmp, *z_descriptor = getThis();
  281: 	php_oci_descriptor *descriptor;
  282: 	char *buffer = NULL;
  283: 	ub4 buffer_len;
  284: 
  285: 	if (!getThis()) {
  286: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  287: 			return;
  288: 		}	
  289: 	}
  290: 	
  291: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  292: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  293: 		RETURN_FALSE;
  294: 	}
  295: 	
  296: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  297: 
  298: 	if (php_oci_lob_read(descriptor, -1, 0, &buffer, &buffer_len TSRMLS_CC)) {
  299: 		RETURN_FALSE;
  300: 	}
  301: 	if (buffer_len > 0) {
  302: 		RETURN_STRINGL(buffer, buffer_len, 0);
  303: 	}
  304: 	else {
  305: 		RETURN_EMPTY_STRING();
  306: 	}
  307: }
  308: /* }}} */
  309: 
  310: /* {{{ proto string oci_lob_read( int length )
  311:    Reads particular part of a large object */
  312: PHP_FUNCTION(oci_lob_read)
  313: {
  314: 	zval **tmp, *z_descriptor = getThis();
  315: 	php_oci_descriptor *descriptor;
  316: 	long length;
  317: 	char *buffer;
  318: 	ub4 buffer_len;
  319: 
  320: 	if (getThis()) {
  321: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) {
  322: 			return;
  323: 		}
  324: 	}
  325: 	else {
  326: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_descriptor, oci_lob_class_entry_ptr, &length) == FAILURE) {
  327: 			return;
  328: 		}	
  329: 	}
  330: 
  331: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  332: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  333: 		RETURN_FALSE;
  334: 	}
  335: 	
  336: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  337: 
  338: 	if (length <= 0) {
  339: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
  340: 		RETURN_FALSE;
  341: 	}
  342: 	
  343: 	if (php_oci_lob_read(descriptor, length, descriptor->lob_current_position, &buffer, &buffer_len TSRMLS_CC)) {
  344: 		RETURN_FALSE;
  345: 	}	
  346: 	if (buffer_len > 0) {
  347: 		RETURN_STRINGL(buffer, buffer_len, 0);
  348: 	}
  349: 	else {
  350: 		RETURN_EMPTY_STRING();
  351: 	}
  352: }
  353: /* }}} */
  354: 
  355: /* {{{ proto bool oci_lob_eof()
  356:    Checks if EOF is reached */
  357: PHP_FUNCTION(oci_lob_eof)
  358: {
  359: 	zval **tmp, *z_descriptor = getThis();
  360: 	php_oci_descriptor *descriptor;
  361: 	ub4 lob_length;
  362: 	
  363: 	if (!getThis()) {
  364: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  365: 			return;
  366: 		}	
  367: 	}
  368: 	
  369: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  370: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  371: 		RETURN_FALSE;
  372: 	}
  373: 	
  374: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  375: 	
  376: 	if (!php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC) && lob_length >= 0) {
  377: 		if (lob_length == descriptor->lob_current_position) {
  378: 			RETURN_TRUE;
  379: 		}
  380: 	}
  381: 	RETURN_FALSE;
  382: }
  383: /* }}} */
  384: 
  385: /* {{{ proto int oci_lob_tell()
  386:    Tells LOB pointer position */
  387: PHP_FUNCTION(oci_lob_tell)
  388: {
  389: 	zval **tmp, *z_descriptor = getThis();
  390: 	php_oci_descriptor *descriptor;
  391: 	
  392: 	if (!getThis()) {
  393: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  394: 			return;
  395: 		}	
  396: 	}
  397: 	
  398: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  399: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  400: 		RETURN_FALSE;
  401: 	}
  402: 	
  403: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  404: 	
  405: 	RETURN_LONG(descriptor->lob_current_position);	
  406: }
  407: /* }}} */
  408: 
  409: /* {{{ proto bool oci_lob_rewind()
  410:    Rewind pointer of a LOB */
  411: PHP_FUNCTION(oci_lob_rewind)
  412: {
  413: 	zval **tmp, *z_descriptor = getThis();
  414: 	php_oci_descriptor *descriptor;
  415: 	
  416: 	if (!getThis()) {
  417: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  418: 			return;
  419: 		}	
  420: 	}
  421: 	
  422: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  423: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  424: 		RETURN_FALSE;
  425: 	}
  426: 	
  427: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  428: 	
  429: 	descriptor->lob_current_position = 0;
  430: 
  431: 	RETURN_TRUE;
  432: }
  433: /* }}} */
  434: 
  435: /* {{{ proto bool oci_lob_seek( int offset [, int whence ])
  436:    Moves the pointer of a LOB */
  437: PHP_FUNCTION(oci_lob_seek)
  438: {
  439: 	zval **tmp, *z_descriptor = getThis();
  440: 	php_oci_descriptor *descriptor;
  441: 	long offset, whence = PHP_OCI_SEEK_SET;
  442: 	ub4 lob_length;
  443: 	
  444: 	if (getThis()) {
  445: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &offset, &whence) == FAILURE) {
  446: 			return;
  447: 		}
  448: 	}
  449: 	else {
  450: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|l", &z_descriptor, oci_lob_class_entry_ptr, &offset, &whence) == FAILURE) {
  451: 			return;
  452: 		}	
  453: 	}
  454: 	
  455: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  456: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  457: 		RETURN_FALSE;
  458: 	}
  459: 	
  460: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  461: 
  462: 	if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
  463: 		RETURN_FALSE;
  464: 	}
  465: 
  466: 	switch(whence) {
  467: 		case PHP_OCI_SEEK_CUR:
  468: 			descriptor->lob_current_position += offset;
  469: 			break;
  470: 		case PHP_OCI_SEEK_END:
  471: 			if ((descriptor->lob_size + offset) >= 0) {
  472: 				descriptor->lob_current_position = descriptor->lob_size + offset;
  473: 			}
  474: 			else {
  475: 				descriptor->lob_current_position = 0;
  476: 			}
  477: 			break;
  478: 		case PHP_OCI_SEEK_SET:
  479: 		default:
  480: 				descriptor->lob_current_position = (offset > 0) ? offset : 0;
  481: 			break;
  482: 	}	
  483: 	RETURN_TRUE;
  484: }
  485: /* }}} */
  486: 
  487: /* {{{ proto int oci_lob_size()
  488:    Returns size of a large object */
  489: PHP_FUNCTION(oci_lob_size)
  490: {
  491: 	zval **tmp, *z_descriptor = getThis();
  492: 	php_oci_descriptor *descriptor;
  493: 	ub4 lob_length;
  494: 	
  495: 	if (!getThis()) {
  496: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  497: 			return;
  498: 		}	
  499: 	}
  500: 	
  501: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  502: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  503: 		RETURN_FALSE;
  504: 	}
  505: 	
  506: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  507: 	
  508: 	if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
  509: 		RETURN_FALSE;
  510: 	}
  511: 	RETURN_LONG(lob_length);
  512: }
  513: /* }}} */
  514: 
  515: /* {{{ proto int oci_lob_write( string string [, int length ])
  516:    Writes data to current position of a LOB */
  517: PHP_FUNCTION(oci_lob_write)
  518: {
  519: 	zval **tmp, *z_descriptor = getThis();
  520: 	php_oci_descriptor *descriptor;
  521: 	int data_len;
  522: 	long write_len = 0;
  523: 	ub4 bytes_written;
  524: 	char *data;
  525: 	
  526: 	if (getThis()) {
  527: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &write_len) == FAILURE) {
  528: 			return;
  529: 		}
  530: 		
  531: 		if (ZEND_NUM_ARGS() == 2) {
  532: 			data_len = MIN(data_len, write_len);
  533: 		}
  534: 	}
  535: 	else {
  536: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &write_len) == FAILURE) {
  537: 			return;
  538: 		}
  539: 
  540: 		if (ZEND_NUM_ARGS() == 3) {
  541: 			data_len = MIN(data_len, write_len);
  542: 		}
  543: 	}
  544: 	
  545: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  546: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  547: 		RETURN_FALSE;
  548: 	}
  549: 	
  550: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  551: 	
  552: 	if (data_len <= 0) {
  553: 		RETURN_LONG(0);
  554: 	}
  555: 	
  556: 	if (php_oci_lob_write(descriptor, descriptor->lob_current_position, data, data_len, &bytes_written TSRMLS_CC)) {
  557: 		RETURN_FALSE;
  558: 	}
  559: 	RETURN_LONG(bytes_written);
  560: }
  561: /* }}} */
  562: 
  563: /* {{{ proto bool oci_lob_append( object lob )
  564:    Appends data from a LOB to another LOB */
  565: PHP_FUNCTION(oci_lob_append)
  566: {
  567: 	zval **tmp_dest, **tmp_from, *z_descriptor_dest = getThis(), *z_descriptor_from;
  568: 	php_oci_descriptor *descriptor_dest, *descriptor_from;
  569: 	
  570: 	if (getThis()) {
  571: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor_from, oci_lob_class_entry_ptr) == FAILURE) {
  572: 			return;
  573: 		}
  574: 	}
  575: 	else {
  576: 		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) {
  577: 			return;
  578: 		}	
  579: 	}
  580: 	
  581: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) {
  582: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
  583: 		RETURN_FALSE;
  584: 	}
  585: 	
  586: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) {
  587: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
  588: 		RETURN_FALSE;
  589: 	}
  590: 	
  591: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest);
  592: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from);
  593: 	
  594: 	if (php_oci_lob_append(descriptor_dest, descriptor_from TSRMLS_CC)) {
  595: 		RETURN_FALSE;
  596: 	}
  597: 	/* XXX should we increase lob_size here ? */
  598: 	RETURN_TRUE;
  599: }
  600: /* }}} */
  601: 
  602: /* {{{ proto bool oci_lob_truncate( [ int length ])
  603:    Truncates a LOB */
  604: PHP_FUNCTION(oci_lob_truncate)
  605: {
  606: 	zval **tmp, *z_descriptor = getThis();
  607: 	php_oci_descriptor *descriptor;
  608: 	long trim_length = 0;
  609: 	ub4 ub_trim_length;
  610: 	
  611: 	if (getThis()) {
  612: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &trim_length) == FAILURE) {
  613: 			return;
  614: 		}
  615: 	}
  616: 	else {
  617: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &trim_length) == FAILURE) {
  618: 			return;
  619: 		}	
  620: 	}
  621: 	
  622: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  623: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  624: 		RETURN_FALSE;
  625: 	}
  626: 
  627: 	if (trim_length < 0) {
  628: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to zero");
  629: 		RETURN_FALSE;
  630: 	}
  631: 
  632: 	ub_trim_length = (ub4) trim_length;
  633: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  634: 	
  635: 	if (php_oci_lob_truncate(descriptor, ub_trim_length TSRMLS_CC)) {
  636: 		RETURN_FALSE;
  637: 	}
  638: 	RETURN_TRUE;
  639: }
  640: /* }}} */
  641: 
  642: /* {{{ proto int oci_lob_erase( [ int offset [, int length ] ] )
  643:    Erases a specified portion of the internal LOB, starting at a specified offset */
  644: PHP_FUNCTION(oci_lob_erase)
  645: {
  646: 	zval **tmp, *z_descriptor = getThis();
  647: 	php_oci_descriptor *descriptor;
  648: 	ub4 bytes_erased;
  649: 	long offset = -1, length = -1;
  650: 	
  651: 	if (getThis()) {
  652: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &offset, &length) == FAILURE) {
  653: 			return;
  654: 		}
  655: 
  656: 		if (ZEND_NUM_ARGS() > 0 && offset < 0) {
  657: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0");
  658: 			RETURN_FALSE;
  659: 		}
  660: 
  661: 		if (ZEND_NUM_ARGS() > 1 && length < 0) {
  662: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0");
  663: 			RETURN_FALSE;
  664: 		}
  665: 	}
  666: 	else {
  667: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|ll", &z_descriptor, oci_lob_class_entry_ptr, &offset, &length) == FAILURE) {
  668: 			return;
  669: 		}
  670: 
  671: 		if (ZEND_NUM_ARGS() > 1 && offset < 0) {
  672: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be greater than or equal to 0");
  673: 			RETURN_FALSE;
  674: 		}
  675: 		
  676: 		if (ZEND_NUM_ARGS() > 2 && length < 0) {
  677: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length must be greater than or equal to 0");
  678: 			RETURN_FALSE;
  679: 		}
  680: 	}
  681: 
  682: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  683: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  684: 		RETURN_FALSE;
  685: 	}
  686: 
  687: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  688: 
  689: 	if (php_oci_lob_erase(descriptor, offset, length, &bytes_erased TSRMLS_CC)) {
  690: 		RETURN_FALSE;
  691: 	}
  692: 	RETURN_LONG(bytes_erased);
  693: }
  694: /* }}} */
  695: 
  696: /* {{{ proto bool oci_lob_flush( [ int flag ] )
  697:    Flushes the LOB buffer */
  698: PHP_FUNCTION(oci_lob_flush)
  699: {
  700: 	zval **tmp, *z_descriptor = getThis();
  701: 	php_oci_descriptor *descriptor;
  702: 	long flush_flag = 0;
  703: 	
  704: 	if (getThis()) {
  705: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flush_flag) == FAILURE) {
  706: 			return;
  707: 		}
  708: 	}
  709: 	else {
  710: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &z_descriptor, oci_lob_class_entry_ptr, &flush_flag) == FAILURE) {
  711: 			return;
  712: 		}
  713: 	}
  714: 	
  715: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  716: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  717: 		RETURN_FALSE;
  718: 	}
  719: 	
  720: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  721: 	
  722: 	if (descriptor->buffering == PHP_OCI_LOB_BUFFER_DISABLED) {
  723: 		/* buffering wasn't enabled, there is nothing to flush */
  724: 		RETURN_FALSE;
  725: 	}
  726: 
  727: 	if (php_oci_lob_flush(descriptor, flush_flag TSRMLS_CC)) {
  728: 		RETURN_FALSE;
  729: 	}
  730: 	RETURN_TRUE;
  731: }
  732: /* }}} */
  733: 
  734: /* {{{ proto bool ocisetbufferinglob( boolean flag )
  735:    Enables/disables buffering for a LOB */
  736: PHP_FUNCTION(ocisetbufferinglob)
  737: {
  738: 	zval **tmp, *z_descriptor = getThis();
  739: 	php_oci_descriptor *descriptor;
  740: 	zend_bool flag;
  741: 	
  742: 	if (getThis()) {
  743: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &flag) == FAILURE) {
  744: 			return;
  745: 		}
  746: 	}
  747: 	else {
  748: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ob", &z_descriptor, oci_lob_class_entry_ptr, &flag) == FAILURE) {
  749: 			return;
  750: 		}	
  751: 	}
  752: 	
  753: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  754: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  755: 		RETURN_FALSE;
  756: 	}
  757: 	
  758: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  759: 	
  760: 	if (php_oci_lob_set_buffering(descriptor, flag TSRMLS_CC)) {
  761: 		RETURN_FALSE;
  762: 	}
  763: 	RETURN_TRUE;
  764: }
  765: /* }}} */
  766: 
  767: /* {{{ proto bool ocigetbufferinglob()
  768:    Returns current state of buffering for a LOB */
  769: PHP_FUNCTION(ocigetbufferinglob)
  770: {
  771: 	zval **tmp, *z_descriptor = getThis();
  772: 	php_oci_descriptor *descriptor;
  773: 	
  774: 	if (!getThis()) {
  775: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
  776: 			return;
  777: 		}	
  778: 	}
  779: 
  780: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  781: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  782: 		RETURN_FALSE;
  783: 	}
  784: 	
  785: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  786: 	
  787: 	if (descriptor->buffering != PHP_OCI_LOB_BUFFER_DISABLED) {
  788: 		RETURN_TRUE;
  789: 	}
  790: 	RETURN_FALSE;
  791: }
  792: /* }}} */
  793: 
  794: /* {{{ proto bool oci_lob_copy( object lob_to, object lob_from [, int length ] )
  795:    Copies data from a LOB to another LOB */
  796: PHP_FUNCTION(oci_lob_copy)
  797: {
  798: 	zval **tmp_dest, **tmp_from, *z_descriptor_dest, *z_descriptor_from;
  799: 	php_oci_descriptor *descriptor_dest, *descriptor_from;
  800: 	long length = 0;
  801: 	
  802: 	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) {
  803: 		return;
  804: 	}
  805: 	
  806: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_dest), "descriptor", sizeof("descriptor"), (void **)&tmp_dest) == FAILURE) {
  807: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
  808: 		RETURN_FALSE;
  809: 	}
  810: 	
  811: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_from), "descriptor", sizeof("descriptor"), (void **)&tmp_from) == FAILURE) {
  812: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
  813: 		RETURN_FALSE;
  814: 	}
  815: 	
  816: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_dest, descriptor_dest);
  817: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_from, descriptor_from);
  818: 	
  819: 	if (ZEND_NUM_ARGS() == 3 && length < 0) {
  820: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
  821: 		RETURN_FALSE;
  822: 	}
  823: 	
  824: 	if (ZEND_NUM_ARGS() == 2) {
  825: 		/* indicate that we want to copy from the current position to the end of the LOB */
  826: 		length = -1;
  827: 	}
  828: 
  829: 	if (php_oci_lob_copy(descriptor_dest, descriptor_from, length TSRMLS_CC)) {
  830: 		RETURN_FALSE;
  831: 	}
  832: 	RETURN_TRUE;
  833: }
  834: /* }}} */
  835: 
  836: /* {{{ proto bool oci_lob_is_equal( object lob1, object lob2 )
  837:    Tests to see if two LOB/FILE locators are equal */
  838: PHP_FUNCTION(oci_lob_is_equal)
  839: {
  840: 	zval **tmp_first, **tmp_second, *z_descriptor_first, *z_descriptor_second;
  841: 	php_oci_descriptor *descriptor_first, *descriptor_second;
  842: 	boolean is_equal;
  843: 		
  844: 	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) {
  845: 		return;
  846: 	}
  847: 	
  848: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_first), "descriptor", sizeof("descriptor"), (void **)&tmp_first) == FAILURE) {
  849: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The first argument should be valid descriptor object");
  850: 		RETURN_FALSE;
  851: 	}
  852: 	
  853: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor_second), "descriptor", sizeof("descriptor"), (void **)&tmp_second) == FAILURE) {
  854: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property. The second argument should be valid descriptor object");
  855: 		RETURN_FALSE;
  856: 	}
  857: 	
  858: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_first, descriptor_first);
  859: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp_second, descriptor_second);
  860: 
  861: 	if (php_oci_lob_is_equal(descriptor_first, descriptor_second, &is_equal TSRMLS_CC)) {
  862: 		RETURN_FALSE;
  863: 	}
  864: 	
  865: 	if (is_equal == TRUE) {
  866: 		RETURN_TRUE;
  867: 	}
  868: 	RETURN_FALSE;
  869: }
  870: /* }}} */
  871: 
  872: /* {{{ proto bool oci_lob_export([string filename [, int start [, int length]]])
  873:    Writes a large object into a file */
  874: PHP_FUNCTION(oci_lob_export)
  875: {	
  876: 	zval **tmp, *z_descriptor = getThis();
  877: 	php_oci_descriptor *descriptor;
  878: 	char *filename;
  879: 	char *buffer;
  880: 	int filename_len;
  881: 	long start = -1, length = -1, block_length;
  882: 	php_stream *stream;
  883: 	ub4 lob_length;
  884: 
  885: 	if (getThis()) {
  886: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
  887: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ll", &filename, &filename_len, &start, &length) == FAILURE) {
  888: #else
  889: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &start, &length) == FAILURE) {
  890: #endif
  891: 			return;
  892: 		}
  893: 	
  894: 		if (ZEND_NUM_ARGS() > 1 && start < 0) {
  895: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0");
  896: 			RETURN_FALSE;
  897: 		}
  898: 		if (ZEND_NUM_ARGS() > 2 && length < 0) {
  899: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0");
  900: 			RETURN_FALSE;
  901: 		}
  902: 	}
  903: 	else {
  904: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
  905: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Op|ll", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len, &start, &length) == FAILURE) {
  906: #else
  907: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|ll", &z_descriptor, oci_lob_class_entry_ptr, &filename, &filename_len, &start, &length) == FAILURE) {
  908: #endif
  909: 			return;
  910: 		}
  911: 			
  912: 		if (ZEND_NUM_ARGS() > 2 && start < 0) {
  913: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Start parameter must be greater than or equal to 0");
  914: 			RETURN_FALSE;
  915: 		}
  916: 		if (ZEND_NUM_ARGS() > 3 && length < 0) {
  917: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than or equal to 0");
  918: 			RETURN_FALSE;
  919: 		}
  920: 	}
  921: 
  922: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
  923: 	/* The "p" parsing parameter handles this case in PHP 5.4+ */
  924: 	if (strlen(filename) != filename_len) {
  925: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename cannot contain null bytes");
  926: 		RETURN_FALSE;  
  927: 	}
  928: #endif
  929: 
  930: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
  931: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
  932: 		RETURN_FALSE;
  933: 	}
  934: 	
  935: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
  936: 	
  937: 	if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) {
  938: 		RETURN_FALSE;
  939: 	}		
  940: 	
  941: 	if (start == -1) {
  942: 		start = 0;
  943: 	}
  944: 
  945: 	if (length == -1) {
  946: 		length = lob_length - descriptor->lob_current_position;
  947: 	}
  948: 	
  949: 	if (length == 0) {
  950: 		/* nothing to write, fail silently */
  951: 		RETURN_FALSE;
  952: 	}
  953: 
  954: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
  955: 	/* Safe mode has been removed in PHP 5.4 */
  956: 	if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
  957: 		RETURN_FALSE;
  958: 	}
  959: #endif
  960: 
  961: 	if (php_check_open_basedir(filename TSRMLS_CC)) {
  962: 		RETURN_FALSE;
  963: 	}
  964: 
  965: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5)
  966: 	stream = php_stream_open_wrapper_ex(filename, "w", REPORT_ERRORS, NULL, NULL);
  967: #else
  968: 	stream = php_stream_open_wrapper_ex(filename, "w", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, NULL);
  969: #endif
  970: 
  971: 	block_length = PHP_OCI_LOB_BUFFER_SIZE;
  972: 	if (block_length > length) {
  973: 		block_length = length;
  974: 	}
  975: 
  976: 	while(length > 0) {
  977: 		ub4 tmp_bytes_read = 0;
  978: 		if (php_oci_lob_read(descriptor, block_length, start, &buffer, &tmp_bytes_read TSRMLS_CC)) {
  979: 			php_stream_close(stream);
  980: 			RETURN_FALSE;
  981: 		}
  982: 		if (tmp_bytes_read && !php_stream_write(stream, buffer, tmp_bytes_read)) {
  983: 			php_stream_close(stream);
  984: 			efree(buffer);
  985: 			RETURN_FALSE;
  986: 		}
  987: 		if (buffer) {
  988: 			efree(buffer);
  989: 		}
  990: 		
  991: 		length -= tmp_bytes_read;
  992: 		descriptor->lob_current_position += tmp_bytes_read;
  993: 		start += tmp_bytes_read;
  994: 
  995: 		if (block_length > length) {
  996: 			block_length = length;
  997: 		}
  998: 	}
  999: 
 1000: 	php_stream_close(stream);
 1001: 	RETURN_TRUE;
 1002: }
 1003: /* }}} */
 1004: 
 1005: /* {{{ proto bool oci_lob_write_temporary(string var [, int lob_type])
 1006:    Writes temporary blob */
 1007: PHP_FUNCTION(oci_lob_write_temporary)
 1008: {
 1009: 	zval **tmp, *z_descriptor = getThis();
 1010: 	php_oci_descriptor *descriptor;
 1011: 	char *data;
 1012: 	int data_len;
 1013: 	long type = OCI_TEMP_CLOB;
 1014: 
 1015: 	if (getThis()) {
 1016: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &type) == FAILURE) {
 1017: 			return;
 1018: 		}
 1019: 	}
 1020: 	else {
 1021: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os|l", &z_descriptor, oci_lob_class_entry_ptr, &data, &data_len, &type) == FAILURE) {
 1022: 			return;
 1023: 		}	
 1024: 	}
 1025: 	
 1026: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
 1027: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
 1028: 		RETURN_FALSE;
 1029: 	}
 1030: 	
 1031: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
 1032: 
 1033: 	if (php_oci_lob_write_tmp(descriptor, type, data, data_len TSRMLS_CC)) {
 1034: 		RETURN_FALSE;
 1035: 	}
 1036: 	RETURN_TRUE;
 1037: }
 1038: /* }}} */
 1039: 
 1040: /* {{{ proto bool oci_lob_close()
 1041:    Closes lob descriptor */
 1042: PHP_FUNCTION(oci_lob_close)
 1043: {
 1044: 	zval **tmp, *z_descriptor = getThis();
 1045: 	php_oci_descriptor *descriptor;
 1046: 	
 1047: 	if (!getThis()) {
 1048: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_descriptor, oci_lob_class_entry_ptr) == FAILURE) {
 1049: 			return;
 1050: 		}	
 1051: 	}
 1052: 	
 1053: 	if (zend_hash_find(Z_OBJPROP_P(z_descriptor), "descriptor", sizeof("descriptor"), (void **)&tmp) == FAILURE) {
 1054: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find descriptor property");
 1055: 		RETURN_FALSE;
 1056: 	}
 1057: 	
 1058: 	PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor);
 1059: 
 1060: 	if (php_oci_lob_close(descriptor TSRMLS_CC)) {
 1061: 		RETURN_FALSE;
 1062: 	}
 1063: 	RETURN_TRUE;
 1064: }
 1065: /* }}} */
 1066: 
 1067: /* {{{ proto object oci_new_descriptor(resource connection [, int type])
 1068:    Initialize a new empty descriptor LOB/FILE (LOB is default) */
 1069: PHP_FUNCTION(oci_new_descriptor)
 1070: {
 1071: 	zval *z_connection;
 1072: 	php_oci_connection *connection;
 1073: 	php_oci_descriptor *descriptor;
 1074: 	long type = OCI_DTYPE_LOB;
 1075: 
 1076: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_connection, &type) == FAILURE) {
 1077: 		return;
 1078: 	}
 1079: 
 1080: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1081: 
 1082: 	/* php_oci_lob_create() checks type */
 1083: 	descriptor = php_oci_lob_create(connection, type TSRMLS_CC);	
 1084: 	
 1085: 	if (!descriptor) {
 1086: 		RETURN_NULL();
 1087: 	}
 1088: 
 1089: 	object_init_ex(return_value, oci_lob_class_entry_ptr);
 1090: 	add_property_resource(return_value, "descriptor", descriptor->id);
 1091: }
 1092: /* }}} */
 1093: 
 1094: /* {{{ proto bool oci_rollback(resource connection)
 1095:    Rollback the current context */
 1096: PHP_FUNCTION(oci_rollback)
 1097: {
 1098: 	zval *z_connection;
 1099: 	php_oci_connection *connection;
 1100: 
 1101: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
 1102: 		return;
 1103: 	}
 1104: 
 1105: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1106: 
 1107: 	if (connection->descriptors) {
 1108: 		php_oci_connection_descriptors_free(connection TSRMLS_CC);
 1109: 	}
 1110: 
 1111: 	if (php_oci_connection_rollback(connection TSRMLS_CC)) {
 1112: 		RETURN_FALSE;
 1113: 	}
 1114: 	RETURN_TRUE;
 1115: }
 1116: /* }}} */
 1117: 
 1118: /* {{{ proto bool oci_commit(resource connection)
 1119:    Commit the current context */
 1120: PHP_FUNCTION(oci_commit)
 1121: {
 1122: 	zval *z_connection;
 1123: 	php_oci_connection *connection;
 1124: 
 1125: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
 1126: 		return;
 1127: 	}
 1128: 
 1129: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1130: 
 1131: 	if (connection->descriptors) {
 1132: 		php_oci_connection_descriptors_free(connection TSRMLS_CC);
 1133: 	}
 1134: 	
 1135: 	if (php_oci_connection_commit(connection TSRMLS_CC)) {
 1136: 		RETURN_FALSE;
 1137: 	}
 1138: 	RETURN_TRUE;
 1139: }
 1140: /* }}} */
 1141: 
 1142: /* {{{ proto string oci_field_name(resource stmt, int col)
 1143:    Tell the name of a column */
 1144: PHP_FUNCTION(oci_field_name)
 1145: {
 1146: 	php_oci_out_column *column;
 1147: 
 1148: 	if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
 1149: 		RETURN_STRINGL(column->name, column->name_len, 1);
 1150: 	}
 1151: 	RETURN_FALSE;
 1152: }
 1153: /* }}} */
 1154: 
 1155: /* {{{ proto int oci_field_size(resource stmt, int col)
 1156:    Tell the maximum data size of a column */
 1157: PHP_FUNCTION(oci_field_size)
 1158: {
 1159: 	php_oci_out_column *column;
 1160: 
 1161: 	if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
 1162: 		/* Handle data type of LONG */
 1163: 		if (column->data_type == SQLT_LNG){
 1164: 			RETURN_LONG(column->storage_size4);
 1165: 		}
 1166: 		RETURN_LONG(column->data_size);
 1167: 	}
 1168: 	RETURN_FALSE;
 1169: }
 1170: /* }}} */
 1171: 
 1172: /* {{{ proto int oci_field_scale(resource stmt, int col)
 1173:    Tell the scale of a column */
 1174: PHP_FUNCTION(oci_field_scale)
 1175: {
 1176: 	php_oci_out_column *column;
 1177: 
 1178: 	if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
 1179: 		RETURN_LONG(column->scale);
 1180: 	}
 1181: 	RETURN_FALSE;
 1182: }
 1183: /* }}} */
 1184: 
 1185: /* {{{ proto int oci_field_precision(resource stmt, int col)
 1186:    Tell the precision of a column */
 1187: PHP_FUNCTION(oci_field_precision)
 1188: {
 1189: 	php_oci_out_column *column;
 1190: 
 1191: 	if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
 1192: 		RETURN_LONG(column->precision);
 1193: 	}
 1194: 	RETURN_FALSE;
 1195: }
 1196: /* }}} */
 1197: 
 1198: /* {{{ proto mixed oci_field_type(resource stmt, int col)
 1199:    Tell the data type of a column */
 1200: PHP_FUNCTION(oci_field_type)
 1201: {
 1202: 	php_oci_out_column *column;
 1203: 
 1204: 	column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 1205: 
 1206: 	if (!column) {
 1207: 		RETURN_FALSE;
 1208: 	}
 1209: 	
 1210: 	switch (column->data_type) {
 1211: #ifdef SQLT_TIMESTAMP
 1212: 		case SQLT_TIMESTAMP:
 1213: 			RETVAL_STRING("TIMESTAMP",1);
 1214: 			break;
 1215: #endif
 1216: #ifdef SQLT_TIMESTAMP_TZ
 1217: 		case SQLT_TIMESTAMP_TZ:
 1218: 			RETVAL_STRING("TIMESTAMP WITH TIMEZONE",1);
 1219: 			break;
 1220: #endif
 1221: #ifdef SQLT_TIMESTAMP_LTZ
 1222: 		case SQLT_TIMESTAMP_LTZ:
 1223: 			RETVAL_STRING("TIMESTAMP WITH LOCAL TIMEZONE",1);
 1224: 			break;
 1225: #endif
 1226: #ifdef SQLT_INTERVAL_YM
 1227: 		case SQLT_INTERVAL_YM:
 1228: 			RETVAL_STRING("INTERVAL YEAR TO MONTH",1);
 1229: 			break;
 1230: #endif
 1231: #ifdef SQLT_INTERVAL_DS
 1232: 		case SQLT_INTERVAL_DS:
 1233: 			RETVAL_STRING("INTERVAL DAY TO SECOND",1);
 1234: 			break;
 1235: #endif
 1236: 		case SQLT_DAT:
 1237: 			RETVAL_STRING("DATE",1);
 1238: 			break;
 1239: 		case SQLT_NUM:
 1240: 			RETVAL_STRING("NUMBER",1);
 1241: 			break;
 1242: 		case SQLT_LNG:
 1243: 			RETVAL_STRING("LONG",1);
 1244: 			break;
 1245: 		case SQLT_BIN:
 1246: 			RETVAL_STRING("RAW",1);
 1247: 			break;
 1248: 		case SQLT_LBI:
 1249: 			RETVAL_STRING("LONG RAW",1);
 1250: 			break;
 1251: 		case SQLT_CHR:
 1252: 			RETVAL_STRING("VARCHAR2",1);
 1253: 			break;
 1254: 		case SQLT_RSET:
 1255: 			RETVAL_STRING("REFCURSOR",1);
 1256: 			break;
 1257: 		case SQLT_AFC:
 1258: 			RETVAL_STRING("CHAR",1);
 1259: 			break;
 1260: 		case SQLT_BLOB:
 1261: 			RETVAL_STRING("BLOB",1);
 1262: 			break;
 1263: 		case SQLT_CLOB:
 1264: 			RETVAL_STRING("CLOB",1);
 1265: 			break;
 1266: 		case SQLT_BFILE:
 1267: 			RETVAL_STRING("BFILE",1);
 1268: 			break;
 1269: 		case SQLT_RDD:
 1270: 			RETVAL_STRING("ROWID",1);
 1271: 			break;
 1272: 		default:
 1273: 			RETVAL_LONG(column->data_type);
 1274: 	}
 1275: }
 1276: /* }}} */
 1277: 
 1278: /* {{{ proto int oci_field_type_raw(resource stmt, int col)
 1279:    Tell the raw oracle data type of a column */
 1280: PHP_FUNCTION(oci_field_type_raw)
 1281: {
 1282: 	php_oci_out_column *column;
 1283: 
 1284: 	column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 1285: 	if (column) {
 1286: 		RETURN_LONG(column->data_type);
 1287: 	}
 1288: 	RETURN_FALSE;
 1289: }
 1290: /* }}} */
 1291: 
 1292: /* {{{ proto bool oci_field_is_null(resource stmt, int col)
 1293:    Tell whether a column is NULL */
 1294: PHP_FUNCTION(oci_field_is_null)
 1295: {
 1296: 	php_oci_out_column *column;
 1297: 
 1298: 	if ( ( column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0) ) ) {
 1299: 		if (column->indicator == -1) {
 1300: 			RETURN_TRUE;
 1301: 		}
 1302: 	}
 1303: 	RETURN_FALSE;
 1304: }
 1305: /* }}} */
 1306: 
 1307: /* {{{ proto void oci_internal_debug(int onoff)
 1308:    Toggle internal debugging output for the OCI extension */
 1309: PHP_FUNCTION(oci_internal_debug)
 1310: {
 1311: 	zend_bool on_off;
 1312: 
 1313: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &on_off) == FAILURE) {
 1314: 		return;
 1315: 	}
 1316: 	OCI_G(debug_mode) = on_off;
 1317: }
 1318: /* }}} */
 1319: 
 1320: /* {{{ proto bool oci_execute(resource stmt [, int mode])
 1321:    Execute a parsed statement */
 1322: PHP_FUNCTION(oci_execute)
 1323: {
 1324: 	zval *z_statement;
 1325: 	php_oci_statement *statement;
 1326: 	long mode = OCI_COMMIT_ON_SUCCESS;
 1327: 
 1328: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &z_statement, &mode) == FAILURE) {
 1329: 		return;
 1330: 	}
 1331: 
 1332: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1333: 
 1334: 	if (php_oci_statement_execute(statement, mode TSRMLS_CC)) {
 1335: 		RETURN_FALSE;
 1336: 	}
 1337: 	RETURN_TRUE;
 1338: }
 1339: /* }}} */
 1340: 
 1341: /* {{{ proto bool oci_cancel(resource stmt)
 1342:    Cancel reading from a cursor */
 1343: PHP_FUNCTION(oci_cancel)
 1344: {
 1345: 	zval *z_statement;
 1346: 	php_oci_statement *statement;
 1347: 
 1348: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 1349: 		return;
 1350: 	}
 1351: 
 1352: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1353: 
 1354: 	if (php_oci_statement_cancel(statement TSRMLS_CC)) {
 1355: 		RETURN_FALSE;
 1356: 	}
 1357: 	RETURN_TRUE;
 1358: }
 1359: /* }}} */
 1360: 
 1361: /* {{{ proto bool oci_fetch(resource stmt)
 1362:    Prepare a new row of data for reading */
 1363: PHP_FUNCTION(oci_fetch)
 1364: {
 1365: 	zval *z_statement;
 1366: 	php_oci_statement *statement;
 1367: 	ub4 nrows = 1; /* only one row at a time is supported for now */
 1368: 
 1369: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 1370: 		return;
 1371: 	}
 1372: 
 1373: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1374: 
 1375: 	if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
 1376: 		RETURN_FALSE;
 1377: 	}
 1378: 	RETURN_TRUE;
 1379: }
 1380: /* }}} */
 1381: 
 1382: /* {{{ proto int ocifetchinto(resource stmt, array &output [, int mode])
 1383:    Fetch a row of result data into an array */
 1384: PHP_FUNCTION(ocifetchinto)
 1385: {
 1386: 	php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM, 3);
 1387: }
 1388: /* }}} */
 1389: 
 1390: /* {{{ proto int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]])
 1391:    Fetch all rows of result data into an array */
 1392: PHP_FUNCTION(oci_fetch_all)
 1393: {
 1394: 	zval *z_statement, *array, *element, *tmp;
 1395: 	php_oci_statement *statement;
 1396: 	php_oci_out_column **columns;
 1397: 	zval ***outarrs;
 1398: 	ub4 nrows = 1;
 1399: 	int i;
 1400: 	long rows = 0, flags = 0, skip = 0, maxrows = -1;
 1401: 
 1402: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz/|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) {
 1403: 		return;
 1404: 	}
 1405: 
 1406: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1407: 
 1408: 	zval_dtor(array);
 1409: 	array_init(array);
 1410: 
 1411: 	while (skip--) {
 1412: 		if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
 1413: 			RETURN_LONG(0);
 1414: 		}
 1415: 	}
 1416: 
 1417: 	if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) {
 1418: 		columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0);
 1419: 
 1420: 		for (i = 0; i < statement->ncolumns; i++) {
 1421: 			columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
 1422: 		}
 1423: 
 1424: 		while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
 1425: 			zval *row;
 1426: 			
 1427: 			MAKE_STD_ZVAL(row);
 1428: 			array_init(row);
 1429: 
 1430: 			for (i = 0; i < statement->ncolumns; i++) {
 1431: 				MAKE_STD_ZVAL(element);
 1432: 				php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC);
 1433: 
 1434: 				if (flags & PHP_OCI_NUM) {
 1435: 					zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL);
 1436: 				} else { /* default to ASSOC */
 1437: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
 1438: 					/* zend_symtable_update is only available in 5.2+ */
 1439: 					zend_symtable_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL);
 1440: #else
 1441: 					/* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */
 1442: 					zend_hash_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL);
 1443: #endif
 1444: 				}
 1445: 			}
 1446: 
 1447: 			zend_hash_next_index_insert(Z_ARRVAL_P(array), &row, sizeof(zval*), NULL);
 1448: 			rows++;
 1449: 
 1450: 			if (maxrows != -1 && rows == maxrows) {
 1451: 				php_oci_statement_cancel(statement TSRMLS_CC);
 1452: 				break;
 1453: 			}
 1454: 		}
 1455: 		efree(columns);
 1456: 
 1457: 	} else { /* default to BY_COLUMN */
 1458: 		columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0);
 1459: 		outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0);
 1460: 		
 1461: 		if (flags & PHP_OCI_NUM) {
 1462: 			for (i = 0; i < statement->ncolumns; i++) {
 1463: 				columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
 1464: 				
 1465: 				MAKE_STD_ZVAL(tmp);
 1466: 				array_init(tmp);
 1467: 				zend_hash_next_index_insert(Z_ARRVAL_P(array), &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
 1468: 			}
 1469: 		} else { /* default to ASSOC */
 1470: 			for (i = 0; i < statement->ncolumns; i++) {
 1471: 				columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC);
 1472: 				
 1473: 				MAKE_STD_ZVAL(tmp);
 1474: 				array_init(tmp);
 1475: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
 1476: 				/* zend_symtable_update is only available in 5.2+ */
 1477: 				zend_symtable_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
 1478: #else
 1479: 				/* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */
 1480: 				zend_hash_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ]));
 1481: #endif
 1482: 			}
 1483: 		}
 1484: 
 1485: 		while (!php_oci_statement_fetch(statement, nrows TSRMLS_CC)) {
 1486: 			for (i = 0; i < statement->ncolumns; i++) {
 1487: 				MAKE_STD_ZVAL(element);
 1488: 				php_oci_column_to_zval(columns[ i ], element, PHP_OCI_RETURN_LOBS TSRMLS_CC);
 1489: 				zend_hash_index_update((*(outarrs[ i ]))->value.ht, rows, (void *)&element, sizeof(zval*), NULL);
 1490: 			}
 1491: 
 1492: 			rows++;
 1493: 
 1494: 			if (maxrows != -1 && rows == maxrows) {
 1495: 				php_oci_statement_cancel(statement TSRMLS_CC);
 1496: 				break;
 1497: 			}
 1498: 		}
 1499: 		
 1500: 		efree(columns);
 1501: 		efree(outarrs);
 1502: 	}
 1503: 
 1504: 	RETURN_LONG(rows);
 1505: }
 1506: /* }}} */
 1507: 
 1508: /* {{{ proto object oci_fetch_object( resource stmt )
 1509:    Fetch a result row as an object */
 1510: PHP_FUNCTION(oci_fetch_object)
 1511: {
 1512: 	php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 2);
 1513: 
 1514: 	if (Z_TYPE_P(return_value) == IS_ARRAY) {
 1515: 		object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
 1516: 	}
 1517: }
 1518: /* }}} */
 1519: 
 1520: /* {{{ proto array oci_fetch_row( resource stmt )
 1521:    Fetch a result row as an enumerated array */
 1522: PHP_FUNCTION(oci_fetch_row)
 1523: {
 1524: 	php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_NUM | PHP_OCI_RETURN_NULLS, 1);
 1525: }
 1526: /* }}} */
 1527: 
 1528: /* {{{ proto array oci_fetch_assoc( resource stmt )
 1529:    Fetch a result row as an associative array */
 1530: PHP_FUNCTION(oci_fetch_assoc)
 1531: {
 1532: 	php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_ASSOC | PHP_OCI_RETURN_NULLS, 1);
 1533: }
 1534: /* }}} */
 1535: 
 1536: /* {{{ proto array oci_fetch_array( resource stmt [, int mode ])
 1537:    Fetch a result row as an array */
 1538: PHP_FUNCTION(oci_fetch_array)
 1539: {
 1540: 	php_oci_fetch_row(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_OCI_BOTH | PHP_OCI_RETURN_NULLS, 2);
 1541: }
 1542: /* }}} */
 1543: 
 1544: /* {{{ proto bool oci_free_statement(resource stmt)
 1545:    Free all resources associated with a statement */
 1546: PHP_FUNCTION(oci_free_statement)
 1547: {
 1548: 	zval *z_statement;
 1549: 	php_oci_statement *statement;
 1550: 
 1551: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 1552: 		return;
 1553: 	}
 1554: 
 1555: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1556: 
 1557: 	zend_list_delete(statement->id);
 1558: 	RETURN_TRUE;
 1559: }
 1560: /* }}} */
 1561: 
 1562: /* {{{ proto bool oci_close(resource connection)
 1563:    Disconnect from database */
 1564: PHP_FUNCTION(oci_close)
 1565: {
 1566: 	/* oci_close for pconnect (if old_oci_close_semantics not set) would
 1567: 	 * release the connection back to the client-side session pool (and to the
 1568: 	 * server-side pool if Database Resident Connection Pool is being used).
 1569: 	 * Subsequent pconnects in the same script are not guaranteed to get the
 1570: 	 * same database session.
 1571: 	 */
 1572: 
 1573: 	zval *z_connection;
 1574: 	php_oci_connection *connection;
 1575: 
 1576: 	if (OCI_G(old_oci_close_semantics)) {
 1577: 		/* do nothing to keep BC */
 1578: 		return;
 1579: 	}
 1580: 	
 1581: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
 1582: 		return;
 1583: 	}
 1584: 
 1585: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1586: 	zend_list_delete(connection->rsrc_id);
 1587: 
 1588: 	ZVAL_NULL(z_connection);
 1589: 	
 1590: 	RETURN_TRUE;
 1591: }
 1592: /* }}} */
 1593: 
 1594: /* {{{ proto resource oci_new_connect(string user, string pass [, string db])
 1595:    Connect to an Oracle database and log on. Returns a new session. */
 1596: PHP_FUNCTION(oci_new_connect)
 1597: {
 1598: 	php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1);
 1599: }
 1600: /* }}} */
 1601: 
 1602: /* {{{ proto resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]])
 1603:    Connect to an Oracle database and log on. Returns a new session. */
 1604: PHP_FUNCTION(oci_connect)
 1605: {
 1606: 	php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
 1607: }
 1608: /* }}} */
 1609: 
 1610: /* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset ]])
 1611:    Connect to an Oracle database using a persistent connection and log on. Returns a new session. */
 1612: PHP_FUNCTION(oci_pconnect)
 1613: {
 1614: 	php_oci_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0);
 1615: }
 1616: /* }}} */
 1617: 
 1618: /* {{{ proto array oci_error([resource stmt|connection|global])
 1619:    Return the last error of stmt|connection|global. If no error happened returns false. */
 1620: PHP_FUNCTION(oci_error)
 1621: {
 1622: 	zval *arg = NULL;
 1623: 	php_oci_statement *statement;
 1624: 	php_oci_connection *connection;
 1625: 	text *errbuf;
 1626: 	sb4 errcode = 0;
 1627: 	sword error = OCI_SUCCESS;
 1628: 	dvoid *errh = NULL;
 1629: 	ub2 error_offset = 0;
 1630: 	text *sqltext = NULL;
 1631: 
 1632: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg) == FAILURE) {
 1633: 		return;
 1634: 	}
 1635: 
 1636: 	if (ZEND_NUM_ARGS() > 0) {
 1637: 		statement = (php_oci_statement *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_statement);
 1638: 	
 1639: 		if (statement) {
 1640: 			errh = statement->err;
 1641: 			error = statement->errcode;
 1642: 
 1643: 			if (php_oci_fetch_sqltext_offset(statement, &sqltext, &error_offset TSRMLS_CC)) {
 1644: 				RETURN_FALSE;
 1645: 			}
 1646: 			goto go_out;
 1647: 		}
 1648: 
 1649: 		connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_connection);
 1650: 		if (connection) {
 1651: 			errh = connection->err;
 1652: 			error = connection->errcode;
 1653: 			goto go_out;
 1654: 		}
 1655: 
 1656: 		connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_pconnection);
 1657: 		if (connection) {
 1658: 			errh = connection->err;
 1659: 			error = connection->errcode;
 1660: 			goto go_out;
 1661: 		}
 1662: 	} else {
 1663: 		errh = OCI_G(err);
 1664: 		error = OCI_G(errcode);
 1665: 	}
 1666: 
 1667: go_out:
 1668: 	if (error == OCI_SUCCESS) { /* no error set in the handle */
 1669: 		RETURN_FALSE;
 1670: 	}
 1671: 
 1672: 	if (!errh) {
 1673: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Oci_error: unable to find error handle");
 1674: 		RETURN_FALSE;
 1675: 	}
 1676: 
 1677: 	errcode = php_oci_fetch_errmsg(errh, &errbuf TSRMLS_CC);
 1678: 
 1679: 	if (errcode) {
 1680: 		array_init(return_value);
 1681: 		add_assoc_long(return_value, "code", errcode);
 1682: 		add_assoc_string(return_value, "message", (char*) errbuf, 0);
 1683: 		add_assoc_long(return_value, "offset", error_offset);
 1684: 		add_assoc_string(return_value, "sqltext", sqltext ? (char *) sqltext : "", 1);
 1685: 	} else {
 1686: 		RETURN_FALSE;
 1687: 	}
 1688: }
 1689: /* }}} */
 1690: 
 1691: /* {{{ proto int oci_num_fields(resource stmt)
 1692:    Return the number of result columns in a statement */
 1693: PHP_FUNCTION(oci_num_fields)
 1694: {
 1695: 	zval *z_statement;
 1696: 	php_oci_statement *statement;
 1697: 
 1698: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 1699: 		return;
 1700: 	}
 1701: 
 1702: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1703: 
 1704: 	RETURN_LONG(statement->ncolumns);
 1705: }
 1706: /* }}} */
 1707: 
 1708: /* {{{ proto resource oci_parse(resource connection, string statement)
 1709:    Parse a SQL or PL/SQL statement and return a statement resource */
 1710: PHP_FUNCTION(oci_parse)
 1711: {
 1712: 	zval *z_connection;
 1713: 	php_oci_connection *connection;
 1714: 	php_oci_statement *statement;
 1715: 	char *query;
 1716: 	int query_len;
 1717: 
 1718: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &query, &query_len) == FAILURE) {
 1719: 		return;
 1720: 	}
 1721: 
 1722: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1723: 
 1724: 	statement = php_oci_statement_create(connection, query, query_len TSRMLS_CC);
 1725: 
 1726: 	if (statement) {
 1727: 		RETURN_RESOURCE(statement->id);
 1728: 	}
 1729: 	RETURN_FALSE;
 1730: }
 1731: /* }}} */
 1732: 
 1733: /* {{{ proto bool oci_set_prefetch(resource stmt, int prefetch_rows)
 1734:   Sets the number of rows to be prefetched on execute to prefetch_rows for stmt */
 1735: PHP_FUNCTION(oci_set_prefetch)
 1736: {
 1737: 	zval *z_statement;
 1738: 	php_oci_statement *statement;
 1739: 	long size;
 1740: 
 1741: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &z_statement, &size) == FAILURE) {
 1742: 		return;
 1743: 	}
 1744: 
 1745: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 1746: 
 1747: 	if (php_oci_statement_set_prefetch(statement, size TSRMLS_CC)) {
 1748: 		RETURN_FALSE;
 1749: 	}
 1750: 	RETURN_TRUE;
 1751: }
 1752: /* }}} */
 1753: 
 1754: /* {{{ proto bool oci_set_client_identifier(resource connection, string value)
 1755:   Sets the client identifier attribute on the connection */
 1756: PHP_FUNCTION(oci_set_client_identifier)
 1757: {
 1758: 	zval *z_connection;
 1759: 	php_oci_connection *connection;
 1760: 	char *client_id;
 1761: 	int client_id_len;
 1762: 
 1763: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_id, &client_id_len) == FAILURE) {
 1764: 		return;
 1765: 	}
 1766: 
 1767: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1768: 
 1769: 	PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err)));
 1770: 
 1771: 	if (OCI_G(errcode) != OCI_SUCCESS) {
 1772: 		php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
 1773: 		RETURN_FALSE;
 1774: 	}
 1775: 
 1776: 	RETURN_TRUE;
 1777: }
 1778: /* }}} */
 1779: 
 1780: /* {{{ proto bool oci_set_edition(string value)
 1781:   Sets the edition attribute for all subsequent connections created */
 1782: PHP_FUNCTION(oci_set_edition)
 1783: {
 1784: #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2)))
 1785: 	char *edition;
 1786: 	int edition_len;
 1787: 
 1788: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &edition, &edition_len) == FAILURE) {
 1789: 		return;
 1790: 	}
 1791: 
 1792: 	if (OCI_G(edition)) {
 1793: 		efree(OCI_G(edition));
 1794: 		OCI_G(edition) = NULL;
 1795: 	}
 1796: 
 1797: 	if (edition) {
 1798: 		OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(text), 0);
 1799: 		memcpy(OCI_G(edition), edition, edition_len);
 1800: 		OCI_G(edition)[edition_len] = '\0';
 1801: 	}
 1802: 
 1803: 	RETURN_TRUE;
 1804: #else
 1805: 	php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
 1806: 	RETURN_FALSE;
 1807: #endif
 1808: }
 1809: /* }}} */
 1810: 
 1811: /* {{{ proto bool oci_set_module_name(resource connection, string value)
 1812:   Sets the module attribute on the connection */
 1813: PHP_FUNCTION(oci_set_module_name)
 1814: {
 1815: #if (OCI_MAJOR_VERSION >= 10)
 1816: 	zval *z_connection;
 1817: 	php_oci_connection *connection;
 1818: 	char *module;
 1819: 	int module_len;
 1820: 
 1821: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &module, &module_len) == FAILURE) {
 1822: 		return;
 1823: 	}
 1824: 
 1825: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1826: 
 1827: 	PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err)));
 1828: 
 1829: 	if (OCI_G(errcode) != OCI_SUCCESS) {
 1830: 		php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
 1831: 		RETURN_FALSE;
 1832: 	}
 1833: 
 1834: 	RETURN_TRUE;
 1835: #else
 1836: 	php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
 1837: 	RETURN_FALSE;
 1838: #endif
 1839: }
 1840: /* }}} */
 1841: 
 1842: /* {{{ proto bool oci_set_action(resource connection, string value)
 1843:   Sets the action attribute on the connection */
 1844: PHP_FUNCTION(oci_set_action)
 1845: {
 1846: #if (OCI_MAJOR_VERSION >= 10)
 1847: 	zval *z_connection;
 1848: 	php_oci_connection *connection;
 1849: 	char *action;
 1850: 	int action_len;
 1851: 
 1852: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &action, &action_len) == FAILURE) {
 1853: 		return;
 1854: 	}
 1855: 
 1856: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1857: 
 1858: 	PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err)));
 1859: 
 1860: 	if (OCI_G(errcode) != OCI_SUCCESS) {
 1861: 		php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
 1862: 		RETURN_FALSE;
 1863: 	}
 1864: 
 1865: 	RETURN_TRUE;
 1866: #else
 1867: 	php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
 1868: 	RETURN_FALSE;
 1869: #endif
 1870: }
 1871: /* }}} */
 1872: 
 1873: /* {{{ proto bool oci_set_client_info(resource connection, string value)
 1874:   Sets the client info attribute on the connection */
 1875: PHP_FUNCTION(oci_set_client_info)
 1876: {
 1877: #if (OCI_MAJOR_VERSION >= 10)
 1878: 	zval *z_connection;
 1879: 	php_oci_connection *connection;
 1880: 	char *client_info;
 1881: 	int client_info_len;
 1882: 
 1883: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_info, &client_info_len) == FAILURE) {
 1884: 		return;
 1885: 	}
 1886: 
 1887: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1888: 
 1889: 	PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err)));
 1890: 
 1891: 	if (OCI_G(errcode) != OCI_SUCCESS) {
 1892: 		php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC);
 1893: 		RETURN_FALSE;
 1894: 	}
 1895: 
 1896: 	RETURN_TRUE;
 1897: #else
 1898: 	php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type");
 1899: 	RETURN_FALSE;
 1900: #endif
 1901: }
 1902: /* }}} */
 1903: 
 1904: /* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password)
 1905:   Changes the password of an account */
 1906: PHP_FUNCTION(oci_password_change)
 1907: {
 1908: 	zval *z_connection;
 1909: 	char *user, *pass_old, *pass_new, *dbname;
 1910: 	int user_len, pass_old_len, pass_new_len, dbname_len;
 1911: 	php_oci_connection *connection;
 1912: 
 1913: #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || (PHP_MAJOR_VERSION < 5)
 1914: 	/* Safe mode has been removed in PHP 5.4 */
 1915: 	if (PG(safe_mode)) {
 1916: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "is disabled in Safe Mode");
 1917: 		RETURN_FALSE;
 1918: 	}
 1919: #endif
 1920: 
 1921: 	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) {
 1922: 		PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1923: 
 1924: 		if (!user_len) {
 1925: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty");
 1926: 			RETURN_FALSE;
 1927: 		}
 1928: 		if (!pass_old_len) {
 1929: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty");
 1930: 			RETURN_FALSE;
 1931: 		}
 1932: 		if (!pass_new_len) {
 1933: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty");
 1934: 			RETURN_FALSE;
 1935: 		}
 1936: 
 1937: 		if (php_oci_password_change(connection, user, user_len, pass_old, pass_old_len, pass_new, pass_new_len TSRMLS_CC)) {
 1938: 			RETURN_FALSE;
 1939: 		}
 1940: 		RETURN_TRUE;
 1941: 	} 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) {
 1942: 
 1943: 		if (!user_len) {
 1944: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "username cannot be empty");
 1945: 			RETURN_FALSE;
 1946: 		}
 1947: 		if (!pass_old_len) {
 1948: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "old password cannot be empty");
 1949: 			RETURN_FALSE;
 1950: 		}
 1951: 		if (!pass_new_len) {
 1952: 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "new password cannot be empty");
 1953: 			RETURN_FALSE;
 1954: 		}
 1955: 
 1956: 		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);
 1957: 		if (!connection) {
 1958: 			RETURN_FALSE;
 1959: 		}
 1960: 		RETURN_RESOURCE(connection->rsrc_id);
 1961: 	}
 1962: 	WRONG_PARAM_COUNT;
 1963: }
 1964: /* }}} */
 1965: 
 1966: /* {{{ proto resource oci_new_cursor(resource connection)
 1967:    Return a new cursor (Statement-Handle) - use this to bind ref-cursors! */
 1968: PHP_FUNCTION(oci_new_cursor)
 1969: {
 1970: 	zval *z_connection;
 1971: 	php_oci_connection *connection;
 1972: 	php_oci_statement *statement;
 1973: 
 1974: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
 1975: 		return;
 1976: 	}
 1977: 
 1978: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 1979: 
 1980: 	statement = php_oci_statement_create(connection, NULL, 0 TSRMLS_CC);
 1981: 	
 1982: 	if (statement) {
 1983: 		RETURN_RESOURCE(statement->id);
 1984: 	}
 1985: 	RETURN_FALSE;
 1986: }
 1987: /* }}} */
 1988: 
 1989: /* {{{ proto string oci_result(resource stmt, mixed column)
 1990:    Return a single column of result data */
 1991: PHP_FUNCTION(oci_result)
 1992: {
 1993: 	php_oci_out_column *column;
 1994: 	
 1995: 	column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
 1996: 	if(column) {
 1997: 		php_oci_column_to_zval(column, return_value, 0 TSRMLS_CC);
 1998: 	}
 1999: 	else {
 2000: 		RETURN_FALSE;
 2001: 	}
 2002: }
 2003: /* }}} */
 2004: 
 2005: /* {{{ proto string oci_client_version()
 2006:    Return a string containing runtime client library version information */
 2007: PHP_FUNCTION(oci_client_version)
 2008: {
 2009: 	char *version = NULL;
 2010: 
 2011: 	php_oci_client_get_version(&version TSRMLS_CC);
 2012: 	RETURN_STRING(version, 0);
 2013: }
 2014: /* }}} */
 2015: 
 2016: /* {{{ proto string oci_server_version(resource connection)
 2017:    Return a string containing server version information */
 2018: PHP_FUNCTION(oci_server_version)
 2019: {
 2020: 	zval *z_connection;
 2021: 	php_oci_connection *connection;
 2022: 	char *version = NULL;
 2023: 
 2024: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_connection) == FAILURE) {
 2025: 		return;
 2026: 	}
 2027: 
 2028: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 2029: 
 2030: 	if (php_oci_server_get_version(connection, &version TSRMLS_CC)) {
 2031: 		RETURN_FALSE;
 2032: 	}
 2033: 	
 2034: 	RETURN_STRING(version, 0);
 2035: }
 2036: /* }}} */
 2037: 
 2038: /* {{{ proto string oci_statement_type(resource stmt)
 2039:    Return the query type of an OCI statement */
 2040: PHP_FUNCTION(oci_statement_type)
 2041: {
 2042: 	zval *z_statement;
 2043: 	php_oci_statement *statement;
 2044: 	ub2 type;
 2045: 
 2046: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 2047: 		return;
 2048: 	}
 2049: 
 2050: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 2051: 
 2052: 	if (php_oci_statement_get_type(statement, &type TSRMLS_CC)) {
 2053: 		RETURN_FALSE;
 2054: 	}
 2055: 
 2056: 	switch (type) {
 2057: 		case OCI_STMT_SELECT:
 2058: 			RETVAL_STRING("SELECT",1);
 2059: 			break;
 2060: 		case OCI_STMT_UPDATE:
 2061: 			RETVAL_STRING("UPDATE",1);
 2062: 			break;
 2063: 		case OCI_STMT_DELETE:
 2064: 			RETVAL_STRING("DELETE",1);
 2065: 			break;
 2066: 		case OCI_STMT_INSERT:
 2067: 			RETVAL_STRING("INSERT",1);
 2068: 			break;
 2069: 		case OCI_STMT_CREATE:
 2070: 			RETVAL_STRING("CREATE",1);
 2071: 			break;
 2072: 		case OCI_STMT_DROP:
 2073: 			RETVAL_STRING("DROP",1);
 2074: 			break;
 2075: 		case OCI_STMT_ALTER:
 2076: 			RETVAL_STRING("ALTER",1);
 2077: 			break;
 2078: 		case OCI_STMT_BEGIN:
 2079: 			RETVAL_STRING("BEGIN",1);
 2080: 			break;
 2081: 		case OCI_STMT_DECLARE:
 2082: 			RETVAL_STRING("DECLARE",1);
 2083: 			break;
 2084: 		case OCI_STMT_CALL:
 2085: 			RETVAL_STRING("CALL",1);
 2086: 			break;
 2087: 		default:
 2088: 			RETVAL_STRING("UNKNOWN",1);
 2089: 	}
 2090: }
 2091: /* }}} */
 2092: 
 2093: /* {{{ proto int oci_num_rows(resource stmt)
 2094:    Return the row count of an OCI statement */
 2095: PHP_FUNCTION(oci_num_rows)
 2096: {
 2097: 	zval *z_statement;
 2098: 	php_oci_statement *statement;
 2099: 	ub4 rowcount;
 2100: 
 2101: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) {
 2102: 		return;
 2103: 	}
 2104: 
 2105: 	PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
 2106: 
 2107: 	if (php_oci_statement_get_numrows(statement, &rowcount TSRMLS_CC)) {
 2108: 		RETURN_FALSE;
 2109: 	}
 2110: 	RETURN_LONG(rowcount);
 2111: }
 2112: /* }}} */
 2113: 
 2114: /* {{{ proto bool oci_free_collection()
 2115:    Deletes collection object*/
 2116: PHP_FUNCTION(oci_free_collection)
 2117: {
 2118: 	zval **tmp, *z_collection = getThis();
 2119: 	php_oci_collection *collection;
 2120: 
 2121: 	if (!getThis()) {
 2122: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
 2123: 			return;
 2124: 		}	
 2125: 	}
 2126: 	
 2127: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2128: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2129: 		RETURN_FALSE;
 2130: 	}
 2131: 	
 2132: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2133: 
 2134: 	zend_list_delete(collection->id);
 2135: 	RETURN_TRUE;
 2136: }
 2137: /* }}} */
 2138: 
 2139: /* {{{ proto bool oci_collection_append(string value)
 2140:    Append an object to the collection */
 2141: PHP_FUNCTION(oci_collection_append)
 2142: {
 2143: 	zval **tmp, *z_collection = getThis();
 2144: 	php_oci_collection *collection;
 2145: 	char *value;
 2146: 	int value_len;
 2147: 
 2148: 	if (getThis()) {
 2149: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &value, &value_len) == FAILURE) {
 2150: 			return;
 2151: 		}
 2152: 	}
 2153: 	else {
 2154: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Os", &z_collection, oci_coll_class_entry_ptr, &value, &value_len) == FAILURE) {
 2155: 			return;
 2156: 		}	
 2157: 	}
 2158: 	
 2159: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2160: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2161: 		RETURN_FALSE;
 2162: 	}
 2163: 	
 2164: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2165: 
 2166: 	if (php_oci_collection_append(collection, value, value_len TSRMLS_CC)) {
 2167: 		RETURN_FALSE;
 2168: 	}
 2169: 	RETURN_TRUE;
 2170: }
 2171: /* }}} */
 2172: 
 2173: /* {{{ proto string oci_collection_element_get(int ndx)
 2174:    Retrieve the value at collection index ndx */
 2175: PHP_FUNCTION(oci_collection_element_get)
 2176: {
 2177: 	zval **tmp, *z_collection = getThis();
 2178: 	php_oci_collection *collection;
 2179: 	long element_index;
 2180: 	zval *value;
 2181: 
 2182: 	if (getThis()) {
 2183: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &element_index) == FAILURE) {
 2184: 			return;
 2185: 		}
 2186: 	}
 2187: 	else {
 2188: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &element_index) == FAILURE) {
 2189: 			return;
 2190: 		}	
 2191: 	}
 2192: 	
 2193: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2194: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2195: 		RETURN_FALSE;
 2196: 	}
 2197: 	
 2198: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2199: 
 2200: 	if (php_oci_collection_element_get(collection, element_index, &value TSRMLS_CC)) {
 2201: 		RETURN_FALSE;
 2202: 	}
 2203: 	
 2204: 	*return_value = *value;
 2205: 	zval_copy_ctor(return_value);
 2206: 	zval_ptr_dtor(&value);
 2207: }
 2208: /* }}} */
 2209: 
 2210: /* {{{ proto bool oci_collection_assign(object from)
 2211:    Assign a collection from another existing collection */
 2212: PHP_FUNCTION(oci_collection_assign)
 2213: {
 2214: 	zval **tmp_dest, **tmp_from, *z_collection_dest = getThis(), *z_collection_from;
 2215: 	php_oci_collection *collection_dest, *collection_from;
 2216: 
 2217: 	if (getThis()) {
 2218: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection_from, oci_coll_class_entry_ptr) == FAILURE) {
 2219: 			return;
 2220: 		}
 2221: 	}
 2222: 	else {
 2223: 		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) {
 2224: 			return;
 2225: 		}	
 2226: 	}
 2227: 	
 2228: 	if (zend_hash_find(Z_OBJPROP_P(z_collection_dest), "collection", sizeof("collection"), (void **)&tmp_dest) == FAILURE) {
 2229: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The first argument should be valid collection object");
 2230: 		RETURN_FALSE;
 2231: 	}
 2232: 
 2233: 	if (zend_hash_find(Z_OBJPROP_P(z_collection_from), "collection", sizeof("collection"), (void **)&tmp_from) == FAILURE) {
 2234: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property. The second argument should be valid collection object");
 2235: 		RETURN_FALSE;
 2236: 	}
 2237: 
 2238: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp_dest, collection_dest);
 2239: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp_from, collection_from);
 2240: 
 2241: 	if (php_oci_collection_assign(collection_dest, collection_from TSRMLS_CC)) {
 2242: 		RETURN_FALSE;
 2243: 	}
 2244: 	RETURN_TRUE;
 2245: }
 2246: /* }}} */
 2247: 
 2248: /* {{{ proto bool oci_collection_element_assign(int index, string val)
 2249:    Assign element val to collection at index ndx */
 2250: PHP_FUNCTION(oci_collection_element_assign)
 2251: {
 2252: 	zval **tmp, *z_collection = getThis();
 2253: 	php_oci_collection *collection;
 2254: 	int value_len;
 2255: 	long element_index;
 2256: 	char *value;
 2257: 
 2258: 	if (getThis()) {
 2259: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &element_index, &value, &value_len) == FAILURE) {
 2260: 			return;
 2261: 		}
 2262: 	}
 2263: 	else {
 2264: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ols", &z_collection, oci_coll_class_entry_ptr, &element_index, &value, &value_len) == FAILURE) {
 2265: 			return;
 2266: 		}	
 2267: 	}
 2268: 	
 2269: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2270: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2271: 		RETURN_FALSE;
 2272: 	}
 2273: 	
 2274: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2275: 
 2276: 	if (php_oci_collection_element_set(collection, element_index, value, value_len TSRMLS_CC)) {
 2277: 		RETURN_FALSE;
 2278: 	}
 2279: 	RETURN_TRUE;
 2280: }
 2281: /* }}} */
 2282: 
 2283: /* {{{ proto int oci_collection_size()
 2284:    Return the size of a collection */
 2285: PHP_FUNCTION(oci_collection_size)
 2286: {
 2287: 	zval **tmp, *z_collection = getThis();
 2288: 	php_oci_collection *collection;
 2289: 	sb4 size = 0;
 2290: 	
 2291: 	if (!getThis()) {
 2292: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
 2293: 			return;
 2294: 		}	
 2295: 	}
 2296: 	
 2297: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2298: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2299: 		RETURN_FALSE;
 2300: 	}
 2301: 	
 2302: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2303: 
 2304: 	if (php_oci_collection_size(collection, &size TSRMLS_CC)) {
 2305: 		RETURN_FALSE;
 2306: 	}
 2307: 	RETURN_LONG(size);
 2308: }
 2309: /* }}} */
 2310: 
 2311: /* {{{ proto int oci_collection_max()
 2312:    Return the max value of a collection. For a varray this is the maximum length of the array */
 2313: PHP_FUNCTION(oci_collection_max)
 2314: {
 2315: 	zval **tmp, *z_collection = getThis();
 2316: 	php_oci_collection *collection;
 2317: 	long max;
 2318: 	
 2319: 	if (!getThis()) {
 2320: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &z_collection, oci_coll_class_entry_ptr) == FAILURE) {
 2321: 			return;
 2322: 		}	
 2323: 	}
 2324: 	
 2325: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2326: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2327: 		RETURN_FALSE;
 2328: 	}
 2329: 	
 2330: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2331: 
 2332: 	if (php_oci_collection_max(collection, &max TSRMLS_CC)) {
 2333: 		RETURN_FALSE;
 2334: 	}
 2335: 	RETURN_LONG(max);
 2336: }
 2337: /* }}} */
 2338: 
 2339: /* {{{ proto bool oci_collection_trim(int num)
 2340:    Trim num elements from the end of a collection */
 2341: PHP_FUNCTION(oci_collection_trim)
 2342: {
 2343: 	zval **tmp, *z_collection = getThis();
 2344: 	php_oci_collection *collection;
 2345: 	long trim_size;
 2346: 
 2347: 	if (getThis()) {
 2348: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &trim_size) == FAILURE) {
 2349: 			return;
 2350: 		}
 2351: 	}
 2352: 	else {
 2353: 		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &z_collection, oci_coll_class_entry_ptr, &trim_size) == FAILURE) {
 2354: 			return;
 2355: 		}	
 2356: 	}
 2357: 	
 2358: 	if (zend_hash_find(Z_OBJPROP_P(z_collection), "collection", sizeof("collection"), (void **)&tmp) == FAILURE) {
 2359: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find collection property");
 2360: 		RETURN_FALSE;
 2361: 	}
 2362: 	
 2363: 	PHP_OCI_ZVAL_TO_COLLECTION(*tmp, collection);
 2364: 
 2365: 	if (php_oci_collection_trim(collection, trim_size TSRMLS_CC)) {
 2366: 		RETURN_FALSE;
 2367: 	}
 2368: 	RETURN_TRUE;	
 2369: }
 2370: /* }}} */
 2371: 
 2372: /* {{{ proto object oci_new_collection(resource connection, string tdo [, string schema])
 2373:    Initialize a new collection */
 2374: PHP_FUNCTION(oci_new_collection)
 2375: {
 2376: 	zval *z_connection;
 2377: 	php_oci_connection *connection;
 2378: 	php_oci_collection *collection;
 2379: 	char *tdo, *schema = NULL;
 2380: 	int tdo_len, schema_len = 0;
 2381: 	
 2382: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &z_connection, &tdo, &tdo_len, &schema, &schema_len) == FAILURE) {
 2383: 		return;
 2384: 	}
 2385: 	
 2386: 	PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection);
 2387: 	
 2388: 	if ( (collection = php_oci_collection_create(connection, tdo, tdo_len, schema, schema_len TSRMLS_CC)) ) {
 2389: 		object_init_ex(return_value, oci_coll_class_entry_ptr);
 2390: 		add_property_resource(return_value, "collection", collection->id);
 2391: 	}
 2392: 	else {
 2393: 		RETURN_FALSE;
 2394: 	}
 2395: }
 2396: /* }}} */
 2397: 
 2398: #endif /* HAVE_OCI8 */
 2399: 
 2400: /*
 2401:  * Local variables:
 2402:  * tab-width: 4
 2403:  * c-basic-offset: 4
 2404:  * End:
 2405:  * vim600: noet sw=4 ts=4 fdm=marker
 2406:  * vim<600: noet sw=4 ts=4
 2407:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>