1
0
mirror of https://github.com/php/php-src.git synced 2026-04-09 17:13:31 +02:00

Adding support for BLOB and CLOB

This commit is contained in:
Frank M. Kromann
2001-10-10 00:42:00 +00:00
parent 70a60c43ab
commit ffd40bf495
2 changed files with 98 additions and 26 deletions

View File

@@ -24,7 +24,6 @@
*/
/* SB's list:
- BLOBs
- API for a more natural FB connect semantic
- Connect & set session
- Autoreconnect when disconnected
@@ -64,7 +63,7 @@
#include "php_fbsql.h"
#include <signal.h>
static int le_result, le_link, le_plink;
static int le_result, le_link, le_plink, le_lob;
struct PHPFBResult;
typedef struct PHPFBResult PHPFBResult;
@@ -211,6 +210,9 @@ function_entry fbsql_functions[] = {
PHP_FE(fbsql_commit, NULL)
PHP_FE(fbsql_rollback, NULL)
PHP_FE(fbsql_create_blob, NULL)
PHP_FE(fbsql_create_clob, NULL)
PHP_FE(fbsql_hostname, NULL)
PHP_FE(fbsql_database, NULL)
PHP_FE(fbsql_database_password, NULL)
@@ -250,6 +252,7 @@ ZEND_GET_MODULE(fbsql)
static void phpfbReleaseResult (zend_rsrc_list_entry *rsrc TSRMLS_DC);
static void phpfbReleaseLink (zend_rsrc_list_entry *rsrc TSRMLS_DC);
static void phpfbReleasePLink (zend_rsrc_list_entry *rsrc TSRMLS_DC);
static void phpfbReleaseLOB (zend_rsrc_list_entry *rsrc TSRMLS_DC);
static void phpfbReleaseResult(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
@@ -315,6 +318,16 @@ static void phpfbReleasePLink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
}
}
static void phpfbReleaseLOB(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
FBCBlobHandle *lobHandle = (FBCBlobHandle *)rsrc->ptr;
if (lobHandle)
{
fbcbhRelease(lobHandle);
}
}
static void php_fbsql_set_default_link(int id TSRMLS_DC)
{
if (FB_SQL_G(linkIndex)!=-1) {
@@ -379,9 +392,10 @@ PHP_MINIT_FUNCTION(fbsql)
fbcInitialize();
le_result = zend_register_list_destructors_ex(phpfbReleaseResult, NULL, "fbsql result", module_number);
le_link = zend_register_list_destructors_ex(phpfbReleaseLink, NULL, "fbsql link", module_number);
le_plink = zend_register_list_destructors_ex(NULL, phpfbReleasePLink, "fbsql plink", module_number);
le_result = zend_register_list_destructors_ex(phpfbReleaseResult, NULL, "fbsql result", module_number);
le_link = zend_register_list_destructors_ex(phpfbReleaseLink, NULL, "fbsql link", module_number);
le_plink = zend_register_list_destructors_ex(NULL, phpfbReleasePLink, "fbsql plink", module_number);
le_lob = zend_register_list_destructors_ex(phpfbReleaseLOB, NULL, "fbsql lob handle", module_number);
Z_TYPE(fbsql_module_entry) = type;
REGISTER_LONG_CONSTANT("FBSQL_ASSOC", FBSQL_ASSOC, CONST_CS | CONST_PERSISTENT);
@@ -900,6 +914,61 @@ PHP_FUNCTION(fbsql_rollback)
}
/* }}} */
static void php_fbsql_create_lob(INTERNAL_FUNCTION_PARAMETERS, int lob_type)
{
PHPFBLink* phpLink = NULL;
FBCBlobHandle *lobHandle;
zval **lob_data, **fbsql_link_index = NULL;
int id;
switch (ZEND_NUM_ARGS()) {
case 1:
if (zend_get_parameters_ex(1, &lob_data)==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_data, &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);
switch (lob_type) {
case 0 : // BLOB
lobHandle = fbcdcWriteBLOB(phpLink->connection, Z_STRVAL_PP(lob_data), Z_STRLEN_PP(lob_data));
break;
case 1 : // CLOB
lobHandle = fbcdcWriteCLOB(phpLink->connection, Z_STRVAL_PP(lob_data));
break;
}
ZEND_REGISTER_RESOURCE(return_value, lobHandle, le_lob);
}
/* {{{ proto resource fbsql_create_blob(string blob_data [, resource link_identifier])
*/
PHP_FUNCTION(fbsql_create_blob)
{
php_fbsql_create_lob(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
/* }}} */
/* {{{ proto resource fbsql_create_clob(string clob_data [, resource link_identifier])
*/
PHP_FUNCTION(fbsql_create_clob)
{
php_fbsql_create_lob(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
/* }}} */
/* {{{ proto string fbsql_hostname(resource link_identifier [, string host_name])
*/
PHP_FUNCTION(fbsql_hostname)
@@ -2131,33 +2200,32 @@ void phpfbColumnAsString (PHPFBResult* result, int column, void* data , int* len
case FB_CLOB:
case FB_BLOB:
/* {
unsigned char* bytes = (unsigned char*)data;
if (*bytes == '\1')
{ /* Direct
unsigned int l = *((unsigned int*)(bytes+1));
unsigned char* ptr = *((unsigned char**)(bytes+5));
unsigned int i;
mf(file, "%4d:", l);
for (i=0; i < l; i++)
{
if (i)
{
if ((i % 32) == 0)
mf(file, "\n %*d:", lw+4, i);
else if ((i % 4) == 0)
mf(file, " ");
}
mf(file, "%02x", *ptr++);
}
{
if (*((unsigned char*) data) == '\1')
{ // Direct
*length = ((FBCBlobDirect *)data)->blobSize;
*value = emalloc(*length + 1);
strncpy(*value, (char *)((FBCBlobDirect *)data)->blobData, *length);
}
else
{
mf(file, "%s", bytes+1);
FBCBlobHandle *lobHandle;
char *handle = (char *)(&((unsigned char*)data)[1]);
lobHandle = fbcbhInitWithHandle(handle);
*length = fbcbhBlobSize(lobHandle);
*value = emalloc(*length + 1);
if (dtc == FB_BLOB)
strncpy(*value, (char *)fbcdcReadBLOB(result->link->connection, lobHandle), *length);
else
strncpy(*value, (char *)fbcdcReadCLOB(result->link->connection, lobHandle), *length);
fbcbhRelease(lobHandle);
}
}
break;
*/
default:
php_error(E_WARNING, "Unimplemented type");
break;

View File

@@ -80,6 +80,10 @@ PHP_FUNCTION(fbsql_set_transaction);
PHP_FUNCTION(fbsql_autocommit);
PHP_FUNCTION(fbsql_commit);
PHP_FUNCTION(fbsql_rollback);
PHP_FUNCTION(fbsql_create_blob);
PHP_FUNCTION(fbsql_create_clob);
PHP_FUNCTION(fbsql_hostname);
PHP_FUNCTION(fbsql_database);
PHP_FUNCTION(fbsql_database_password);