Browse Source

resync informix driver with php 3.09 version

experimental/newoperator
Danny Heijl 27 years ago
parent
commit
f3d179ff99
  1. 365
      ext/informix/ifx.ec
  2. 35
      ext/informix/php_informix.h

365
ext/informix/ifx.ec

@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
| PHP HTML Embedded Scripting Language Version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997,1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -25,10 +25,12 @@
+----------------------------------------------------------------------+
| Authors: Danny Heijl <Danny.Heijl@cevi.be> : initial cut (ODS 7.2x) |
| Christian Cartus <chc@idgruppe.de> : blobs, and IUS 9 |
| Jouni Ahto <jah@guru.cultnet.fi> : configuration stuff |
| Based on the MySQL code by: Zeev Suraski <bourbon@netvision.net.il> |
| Jouni Ahto <jah@mork.net> : configuration stuff |
| Based on the MySQL code by: Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
*/
/* -------------------------------------------------------------------
* if you want a function reference : "grep '^\*\*' ifx.ec" will give
* you a very short one
@ -52,7 +54,7 @@
*
* ? cursory stored procedures
* Jouni Ahto promised help and already did the configuration stuff
* (Jouni Ahto <jah@guru.cultnet.fi>).
* (Jouni Ahto <jah@mork.net>).
*
*/
@ -79,8 +81,10 @@ Changes: 11.9.1998 (chc@idgruppe.de)
(ifx_query, ifx_prepare, ifx_do, ifx_htmltbl_result, ifx_fetch_row)
- minor bug-fixes
- Test-Page (informix_blob.php3) updated
- begin with coding of slob-support(still deactivated, not yet complete: #undef HAVE_IFX_IUS in php3_ifx.h)
- ifx_fetch_row returns always a blob-id (contains "NULL"-flag or content from db)(except ifx_textasvarchar, ifx_byteasvarchar set to 1)
- begin with coding of slob-support
(still deactivated, not yet complete: #undef HAVE_IFX_IUS in php3_ifx.h)
- ifx_fetch_row returns always a blob-id (contains "NULL"-flag or content from db)
(except ifx_textasvarchar, ifx_byteasvarchar set to 1)
Changes 14.9.1998 (chc@idgruppe.de)
- supports now IUS- serial8,int8,boolean, nchar, nvchar, lvarchar
@ -90,11 +94,32 @@ Changes 25.9.1998 (danny.heijl@cevi.be)
- cursory and non-cursory stored procedures
Changes 24.10.1998 (chc@idgruppe.de)
- changes the internal structure of IFX_BLOB and IFX_SLOB into one structure. it is now prepared for general-id-usage
- changes the internal structure of IFX_BLOB and IFX_SLOB into one structure.
it is now prepared for general-id-usage.
- fixed a lvarchar-bug (i hate esql/c)
Changes 12.11.1998 (danny.heijl@cevi.be)
- added proto comments
Changes 04/03/1999 (danny.heijl@cevi.be)
- added "SET CONNECTION" statement to ifx_fetch_row() so that you can now
fetch rows from different databases simultaneously
(ifx_query() & ifx_prepare() were already OK).
Changes 05/03/1999 (danny.heijl@cevi.be)
- made all sqlerrd[] fields of sqlca structure available
with ifx_getsqlca($query_id) in a pseudo-row after a
prepare (select statements) or insert/update (non-select statements).
gives access to affected rows and serial insert values
- made all internal functions static
Changes 09/03/1999 (danny.heijl@cevi.be)
- suppressed ESQL/C BLOB memory leak fix for ESQL/C 7.24 and higher
this is the same fix as in Perl DBD::Informix
- really free an Ifx_Result now, do not wait for script termination
- code cleanup
*/
@ -102,6 +127,15 @@ Changes 12.11.1998 (danny.heijl@cevi.be)
#include "dl/phpdl.h"
#endif
//
// php 3.0
//#if defined(THREAD_SAFE)
//#include "tls.h"
//DWORD InformixTls;
//static int numthreads=0;
//void *ifx_mutex;
//#endif
#if WIN32|WINNT
#include <winsock.h>
#else
@ -120,8 +154,33 @@ Changes 12.11.1998 (danny.heijl@cevi.be)
#include "build-defs.h"
#include "php_informix.h"
#if HAVE_IFX
/* local function prototypes */
static long php3_intifx_getType(long id, HashTable *list);
static long php3_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list);
static long php3_intifx_free_blob(long id, HashTable *list);
static long php3_intifx2_free_blob(long id, HashTable *list);
static long php3_intifx_get_blob(long bid, HashTable *list, char** content);
static long php3_intifx_update_blob(long bid, char* param, long len, HashTable *list);
static loc_t *php3_intifx_get_blobloc(long bid, HashTable *list);
static char* php3_intifx_create_tmpfile(long bid);
static long php3_intifx_copy_blob(long bid, HashTable *list);
static char* php3_intifx_null();
static long php3_intifx_create_char(char* param, long len, HashTable *list);
static long php3_intifx_free_char(long id, HashTable *list);
static long php3_intifx_update_char(long bid, char* param, long len, HashTable *list);
static long php3_intifx_get_char(long bid, HashTable *list, char** content);
#if HAVE_IFX_IUS
static long php3_intifxus_create_slob(long create_mode, HashTable *list);
static long php3_intifxus_free_slob(long bid, HashTable *list);
static long php3_intifxus_close_slob(long bid, HashTable *list);
static long php3_intifxus_open_slob(long bid, long create_mode, HashTable *list);
static long php3_intifxus_new_slob(HashTable *list);
static ifx_lo_t *php3_intifxus_get_slobloc(long bid, HashTable *list);
#endif
#ifndef CLIENT_SQLI_VER /* 7.10 on (at least) AIX is missing this */
#define CLIENT_SQLI_VER IFX_VERSION
#endif
@ -168,6 +227,7 @@ function_entry ifx_functions[] = {
{"ifx_htmltbl_result", php3_ifx_htmltbl_result, NULL},
{"ifx_fieldtypes", php3_ifx_fieldtypes, NULL},
{"ifx_fieldproperties",php3_ifx_fieldproperties, NULL},
{"ifx_getsqlca", php3_ifx_getsqlca, NULL},
{"ifx_create_blob", php3_ifx_create_blob, NULL},
{"ifx_free_blob", php3_ifx_free_blob, NULL},
@ -405,6 +465,11 @@ int php3_minit_ifx(INIT_FUNC_ARGS)
&Informix_GLOBAL(php3_ifx_module).nullformat)==FAILURE) {
Informix_GLOBAL(php3_ifx_module).nullformat=0;
}
Informix_GLOBAL(php3_ifx_module).nullvalue = malloc(1);
Informix_GLOBAL(php3_ifx_module).nullvalue[0] = 0;
Informix_GLOBAL(php3_ifx_module).nullstring = malloc(5);
strcpy(Informix_GLOBAL(php3_ifx_module).nullstring, "NULL");
if (cfg_get_long("ifx.allow_persistent",
&Informix_GLOBAL(php3_ifx_module).allow_persistent)==FAILURE) {
@ -546,8 +611,6 @@ void php3_info_ifx(void)
** ----------------------------------------------------------------------
*/
/* {{{ proto int ifx_(p)connect(string database,string userid,string password)
connects to database using userid/password, returns connection id */
static void php3_ifx_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent)
{
@ -556,7 +619,6 @@ static void php3_ifx_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent)
char *ifx;
EXEC SQL END DECLARE SECTION;
char *tmp;
char *hashed_details;
int hashed_details_length;
Informix_TLS_VARS;
@ -799,18 +861,23 @@ static void php3_ifx_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent)
efree(hashed_details);
Informix_GLOBAL(php3_ifx_module).default_link=return_value->value.lval;
}
/* }}} */
/* {{{ proto int ifx_connect([string database[, string userid[, string password]]])
connects to database using userid/password, returns connection id */
PHP_FUNCTION(ifx_connect)
{
php3_ifx_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);
}
/* }}} */
/* {{{ proto int ifx_pconnect([string database[, string userid[, string password]]])
connects to database using userid/password, returns connection id */
PHP_FUNCTION(ifx_pconnect)
{
php3_ifx_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);
}
/* }}} */
static int php3_ifx_get_default_link(INTERNAL_FUNCTION_PARAMETERS)
{
@ -942,6 +1009,8 @@ EXEC SQL END DECLARE SECTION;
int locind;
int ctype;
int affected_rows;
long sqlerrd[6];
int e;
int query_type;
int cursoryproc;
@ -995,7 +1064,10 @@ EXEC SQL END DECLARE SECTION;
ifx_error(ifx));
RETURN_FALSE;
}
affected_rows = sqlca.sqlerrd[0]; /* save estimated affected rows */
for (e = 0; e < 6; e++) sqlerrd[e] = sqlca.sqlerrd[e];
EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX 256;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
@ -1132,6 +1204,7 @@ EXEC SQL END DECLARE SECTION;
RETURN_FALSE;
}
Ifx_Result->affected_rows = sqlca.sqlerrd[2]; /* really affected */
for (e = 0; e < 6; e++) Ifx_Result->sqlerrd[e] = sqlca.sqlerrd[e];
} else {
/* ##
** SELECT-STATEMENT
@ -1160,7 +1233,9 @@ EXEC SQL END DECLARE SECTION;
Ifx_Result->affected_rows = affected_rows; /* saved estimated */
Ifx_Result->affected_rows = affected_rows; /* saved estimated from prepare */
for (e = 0; e < 6; e++) Ifx_Result->sqlerrd[e] = sqlerrd[e];
EXEC SQL GET DESCRIPTOR :descrpid :fieldcount = COUNT;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
@ -1301,13 +1376,14 @@ EXEC SQL BEGIN DECLARE SECTION;
char *statement; /* query text */
int fieldcount; /* field count */
int i; /* field index */
short fieldtype;
loc_t *locator;
int loc_t_type=CLOCATORTYPE; /* WORKAROUND: TYPE=CLOCATORTYPE doesn't work, */
int sqlchar_type=SQLCHAR; /* don't ask me, why. */
char *char_tmp;
long len;
int indicator;
long sqlerrd[6];
int e;
$ifdef HAVE_IFX_IUS;
fixed binary 'blob' ifx_lo_t *slocator;
@ -1315,8 +1391,6 @@ $endif;
EXEC SQL END DECLARE SECTION;
char *blobfilename;
int locind;
int ctype;
int affected_rows;
int query_type;
@ -1374,6 +1448,7 @@ EXEC SQL END DECLARE SECTION;
RETURN_FALSE;
}
affected_rows = sqlca.sqlerrd[0]; /* save estimated affected rows */
for (e = 0; e < 6; e++) sqlerrd[e] = sqlca.sqlerrd[e];
EXEC SQL ALLOCATE DESCRIPTOR :descrpid WITH MAX 256;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
@ -1495,7 +1570,8 @@ EXEC SQL END DECLARE SECTION;
_php3_hash_move_forward(pblobidarr->value.ht);
} /* while */
} /* if paramquery */
Ifx_Result->affected_rows = affected_rows; /* saved estimated */
Ifx_Result->affected_rows = affected_rows; /* saved estimated from prepare */
for (e = 0; e < 6; e++) Ifx_Result->sqlerrd[e] = sqlerrd[e];
} else {
/* ##
** SELECT-STATEMENT
@ -1524,7 +1600,8 @@ EXEC SQL END DECLARE SECTION;
strcpy(Ifx_Result->cursorid, cursorid);
Ifx_Result->iscursory = 1;
Ifx_Result->affected_rows = affected_rows; /* saved estimated */
Ifx_Result->affected_rows = affected_rows; /* saved estimated from prepare */
for (e = 0; e < 6; e++) Ifx_Result->sqlerrd[e] = sqlerrd[e];
EXEC SQL GET DESCRIPTOR :descrpid :fieldcount = COUNT;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
@ -1580,6 +1657,8 @@ EXEC SQL BEGIN DECLARE SECTION;
int i; /* field index */
short fieldtype;
loc_t *locator;
int e;
$ifdef HAVE_IFX_IUS;
fixed binary 'blob' ifx_lo_t *slocator;
@ -1589,7 +1668,6 @@ EXEC SQL END DECLARE SECTION;
int locind;
char *blobfilename;
char *blobdir;
Informix_TLS_VARS;
@ -1623,6 +1701,14 @@ EXEC SQL END DECLARE SECTION;
descrpid = Ifx_Result->descrpid;
fieldcount = Ifx_Result->numcols;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
if (Ifx_Result->iscursory < 0) {
php3_error(E_WARNING, "Resultindex %d is not a prepared query",
@ -1642,6 +1728,7 @@ EXEC SQL END DECLARE SECTION;
RETURN_FALSE;
}
Ifx_Result->affected_rows = sqlca.sqlerrd[2]; /* really affected */
for (e = 0; e < 6; e++) Ifx_Result->sqlerrd[e] = sqlca.sqlerrd[e];
} else { /* open cursor */
if (Ifx_Result->isscroll)
if (Ifx_Result->ishold)
@ -1735,8 +1822,7 @@ $endif;
PHP_FUNCTION(ifx_error)
{
pval *ifx_link;
int id,type;
IFX *ifx;
int id;
Informix_TLS_VARS;
@ -1756,16 +1842,6 @@ PHP_FUNCTION(ifx_error)
break;
}
/* connection id is no longer checked
* ifx = (IFX *) php3_list_find(id,&type);
* if (type!=Informix_GLOBAL(php3_ifx_module).le_link
* && type!=Informix_GLOBAL(php3_ifx_module).le_plink) {
* php3_error(E_WARNING,
* "ifx_error : %d (type %d) is not an Informix link index",
* id,
* type);
* }
*/
RETURN_STRING(ifx_error(0),0); /* ifx_error returns emalloced string */
}
/* }}} */
@ -1897,7 +1973,7 @@ PHP_FUNCTION(ifx_affected_rows)
** ----------------------------------------------------------------------
*/
/* {{{ array ifx_fetch_row(int resultid, [mixed position])
/* {{{ proto array ifx_fetch_row(int resultid, [mixed position])
fetches the next row or <position> row if using a scroll cursor */
PHP_FUNCTION(ifx_fetch_row)
{
@ -1909,15 +1985,11 @@ EXEC SQL BEGIN DECLARE SECTION;
char *cursorid; /* query cursor id */
char *statemid; /* statement id */
char *descrpid; /* descriptor id */
char *statement; /* query text */
int fieldcount; /* field count */
int i; /* an index */
char fieldname[64]; /* fieldname */
char ifx_bug; /* pad for ifx bug */
short fieldtype; /* field type */
int fieldleng; /* field length */
int field_ind; /* the field index */
char *field; /* the field data */
$ifdef HAVE_IFX_IUS;
ifx_int8_t int8_var;
@ -1932,7 +2004,7 @@ $endif;
datetime dt_data = {0};
decimal dec_data = {0};
short short_data;
loc_t *locator, *locator_b;
loc_t *locator_b;
$ifdef HAVE_IFX_IUS;
fixed binary 'blob' ifx_lo_t *slocator;
@ -1950,7 +2022,6 @@ EXEC SQL END DECLARE SECTION;
char string_data[256];
long long_data;
char *p;
FILE *fp;
char *blobfilename;
char *fetch_pos;
@ -2011,6 +2082,16 @@ EXEC SQL END DECLARE SECTION;
descrpid = Ifx_Result->descrpid;
fieldcount = Ifx_Result->numcols;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
if (! Ifx_Result->isscroll) {
EXEC SQL FETCH :cursorid USING SQL DESCRIPTOR :descrpid;
} else {
@ -2269,7 +2350,6 @@ $endif;
continue;
}
efree(nullstr);
}
/* }}} */
@ -2297,14 +2377,11 @@ EXEC SQL BEGIN DECLARE SECTION;
char *cursorid; /* query cursor id */
char *statemid; /* statement id */
char *descrpid; /* descriptor id */
char *statement; /* query text */
int fieldcount; /* field count */
int i; /* an index */
char fieldname[64]; /* fieldname */
short fieldtype; /* field type */
int field_ind; /* the field index */
int fieldleng; /* field length */
char *field; /* the field */
$ifdef HAVE_IFX_IUS;
ifx_int8_t int8_var;
@ -2338,13 +2415,9 @@ EXEC SQL END DECLARE SECTION;
long long_data;
char *p;
int locind,bid_b;
FILE *fp;
char *blobfilename;
char *blobdir;
char *table_options;
int moredata;
int bid;
Informix_TLS_VARS;
switch (ARG_COUNT(ht)) {
@ -2387,6 +2460,16 @@ EXEC SQL END DECLARE SECTION;
descrpid = Ifx_Result->descrpid;
fieldcount = Ifx_Result->numcols;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
/* try to fetch the first row */
EXEC SQL FETCH :cursorid USING SQL DESCRIPTOR :descrpid;
switch (ifx_check()) {
@ -2626,7 +2709,6 @@ $endif;
} /* endwhile (moredata); */
php3_printf("</table>\n");
efree(nullstr);
RETURN_LONG(Ifx_Result->rowid);
}
@ -2655,40 +2737,20 @@ EXEC SQL BEGIN DECLARE SECTION;
char *cursorid; /* query cursor id */
char *statemid; /* statement id */
char *descrpid; /* descriptor id */
char *statement; /* query text */
int fieldcount; /* field count */
int i; /* an index */
char fieldname[64]; /* fieldname */
short fieldtype; /* field type */
int field_ind; /* the field index */
int fieldleng; /* field length */
char *field; /* the field */
short indicator;
int int_data;
char *char_data = NULL;
long date_data;
interval intvl_data = {0};
datetime dt_data = {0};
decimal dec_data = {0};
short short_data;
float float_data;
double double_data;
loc_t *locator;
EXEC SQL END DECLARE SECTION;
int type;
int num_fields;
char string_data[256];
long long_data;
char *p;
int locind;
FILE *fp;
char *blobfilename;
char *blobdir;
char *table_options;
int moredata;
Informix_TLS_VARS;
@ -2732,6 +2794,15 @@ EXEC SQL END DECLARE SECTION;
descrpid = Ifx_Result->descrpid;
fieldcount = Ifx_Result->numcols;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
if (array_init(return_value)==FAILURE) {
RETURN_FALSE;
}
@ -2858,26 +2929,11 @@ EXEC SQL BEGIN DECLARE SECTION;
char *cursorid; /* query cursor id */
char *statemid; /* statement id */
char *descrpid; /* descriptor id */
char *statement; /* query text */
int fieldcount; /* field count */
int i; /* an index */
char fieldname[64]; /* fieldname */
short fieldtype; /* field type */
int field_ind; /* the field index */
int fieldleng; /* field length */
char *field; /* the field */
short indicator;
int int_data;
char *char_data = NULL;
long date_data;
interval intvl_data = {0};
datetime dt_data = {0};
decimal dec_data = {0};
short short_data;
float float_data;
double double_data;
loc_t *locator;
int size;
int precision;
int scale;
@ -2888,14 +2944,8 @@ EXEC SQL END DECLARE SECTION;
int num_fields;
char string_data[256];
long long_data;
char *p;
int locind;
FILE *fp;
char *blobfilename;
char *blobdir;
char *table_options;
int moredata;
Informix_TLS_VARS;
@ -2939,6 +2989,16 @@ EXEC SQL END DECLARE SECTION;
descrpid = Ifx_Result->descrpid;
fieldcount = Ifx_Result->numcols;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
if (array_init(return_value)==FAILURE) {
RETURN_FALSE;
}
@ -3087,6 +3147,60 @@ PHP_FUNCTION(ifx_num_rows)
}
/* }}} */
/* --------------------------------------------------------------
** int ifx_getsqlca(int $resultid)
**
** returns the sqlerrd[] fields of the sqlca struct for query $resultid
** following the prepare (select) or execute immediate (insert/update/execute procedure)
**
** ---------------------------------------------------------------
*/
/* {{{ proto int ifx_getsqlca(int $resultid)
returns the sqlerrd[] fields of the sqlca struct for query $resultid */
PHP_FUNCTION(ifx_getsqlca)
{
pval *result;
IFX_RES *Ifx_Result;
int type;
char fieldname[16];
int e;
Informix_TLS_VARS;
if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &result)==FAILURE) {
WRONG_PARAM_COUNT;
}
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = 0;
convert_to_long(result);
Ifx_Result = (IFX_RES *) php3_list_find(result->value.lval,&type);
if (type!=Informix_GLOBAL(php3_ifx_module).le_result) {
php3_error(E_WARNING,"%d is not a Informix result index",
result->value.lval);
RETURN_FALSE;
}
/* create pseudo-row array to return */
if (array_init(return_value)==FAILURE) {
RETURN_FALSE;
}
/* fill array with 6 fields sqlerrd0 .. sqlerrd5 */
/* each ESQLC call saves these sqlca values */
for (e = 0; e < 6; e++) {
sprintf(fieldname,"sqlerrd%d", e);
add_assoc_long(return_value, fieldname, Ifx_Result->sqlerrd[e]);
}
}
/* }}} */
/* ----------------------------------------------------------------------
** int ifx_num_fields(int $resultid)
**
@ -3184,10 +3298,21 @@ EXEC SQL END DECLARE SECTION;
}
}
ifx = Ifx_Result->connecid;
cursorid = Ifx_Result->cursorid;
statemid = Ifx_Result->statemid;
descrpid = Ifx_Result->descrpid;
EXEC SQL set connection :ifx;
if (ifx_check() < 0) {
Informix_GLOBAL(php3_ifx_module).sv_sqlcode = SQLCODE;
php3_error(E_WARNING,"Set connection %s fails (%s)",
ifx,
ifx_error(ifx));
RETURN_FALSE;
}
EXEC SQL free :statemid;
if (strlen(cursorid) != 0) {
EXEC SQL CLOSE :cursorid;
@ -3197,6 +3322,8 @@ EXEC SQL END DECLARE SECTION;
EXEC SQL DEALLOCATE DESCRIPTOR :descrpid;
efree(Ifx_Result); /* this can be safely done now */
php3_list_delete(result->value.lval);
RETURN_TRUE;
}
@ -3217,7 +3344,7 @@ EXEC SQL END DECLARE SECTION;
* return -1 on error otherwise the type: TYPE_BLTEXT, TYPE_BLBYTE, TYPE_SLOB
* ----------------------------------------------------------------------
*/
long php3_intifx_getType(long id, HashTable *list) {
static long php3_intifx_getType(long id, HashTable *list) {
IFX_IDRES *Ifx_res;
int type;
@ -3288,7 +3415,7 @@ PHP_FUNCTION(ifx_create_blob) {
* return -1 on error otherwise the new Blob-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list) {
static long php3_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list) {
IFX_IDRES *Ifx_blob;
@ -3391,7 +3518,7 @@ PHP_FUNCTION(ifx_copy_blob) {
* return -1 on error otherwise the new Blob-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifx_copy_blob(long bid, HashTable *list) {
static long php3_intifx_copy_blob(long bid, HashTable *list) {
IFX_IDRES *Ifx_blob, *Ifx_blob_orig;
loc_t *locator, *locator_orig;
int type;
@ -3494,7 +3621,7 @@ PHP_FUNCTION(ifx_free_blob) {
* FREES BYTE-MEMORY WITH EFREE()
* ----------------------------------------------------------------------
*/
long php3_intifx_free_blob(long bid, HashTable *list) {
static long php3_intifx_free_blob(long bid, HashTable *list) {
IFX_IDRES *Ifx_blob;
int type;
@ -3536,7 +3663,7 @@ long php3_intifx_free_blob(long bid, HashTable *list) {
* use this for freeing blob-source after select (in ifx_free_result)
* ----------------------------------------------------------------------
*/
long php3_intifx2_free_blob(long bid, HashTable *list) {
static long php3_intifx2_free_blob(long bid, HashTable *list) {
IFX_IDRES *Ifx_blob;
int type;
@ -3546,6 +3673,10 @@ long php3_intifx2_free_blob(long bid, HashTable *list) {
bid);
return -1;
}
#if IFX_VERSION < 724 /* this Informix memory leak is fixed from 7.24 on */
/* according to the current PERL DBD::Informix */
/* and otherwise I get segmenation violations with 7.30 */
if(Ifx_blob->BLOB.mode==BLMODE_INMEM) {
if(Ifx_blob->BLOB.blob_data.loc_buffer==NULL ||
Ifx_blob->BLOB.blob_data.loc_size<=0) {;} else {
@ -3556,7 +3687,9 @@ long php3_intifx2_free_blob(long bid, HashTable *list) {
efree(Ifx_blob->BLOB.blob_data.loc_fname);
}
}
#endif
php3_list_delete(bid);
efree(Ifx_blob);
return 0;
@ -3605,7 +3738,7 @@ PHP_FUNCTION(ifx_get_blob) {
* returns the pointer to the content in char** content and the amount of content in bytes
* ----------------------------------------------------------------------
*/
long php3_intifx_get_blob(long bid, HashTable *list, char** content) {
static long php3_intifx_get_blob(long bid, HashTable *list, char** content) {
IFX_IDRES *Ifx_blob;
int type;
@ -3635,7 +3768,7 @@ long php3_intifx_get_blob(long bid, HashTable *list, char** content) {
* return NULL on error or the pointer to the locator-structur
* ----------------------------------------------------------------------
*/
loc_t *php3_intifx_get_blobloc(long bid, HashTable *list) {
static loc_t *php3_intifx_get_blobloc(long bid, HashTable *list) {
IFX_IDRES *Ifx_blob;
int type;
@ -3661,7 +3794,7 @@ loc_t *php3_intifx_get_blobloc(long bid, HashTable *list) {
** ----------------------------------------------------------------------
*/
/* {{{ proto int update_blob(int bid, string content)
/* {{{ proto int ifx_update_blob(int bid, string content)
updates the content of the blob-object */
PHP_FUNCTION(ifx_update_blob) {
pval *pbid,*pparam;
@ -3698,7 +3831,7 @@ PHP_FUNCTION(ifx_update_blob) {
* return nothing
* ----------------------------------------------------------------------
*/
long php3_intifx_update_blob(long bid, char* param, long len, HashTable *list) {
static long php3_intifx_update_blob(long bid, char* param, long len, HashTable *list) {
IFX_IDRES *Ifx_blob;
int type;
@ -3758,7 +3891,7 @@ long php3_intifx_update_blob(long bid, char* param, long len, HashTable *list) {
*/
char* php3_intifx_create_tmpfile(long bid) {
static char* php3_intifx_create_tmpfile(long bid) {
char filename[10];
char *blobdir;
char *blobfile;
@ -3897,15 +4030,13 @@ PHP_FUNCTION(ifx_nullformat) {
* return "" or "NULL"
* ----------------------------------------------------------------------
*/
char* php3_intifx_null() {
static char* php3_intifx_null() {
char* tmp;
if(Informix_GLOBAL(php3_ifx_module).nullformat==0) {
tmp=emalloc(1);
tmp[0]=0;
tmp=Informix_GLOBAL(php3_ifx_module).nullvalue;
} else {
tmp=emalloc(5);
strcpy(tmp,"NULL");
tmp=Informix_GLOBAL(php3_ifx_module).nullstring;
}
return tmp;
}
@ -3962,7 +4093,7 @@ PHP_FUNCTION(ifx_create_char) {
* return -1 on error otherwise the new char-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifx_create_char(char* param, long len, HashTable *list) {
static long php3_intifx_create_char(char* param, long len, HashTable *list) {
IFX_IDRES *Ifx_char;
@ -4034,7 +4165,7 @@ PHP_FUNCTION(ifx_get_char) {
* returns the pointer to the content in char** content and the amount of content in bytes
* ----------------------------------------------------------------------
*/
long php3_intifx_get_char(long bid, HashTable *list, char** content) {
static long php3_intifx_get_char(long bid, HashTable *list, char** content) {
IFX_IDRES *Ifx_char;
int type;
@ -4088,7 +4219,7 @@ PHP_FUNCTION(ifx_free_char) {
* return -1 on error otherwise 0
* ----------------------------------------------------------------------
*/
long php3_intifx_free_char(long bid, HashTable *list) {
static long php3_intifx_free_char(long bid, HashTable *list) {
IFX_IDRES *Ifx_char;
int type;
@ -4155,7 +4286,7 @@ PHP_FUNCTION(ifx_update_char) {
* return nothing
* ----------------------------------------------------------------------
*/
long php3_intifx_update_char(long bid, char* param, long len, HashTable *list) {
static long php3_intifx_update_char(long bid, char* param, long len, HashTable *list) {
IFX_IDRES *Ifx_char;
int type;
@ -4281,7 +4412,7 @@ PHP_FUNCTION(ifxus_create_slob) {
* return -1 on error otherwise the new Blob-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifxus_create_slob(long create_mode, HashTable *list) {
static long php3_intifxus_create_slob(long create_mode, HashTable *list) {
IFX_IDRES *Ifx_slob;
int errcode;
@ -4349,7 +4480,7 @@ PHP_FUNCTION(ifxus_free_slob) {
* return -1 on error otherwise 0
* ----------------------------------------------------------------------
*/
long php3_intifxus_free_slob(long bid, HashTable *list) {
static long php3_intifxus_free_slob(long bid, HashTable *list) {
IFX_IDRES *Ifx_slob;
int type;
@ -4415,7 +4546,7 @@ PHP_FUNCTION(ifxus_close_slob) {
* return -1 on error otherwise 0
* ----------------------------------------------------------------------
*/
long php3_intifxus_close_slob(long bid, HashTable *list) {
static long php3_intifxus_close_slob(long bid, HashTable *list) {
IFX_IDRES *Ifx_slob;
int type;
@ -4498,7 +4629,7 @@ PHP_FUNCTION(ifxus_open_slob) {
* return -1 on error otherwise the new Blob-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifxus_open_slob(long bid, long create_mode, HashTable *list) {
static long php3_intifxus_open_slob(long bid, long create_mode, HashTable *list) {
IFX_IDRES *Ifx_slob;
int errcode;
int type;
@ -4540,7 +4671,7 @@ long php3_intifxus_open_slob(long bid, long create_mode, HashTable *list) {
* return -1 on error otherwise the new slob-Object-id
* ----------------------------------------------------------------------
*/
long php3_intifxus_new_slob(HashTable *list) {
static long php3_intifxus_new_slob(HashTable *list) {
IFX_IDRES *Ifx_slob;
int errcode;
@ -4568,7 +4699,7 @@ long php3_intifxus_new_slob(HashTable *list) {
* return -1 on error otherwise the new Blob-Object-id
* ----------------------------------------------------------------------
*/
ifx_lo_t *php3_intifxus_get_slobloc(long bid, HashTable *list) {
static ifx_lo_t *php3_intifxus_get_slobloc(long bid, HashTable *list) {
IFX_IDRES *Ifx_slob;
int errcode, type;

35
ext/informix/php_informix.h

@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
| PHP HTML Embedded Scripting Language Version 3.0 |
| PHP HTML Embedded Scripting Language Version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
| Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+----------------------------------------------------------------------+
| This program is free software; you can redistribute it and/or modify |
| it under the terms of one of the following licenses: |
@ -25,13 +25,12 @@
+----------------------------------------------------------------------+
| Authors: Danny Heijl <Danny.Heijl@cevi.be>, initial cut (ODS 7) |
| Christian Cartus <chc@idgruppe.de>, blobs, and IUS 9 |
| Jouni Ahto <jah@guru.cultnet.fi> : configuration stuff |
| based on mysql code by: Zeev Suraski <zeev@zend.com> |
| Jouni Ahto <jah@mork.net> : configuration stuff |
| based on mysql code by: Zeev Suraski <zeev@php.net> |
+----------------------------------------------------------------------+
*/
#ifndef _PHP3_IFX_H
#define _PHP3_IFX_H
@ -73,48 +72,29 @@ PHP_FUNCTION(ifx_free_result);
PHP_FUNCTION(ifx_htmltbl_result);
PHP_FUNCTION(ifx_fieldtypes);
PHP_FUNCTION(ifx_fieldproperties);
PHP_FUNCTION(ifx_getsqlca);
long php3_intifx_getType(long id, HashTable *list);
PHP_FUNCTION(ifx_create_blob);
long php3_intifx_create_blob(long type, long mode, char* param, long len, HashTable *list);
PHP_FUNCTION(ifx_free_blob) ;
long php3_intifx_free_blob(long id, HashTable *list);
long php3_intifx2_free_blob(long id, HashTable *list);
PHP_FUNCTION(ifx_get_blob);
long php3_intifx_get_blob(long bid, HashTable *list, char** content);
PHP_FUNCTION(ifx_update_blob);
long php3_intifx_update_blob(long bid, char* param, long len, HashTable *list);
loc_t *php3_intifx_get_blobloc(long bid, HashTable *list);
char* php3_intifx_create_tmpfile(long bid);
PHP_FUNCTION(ifx_blobinfile_mode);
PHP_FUNCTION(ifx_copy_blob);
long php3_intifx_copy_blob(long bid, HashTable *list);
PHP_FUNCTION(ifx_textasvarchar);
PHP_FUNCTION(ifx_byteasvarchar);
PHP_FUNCTION(ifx_nullformat);
char* php3_intifx_null();
PHP_FUNCTION(ifx_create_char);
long php3_intifx_create_char(char* param, long len, HashTable *list);
PHP_FUNCTION(ifx_free_char) ;
long php3_intifx_free_char(long id, HashTable *list);
PHP_FUNCTION(ifx_update_char);
long php3_intifx_update_char(long bid, char* param, long len, HashTable *list);
PHP_FUNCTION(ifx_get_char);
long php3_intifx_get_char(long bid, HashTable *list, char** content);
#if HAVE_IFX_IUS
PHP_FUNCTION(ifxus_create_slob);
long php3_intifxus_create_slob(long create_mode, HashTable *list);
PHP_FUNCTION(ifxus_free_slob) ;
long php3_intifxus_free_slob(long bid, HashTable *list);
PHP_FUNCTION(ifxus_close_slob) ;
long php3_intifxus_close_slob(long bid, HashTable *list);
PHP_FUNCTION(ifxus_open_slob) ;
long php3_intifxus_open_slob(long bid, long create_mode, HashTable *list);
long php3_intifxus_new_slob(HashTable *list);
ifx_lo_t *php3_intifxus_get_slobloc(long bid, HashTable *list);
PHP_FUNCTION(ifxus_read_slob);
PHP_FUNCTION(ifxus_write_slob);
PHP_FUNCTION(ifxus_seek_slob);
@ -136,6 +116,8 @@ typedef struct {
long byteasvarchar; /* 0=as id, 1=as varchar */
long charasvarchar; /* 0=don't strip trailing blanks, 1=strip */
long nullformat; /* 0=NULL as "", 1= NULL as "NULL" */
char *nullvalue; /* "" */
char *nullstring; /* "NULL" */
} ifx_module;
#define MAX_RESID 64
@ -153,6 +135,7 @@ typedef struct ifx_res {
int numcols;
int rowid;
int affected_rows;
long sqlerrd[6];
int res_id[MAX_RESID];
} IFX_RES;
@ -205,6 +188,4 @@ extern ifx_module php3_ifx_module;
#endif
#define phpext_informix_ptr ifx_module_ptr
#endif /* _PHP3_IFX_H */
Loading…
Cancel
Save