summaryrefslogtreecommitdiff
path: root/ext/fbsql
diff options
context:
space:
mode:
authorFrank M. Kromann <fmk@php.net>2001-10-16 23:08:38 +0000
committerFrank M. Kromann <fmk@php.net>2001-10-16 23:08:38 +0000
commit2aefe30f18c040fd12c05fa53e8bfc44e1c6faa4 (patch)
treee368524fcc19c6f5f6da1ebb8069fae9667ef8d5 /ext/fbsql
parentd9c26ab299e69a457bd8c76c63967b7892ac18ad (diff)
downloadphp-git-2aefe30f18c040fd12c05fa53e8bfc44e1c6faa4.tar.gz
Adding new functions to retreive LOB data.
fbsql_set_lob_mode() is used to switch from FBSQL_LOB_DIRECT to FBSQL_LOB_HANDLE when LOBS are retreived as FBSQL_LOB_HANDLE the user must call fbsql_read_blob() or fbsql_read_clob() to get the data.
Diffstat (limited to 'ext/fbsql')
-rw-r--r--ext/fbsql/php_fbsql.c131
-rw-r--r--ext/fbsql/php_fbsql.h3
2 files changed, 117 insertions, 17 deletions
diff --git a/ext/fbsql/php_fbsql.c b/ext/fbsql/php_fbsql.c
index bd28ef90b7..e4ac0ca3c2 100644
--- a/ext/fbsql/php_fbsql.c
+++ b/ext/fbsql/php_fbsql.c
@@ -130,6 +130,7 @@ struct PHPFBResult
FBCPList* list; /* The same special kind result just for property list from extract, schema info. */
unsigned int selectResults; /* number of results in select */
unsigned int currentResult; /* current result number */
+ int lobMode; /* 0=Fetch data (default); 1=Fetch handle */
};
struct PHPFBLink
@@ -157,12 +158,15 @@ struct PHPFBLink
#define FBSQL_LOCK_OPTIMISTIC 1
#define FBSQL_LOCK_PESSIMISTIC 2 // default
-#define FBSQL_ISO_READ_UNCOMMITED 0
-#define FBSQL_ISO_READ_COMMITED 1
+#define FBSQL_ISO_READ_UNCOMMITTED 0
+#define FBSQL_ISO_READ_COMMITTED 1
#define FBSQL_ISO_REPEATABLE_READ 2
#define FBSQL_ISO_SERIALIZABLE 3 // default
#define FBSQL_ISO_VERSIONED 4
+#define FBSQL_LOB_DIRECT 0 // default
+#define FBSQL_LOB_HANDLE 1 // default
+
/* {{{ fbsql_functions[]
*/
@@ -212,6 +216,9 @@ function_entry fbsql_functions[] = {
PHP_FE(fbsql_create_blob, NULL)
PHP_FE(fbsql_create_clob, NULL)
+ PHP_FE(fbsql_set_lob_mode, NULL)
+ PHP_FE(fbsql_read_blob, NULL)
+ PHP_FE(fbsql_read_clob, NULL)
PHP_FE(fbsql_hostname, NULL)
PHP_FE(fbsql_database, NULL)
@@ -397,8 +404,8 @@ PHP_MINIT_FUNCTION(fbsql)
REGISTER_LONG_CONSTANT("FBSQL_LOCK_OPTIMISTIC", FBSQL_LOCK_OPTIMISTIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FBSQL_LOCK_PESSIMISTIC", FBSQL_LOCK_PESSIMISTIC, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("FBSQL_ISO_READ_UNCOMMITED", FBSQL_ISO_READ_UNCOMMITED, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("FBSQL_ISO_READ_COMMITED", FBSQL_ISO_READ_COMMITED, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FBSQL_ISO_READ_UNCOMMITTED", FBSQL_ISO_READ_UNCOMMITTED, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FBSQL_ISO_READ_COMMITTED", FBSQL_ISO_READ_COMMITTED, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FBSQL_ISO_REPEATABLE_READ", FBSQL_ISO_REPEATABLE_READ, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FBSQL_ISO_SERIALIZABLE ", FBSQL_ISO_SERIALIZABLE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FBSQL_ISO_VERSIONED", FBSQL_ISO_VERSIONED, CONST_CS | CONST_PERSISTENT);
@@ -411,6 +418,9 @@ PHP_MINIT_FUNCTION(fbsql)
REGISTER_LONG_CONSTANT("FBSQL_STOPPING", FBStopping, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FBSQL_NOEXEC", FBNoExec, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FBSQL_LOB_DIRECT", FBSQL_LOB_DIRECT, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FBSQL_LOB_HANDLE", FBSQL_LOB_HANDLE, CONST_CS | CONST_PERSISTENT);
+
return SUCCESS;
}
@@ -768,7 +778,7 @@ PHP_FUNCTION(fbsql_set_transaction)
zval **fbsql_link_index = NULL, **Locking = NULL, **Isolation = NULL;
char strSQL[1024];
char *strLocking[] = {"DEFERRED", "OPTIMISTIC", "PESSIMISTIC"};
- char *strIsolation[] = {"READ UNCOMMITED", "READ NCOMMITED", "REPEATABLE READ", "SERIALIZABLE", "VERSIONED"};
+ char *strIsolation[] = {"READ UNCOMMITTED", "READ NCOMMITTED", "REPEATABLE READ", "SERIALIZABLE", "VERSIONED"};
switch (ZEND_NUM_ARGS()) {
case 3:
@@ -965,6 +975,91 @@ PHP_FUNCTION(fbsql_create_clob)
}
/* }}} */
+/* {{{ proto bool fbsql_set_lob_mode(resource result, int lob_mode)
+ */
+PHP_FUNCTION(fbsql_set_lob_mode)
+{
+
+ PHPFBResult* result = NULL;
+ zval **fbsql_result_index = NULL, **lob_mode = NULL;
+
+ switch (ZEND_NUM_ARGS()) {
+ case 2:
+ if (zend_get_parameters_ex(2, &fbsql_result_index, &lob_mode)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long_ex(lob_mode);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+ ZEND_FETCH_RESOURCE(result, PHPFBResult *, fbsql_result_index, -1, "FrontBase-Result", le_result);
+
+ result->lobMode = Z_LVAL_PP(lob_mode);
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+static void php_fbsql_read_lob(INTERNAL_FUNCTION_PARAMETERS, int lob_type)
+{
+ PHPFBLink* phpLink = NULL;
+ zval **lob_handle, **fbsql_link_index = NULL;
+ int id;
+ int length = 0;
+ char* value = NULL;
+
+ switch (ZEND_NUM_ARGS()) {
+ case 1:
+ if (zend_get_parameters_ex(1, &lob_handle)==FAILURE) {
+ RETURN_FALSE;
+ }
+ id = php_fbsql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ CHECK_LINK(id);
+ break;
+ case 2:
+ if (zend_get_parameters_ex(2, &lob_handle, &fbsql_link_index)==FAILURE) {
+ RETURN_FALSE;
+ }
+ id = -1;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+ ZEND_FETCH_RESOURCE2(phpLink, PHPFBLink *, fbsql_link_index, id, "FrontBase-Link", le_link, le_plink);
+
+ convert_to_string_ex(lob_handle);
+ length = fbcbhBlobSize((FBCBlobHandle *)Z_STRVAL_PP(lob_handle));
+
+ if (lob_type == 0)
+ value = estrndup((char *)fbcdcReadBLOB(phpLink->connection, (FBCBlobHandle *)Z_STRVAL_PP(lob_handle)), length);
+ else
+ value = estrndup((char *)fbcdcReadCLOB(phpLink->connection, (FBCBlobHandle *)Z_STRVAL_PP(lob_handle)), length);
+ if (value) {
+ RETURN_STRINGL(value, length, 0);
+ }
+ else {
+ RETURN_FALSE;
+ }
+}
+/* {{{ proto string fbsql_read_blob(string blob_handle [, resource link_identifier])
+ */
+PHP_FUNCTION(fbsql_read_blob)
+{
+ php_fbsql_read_lob(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto string fbsql_read_clob(string clob_handle [, resource link_identifier])
+ */
+PHP_FUNCTION(fbsql_read_clob)
+{
+ php_fbsql_read_lob(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
/* {{{ proto string fbsql_hostname(resource link_identifier [, string host_name])
*/
PHP_FUNCTION(fbsql_hostname)
@@ -1654,6 +1749,7 @@ static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link)
result->list = NULL;
result->selectResults = sR;
result->currentResult = cR;
+ result->lobMode = FBSQL_LOB_DIRECT;
if (tp[0] != 'E')
{
@@ -2200,7 +2296,6 @@ void phpfbColumnAsString (PHPFBResult* result, int column, void* data , int* len
if (*((unsigned char*) data) == '\1')
{ // Direct
*length = ((FBCBlobDirect *)data)->blobSize;
-
*value = estrndup((char *)((FBCBlobDirect *)data)->blobData, *length);
}
else
@@ -2211,10 +2306,15 @@ void phpfbColumnAsString (PHPFBResult* result, int column, void* data , int* len
lobHandle = fbcbhInitWithHandle(handle);
*length = fbcbhBlobSize(lobHandle);
- if (dtc == FB_BLOB)
- *value = estrndup((char *)fbcdcReadBLOB(result->link->connection, lobHandle), *length);
- else
- *value = estrndup((char *)fbcdcReadCLOB(result->link->connection, lobHandle), *length);
+ if (result->lobMode == FBSQL_LOB_HANDLE) {
+ phpfbestrdup(fbcbhDescription(lobHandle), length, value);
+ }
+ else {
+ if (dtc == FB_BLOB)
+ *value = estrndup((char *)fbcdcReadBLOB(result->link->connection, lobHandle), *length);
+ else
+ *value = estrndup((char *)fbcdcReadCLOB(result->link->connection, lobHandle), *length);
+ }
fbcbhRelease(lobHandle);
}
}
@@ -2472,7 +2572,7 @@ PHP_FUNCTION(fbsql_num_fields)
}
/* }}} */
-/* {{{ proto array fbsql_fetch_row(int result)
+/* {{{ proto array fbsql_fetch_row(resource result)
*/
PHP_FUNCTION(fbsql_fetch_row)
{
@@ -2480,7 +2580,7 @@ PHP_FUNCTION(fbsql_fetch_row)
}
/* }}} */
-/* {{{ proto object fbsql_fetch_assoc(int result)
+/* {{{ proto object fbsql_fetch_assoc(resource result)
*/
PHP_FUNCTION(fbsql_fetch_assoc)
{
@@ -2488,7 +2588,7 @@ PHP_FUNCTION(fbsql_fetch_assoc)
}
/* }}} */
-/* {{{ proto object fbsql_fetch_object(int result [, int result_type])
+/* {{{ proto object fbsql_fetch_object(resource result [, int result_type])
*/
PHP_FUNCTION(fbsql_fetch_object)
{
@@ -2499,7 +2599,7 @@ PHP_FUNCTION(fbsql_fetch_object)
}
/* }}} */
-/* {{{ proto array fbsql_fetch_array(int result [, int result_type])
+/* {{{ proto array fbsql_fetch_array(resource result [, int result_type])
Fetch a result row as an array (associative, numeric or both)*/
PHP_FUNCTION(fbsql_fetch_array)
{
@@ -2507,8 +2607,6 @@ PHP_FUNCTION(fbsql_fetch_array)
}
/* }}} */
-/* {{{ php_fbsql_fetch_hash
- */
static void php_fbsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
{
@@ -2617,7 +2715,6 @@ static void php_fbsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
result->rowIndex++;
result->columnIndex = 0;
}
-/* }}} */
/* {{{ proto int fbsql_data_seek(int result, int row_number)
*/
diff --git a/ext/fbsql/php_fbsql.h b/ext/fbsql/php_fbsql.h
index a270a6a067..584edf16b6 100644
--- a/ext/fbsql/php_fbsql.h
+++ b/ext/fbsql/php_fbsql.h
@@ -83,6 +83,9 @@ PHP_FUNCTION(fbsql_rollback);
PHP_FUNCTION(fbsql_create_blob);
PHP_FUNCTION(fbsql_create_clob);
+PHP_FUNCTION(fbsql_set_lob_mode);
+PHP_FUNCTION(fbsql_read_blob);
+PHP_FUNCTION(fbsql_read_clob);
PHP_FUNCTION(fbsql_hostname);
PHP_FUNCTION(fbsql_database);