mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
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.
This commit is contained in:
parent
d9c26ab299
commit
2aefe30f18
2 changed files with 117 additions and 17 deletions
|
@ -130,6 +130,7 @@ struct PHPFBResult
|
||||||
FBCPList* list; /* The same special kind result just for property list from extract, schema info. */
|
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 selectResults; /* number of results in select */
|
||||||
unsigned int currentResult; /* current result number */
|
unsigned int currentResult; /* current result number */
|
||||||
|
int lobMode; /* 0=Fetch data (default); 1=Fetch handle */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PHPFBLink
|
struct PHPFBLink
|
||||||
|
@ -157,12 +158,15 @@ struct PHPFBLink
|
||||||
#define FBSQL_LOCK_OPTIMISTIC 1
|
#define FBSQL_LOCK_OPTIMISTIC 1
|
||||||
#define FBSQL_LOCK_PESSIMISTIC 2 // default
|
#define FBSQL_LOCK_PESSIMISTIC 2 // default
|
||||||
|
|
||||||
#define FBSQL_ISO_READ_UNCOMMITED 0
|
#define FBSQL_ISO_READ_UNCOMMITTED 0
|
||||||
#define FBSQL_ISO_READ_COMMITED 1
|
#define FBSQL_ISO_READ_COMMITTED 1
|
||||||
#define FBSQL_ISO_REPEATABLE_READ 2
|
#define FBSQL_ISO_REPEATABLE_READ 2
|
||||||
#define FBSQL_ISO_SERIALIZABLE 3 // default
|
#define FBSQL_ISO_SERIALIZABLE 3 // default
|
||||||
#define FBSQL_ISO_VERSIONED 4
|
#define FBSQL_ISO_VERSIONED 4
|
||||||
|
|
||||||
|
#define FBSQL_LOB_DIRECT 0 // default
|
||||||
|
#define FBSQL_LOB_HANDLE 1 // default
|
||||||
|
|
||||||
|
|
||||||
/* {{{ fbsql_functions[]
|
/* {{{ fbsql_functions[]
|
||||||
*/
|
*/
|
||||||
|
@ -212,6 +216,9 @@ function_entry fbsql_functions[] = {
|
||||||
|
|
||||||
PHP_FE(fbsql_create_blob, NULL)
|
PHP_FE(fbsql_create_blob, NULL)
|
||||||
PHP_FE(fbsql_create_clob, 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_hostname, NULL)
|
||||||
PHP_FE(fbsql_database, 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_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_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_UNCOMMITTED", FBSQL_ISO_READ_UNCOMMITTED, 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_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_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_SERIALIZABLE ", FBSQL_ISO_SERIALIZABLE, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("FBSQL_ISO_VERSIONED", FBSQL_ISO_VERSIONED, 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_STOPPING", FBStopping, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("FBSQL_NOEXEC", FBNoExec, 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;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,7 +778,7 @@ PHP_FUNCTION(fbsql_set_transaction)
|
||||||
zval **fbsql_link_index = NULL, **Locking = NULL, **Isolation = NULL;
|
zval **fbsql_link_index = NULL, **Locking = NULL, **Isolation = NULL;
|
||||||
char strSQL[1024];
|
char strSQL[1024];
|
||||||
char *strLocking[] = {"DEFERRED", "OPTIMISTIC", "PESSIMISTIC"};
|
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()) {
|
switch (ZEND_NUM_ARGS()) {
|
||||||
case 3:
|
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])
|
/* {{{ proto string fbsql_hostname(resource link_identifier [, string host_name])
|
||||||
*/
|
*/
|
||||||
PHP_FUNCTION(fbsql_hostname)
|
PHP_FUNCTION(fbsql_hostname)
|
||||||
|
@ -1654,6 +1749,7 @@ static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link)
|
||||||
result->list = NULL;
|
result->list = NULL;
|
||||||
result->selectResults = sR;
|
result->selectResults = sR;
|
||||||
result->currentResult = cR;
|
result->currentResult = cR;
|
||||||
|
result->lobMode = FBSQL_LOB_DIRECT;
|
||||||
|
|
||||||
if (tp[0] != 'E')
|
if (tp[0] != 'E')
|
||||||
{
|
{
|
||||||
|
@ -2200,7 +2296,6 @@ void phpfbColumnAsString (PHPFBResult* result, int column, void* data , int* len
|
||||||
if (*((unsigned char*) data) == '\1')
|
if (*((unsigned char*) data) == '\1')
|
||||||
{ // Direct
|
{ // Direct
|
||||||
*length = ((FBCBlobDirect *)data)->blobSize;
|
*length = ((FBCBlobDirect *)data)->blobSize;
|
||||||
|
|
||||||
*value = estrndup((char *)((FBCBlobDirect *)data)->blobData, *length);
|
*value = estrndup((char *)((FBCBlobDirect *)data)->blobData, *length);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2211,10 +2306,15 @@ void phpfbColumnAsString (PHPFBResult* result, int column, void* data , int* len
|
||||||
lobHandle = fbcbhInitWithHandle(handle);
|
lobHandle = fbcbhInitWithHandle(handle);
|
||||||
*length = fbcbhBlobSize(lobHandle);
|
*length = fbcbhBlobSize(lobHandle);
|
||||||
|
|
||||||
if (dtc == FB_BLOB)
|
if (result->lobMode == FBSQL_LOB_HANDLE) {
|
||||||
*value = estrndup((char *)fbcdcReadBLOB(result->link->connection, lobHandle), *length);
|
phpfbestrdup(fbcbhDescription(lobHandle), length, value);
|
||||||
else
|
}
|
||||||
*value = estrndup((char *)fbcdcReadCLOB(result->link->connection, lobHandle), *length);
|
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);
|
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)
|
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)
|
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)
|
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)*/
|
Fetch a result row as an array (associative, numeric or both)*/
|
||||||
PHP_FUNCTION(fbsql_fetch_array)
|
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)
|
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->rowIndex++;
|
||||||
result->columnIndex = 0;
|
result->columnIndex = 0;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ proto int fbsql_data_seek(int result, int row_number)
|
/* {{{ proto int fbsql_data_seek(int result, int row_number)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -83,6 +83,9 @@ PHP_FUNCTION(fbsql_rollback);
|
||||||
|
|
||||||
PHP_FUNCTION(fbsql_create_blob);
|
PHP_FUNCTION(fbsql_create_blob);
|
||||||
PHP_FUNCTION(fbsql_create_clob);
|
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_hostname);
|
||||||
PHP_FUNCTION(fbsql_database);
|
PHP_FUNCTION(fbsql_database);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue