mirror of
https://github.com/php/php-src.git
synced 2024-11-24 10:24:11 +08:00
fixed Ora_PLogon (rewrote ora_do_logon using php_mysql.c)
oracle_hack.c should no longer be needed!
This commit is contained in:
parent
49c891f2cf
commit
24c5143122
@ -2,6 +2,7 @@ PHP 4.0 CHANGE LOG ChangeLog
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
|
||||
?? ?? 1999, Version 4.0 Beta 3
|
||||
- Fixed Ora_PLogon (Thies)
|
||||
- Resourcified Oracle (Thies)
|
||||
- Implemented object serialization/deserialization in WDDX (Andrey)
|
||||
- Added krsort() function (Thies)
|
||||
|
@ -31,27 +31,12 @@
|
||||
|
||||
#include "php.h"
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
#include "internal_functions.h"
|
||||
#include "php3_list.h"
|
||||
#include "head.h"
|
||||
#else
|
||||
#include "zend_globals.h"
|
||||
#endif
|
||||
#include "zend_globals.h"
|
||||
|
||||
#if HAVE_ORACLE
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
#include "oracle.h"
|
||||
#define HASH_DTOR (void (*)(void *))
|
||||
#else
|
||||
#include "php3_oracle.h"
|
||||
#define HASH_DTOR (int (*)(void *))
|
||||
#endif
|
||||
|
||||
#ifndef ZEND_MODULE_INFO_FUNC_ARGS
|
||||
#define ZEND_MODULE_INFO_FUNC_ARGS void
|
||||
#endif
|
||||
#include "php3_oracle.h"
|
||||
#define HASH_DTOR (int (*)(void *))
|
||||
|
||||
#ifdef WIN32
|
||||
# include "variables.h"
|
||||
@ -59,7 +44,6 @@
|
||||
# include "build-defs.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include "snprintf.h"
|
||||
|
||||
#ifndef min
|
||||
@ -93,7 +77,7 @@ static int _close_oracur(oraCursor *cur);
|
||||
static int _ora_ping(oraConnection *conn);
|
||||
int ora_set_param_values(oraCursor *cursor, int isout);
|
||||
|
||||
void php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAMETERS, int persistent);
|
||||
void ora_do_logon(INTERNAL_FUNCTION_PARAMETERS, int persistent);
|
||||
|
||||
static int le_conn, le_pconn, le_cursor;
|
||||
|
||||
@ -207,6 +191,8 @@ DLEXPORT php3_module_entry *get_module() { return &oracle_module_entry; };
|
||||
static int _close_oraconn(oraConnection *conn)
|
||||
{
|
||||
ORALS_FETCH();
|
||||
|
||||
printf("_close_oraconn\n");fflush(stdout);
|
||||
|
||||
conn->open = 0;
|
||||
|
||||
@ -223,6 +209,7 @@ static int _close_orapconn(oraConnection *conn)
|
||||
{
|
||||
ORALS_FETCH();
|
||||
|
||||
printf("_close_orapconn\n");fflush(stdout);
|
||||
conn->open = 0;
|
||||
|
||||
ologof(&conn->lda);
|
||||
@ -416,7 +403,7 @@ static int _ora_ping(oraConnection *conn)
|
||||
Open an Oracle connection */
|
||||
PHP_FUNCTION(ora_logon)
|
||||
{
|
||||
php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
|
||||
ora_do_logon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -424,20 +411,19 @@ PHP_FUNCTION(ora_logon)
|
||||
Open a persistant Oracle connection */
|
||||
PHP_FUNCTION(ora_plogon)
|
||||
{
|
||||
php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
|
||||
ora_do_logon(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAMETERS, int persistent)
|
||||
void ora_do_logon(INTERNAL_FUNCTION_PARAMETERS, int persistent)
|
||||
{
|
||||
char *user = NULL;
|
||||
char *pwd = NULL;
|
||||
char *user,*passwd;
|
||||
pval *arg1, *arg2;
|
||||
oraConnection *db_conn;
|
||||
list_entry *index_ptr;
|
||||
char *hashed_details;
|
||||
int hashed_len, len, id;
|
||||
int hashed_details_length;
|
||||
oraConnection *db_conn;
|
||||
ORALS_FETCH();
|
||||
PLS_FETCH();
|
||||
|
||||
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
|
||||
WRONG_PARAM_COUNT;
|
||||
@ -447,153 +433,153 @@ void php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAMETERS, int persistent)
|
||||
convert_to_string(arg2);
|
||||
|
||||
user = arg1->value.str.val;
|
||||
pwd = arg2->value.str.val;
|
||||
passwd = arg2->value.str.val;
|
||||
|
||||
hashed_details_length = sizeof("oracle__")-1+strlen(user)+strlen(passwd);
|
||||
hashed_details = (char *) emalloc(hashed_details_length+1);
|
||||
sprintf(hashed_details,"oracle_%s_%s",user,passwd);
|
||||
|
||||
if (!ORA(allow_persistent)) {
|
||||
persistent = 0;
|
||||
persistent=0;
|
||||
}
|
||||
|
||||
if (ORA(max_links) != -1 &&
|
||||
ORA(num_links) >=
|
||||
ORA(max_links)) {
|
||||
php_error(E_WARNING, "Oracle: Too many open links (%d)",
|
||||
ORA(num_links));
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
/* the user requested a persistent connection */
|
||||
if (persistent &&
|
||||
ORA(max_persistent) != -1 &&
|
||||
ORA(num_persistent) >=
|
||||
ORA(max_persistent)) {
|
||||
php_error(E_WARNING,"Oracle: Too many open persistent links (%d)",
|
||||
ORA(num_persistent));
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
len = strlen(user) + strlen(pwd) + 9;
|
||||
hashed_details = emalloc(len);
|
||||
|
||||
if (hashed_details == NULL) {
|
||||
php_error(E_WARNING, "Out of memory");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
hashed_len = php_sprintf(hashed_details, "ora_%s_%s", user, pwd);
|
||||
|
||||
/* try to find if we already have this link in our persistent list,
|
||||
* no matter if it is to be persistent or not
|
||||
*/
|
||||
|
||||
if (zend_hash_find(plist, hashed_details, hashed_len + 1,
|
||||
(void **) &index_ptr) == FAILURE) {
|
||||
/* the link is not in the persistent list */
|
||||
list_entry new_index_ptr;
|
||||
|
||||
if (persistent)
|
||||
if (persistent) {
|
||||
list_entry *le;
|
||||
|
||||
/* try to find if we already have this link in our persistent list */
|
||||
if (zend_hash_find(plist, hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */
|
||||
list_entry new_le;
|
||||
|
||||
if (ORA(max_links)!=-1 && ORA(num_links)>=ORA(max_links)) {
|
||||
php_error(E_WARNING,"Oracle: Too many open links (%d)",ORA(num_links));
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
if (ORA(max_persistent)!=-1 && ORA(num_persistent)>=ORA(max_persistent)) {
|
||||
php_error(E_WARNING,"MySQL: Too many open persistent links (%d)",ORA(num_persistent));
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
/* create the link */
|
||||
db_conn = (oraConnection *)malloc(sizeof(oraConnection));
|
||||
else
|
||||
db_conn = (oraConnection *)emalloc(sizeof(oraConnection));
|
||||
|
||||
if (db_conn == NULL){
|
||||
efree(hashed_details);
|
||||
php_error(E_WARNING, "Out of memory");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
memset((void *) db_conn,0,sizeof(oraConnection));
|
||||
memset((void *) db_conn,0,sizeof(oraConnection));
|
||||
|
||||
if (
|
||||
#if HAS_OLOG
|
||||
if (olog(&db_conn->lda, db_conn->hda, user,
|
||||
strlen(user), pwd, strlen(pwd), 0, -1, OCI_LM_DEF)) {
|
||||
olog(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0, -1, OCI_LM_DEF)
|
||||
#else
|
||||
if (orlon(&db_conn->lda, db_conn->hda, user,
|
||||
strlen(user), pwd, strlen(pwd), 0)) {
|
||||
orlon(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0)
|
||||
#endif
|
||||
php_error(E_WARNING, "Unable to connect to ORACLE (%s)",
|
||||
ora_error(&db_conn->lda));
|
||||
if (persistent)
|
||||
free(db_conn);
|
||||
else
|
||||
efree(db_conn);
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
db_conn->open = 1;
|
||||
if (persistent){
|
||||
/*new_le.type = le_pconn;
|
||||
new_le.ptr = db_conn;*/
|
||||
RETVAL_RESOURCE(php3_plist_insert(db_conn, le_pconn));
|
||||
new_index_ptr.ptr = (void *) return_value->value.lval;
|
||||
#ifdef THREAD_SAFE
|
||||
new_index_ptr.type = _php3_le_index_ptr();
|
||||
#else
|
||||
new_index_ptr.type = le_index_ptr;
|
||||
#endif
|
||||
if (zend_hash_update(plist,hashed_details,hashed_len + 1,(void *) &new_index_ptr,
|
||||
sizeof(list_entry),NULL) == FAILURE) {
|
||||
ologof(&db_conn->lda);
|
||||
) {
|
||||
php_error(E_WARNING, "Unable to connect to ORACLE (%s)",ora_error(&db_conn->lda));
|
||||
|
||||
if (persistent) {
|
||||
free(db_conn);
|
||||
} else {
|
||||
efree(db_conn);
|
||||
}
|
||||
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
/* hash it up */
|
||||
new_le.type = le_pconn;
|
||||
new_le.ptr = db_conn;
|
||||
if (zend_hash_update(plist, hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) {
|
||||
free(db_conn);
|
||||
efree(hashed_details);
|
||||
php_error(E_WARNING, "Can't update hashed details list");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
ORA(num_persistent)++;
|
||||
} else {
|
||||
/* non persistent, simply add to list */
|
||||
RETVAL_RESOURCE(php3_list_insert(db_conn, le_conn));
|
||||
}
|
||||
|
||||
ORA(num_links)++;
|
||||
|
||||
} else {
|
||||
int type;
|
||||
|
||||
/* the link is already in the persistent list */
|
||||
#ifdef THREAD_SAFE
|
||||
if (index_ptr->type != _php3_le_index_ptr()) {
|
||||
#else
|
||||
if (index_ptr->type != le_index_ptr) {
|
||||
#endif
|
||||
efree(hashed_details);
|
||||
php_error(E_WARNING, "Oops, something went completly wrong");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
id = (int) index_ptr->ptr;
|
||||
db_conn = (oraConnection *)php3_plist_find(id, &type);
|
||||
|
||||
if (db_conn && (type == le_conn ||
|
||||
type == le_pconn)){
|
||||
if(!_ora_ping(db_conn)) {
|
||||
/* XXX Reinitialize lda, hda ? */
|
||||
ORA(num_links)++;
|
||||
zend_hash_add(ORA(conns),(void*)&db_conn,sizeof(void*),(void*)&db_conn,sizeof(void*),NULL);
|
||||
} else { /* we do */
|
||||
if (le->type != le_pconn) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
db_conn = (oraConnection *) le->ptr;
|
||||
|
||||
/* ensure that the link did not die */
|
||||
|
||||
if (!_ora_ping(db_conn)) {
|
||||
if (
|
||||
#if HAS_OLOG
|
||||
if(olog(&db_conn->lda, db_conn->hda, user,
|
||||
strlen(user), pwd, strlen(pwd), 0, -1, OCI_LM_DEF)) {
|
||||
olog(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0, -1, OCI_LM_DEF)
|
||||
#else
|
||||
if(orlon(&db_conn->lda, db_conn->hda, user,
|
||||
strlen(user), pwd, strlen(pwd), 0)) {
|
||||
orlon(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0)
|
||||
#endif
|
||||
php_error(E_WARNING, "Unable to reconnect to ORACLE (%s)",
|
||||
ora_error(&db_conn->lda));
|
||||
/* Delete list entry for this connection */
|
||||
php3_plist_delete(id);
|
||||
/* Delete hashed list entry for this dead connection */
|
||||
zend_hash_del(plist, hashed_details, hashed_len);
|
||||
) {
|
||||
php_error(E_WARNING, "Oracle: Link to server lost, unable to reconnect",ora_error(&db_conn->lda));
|
||||
zend_hash_del(plist, hashed_details, hashed_details_length+1);
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
RETVAL_RESOURCE(id);
|
||||
}
|
||||
}
|
||||
ZEND_REGISTER_RESOURCE(return_value, db_conn, le_pconn);
|
||||
} else { /* non persistent */
|
||||
list_entry *index_ptr,new_index_ptr;
|
||||
|
||||
zend_hash_add(ORA(conns),
|
||||
(void*)&db_conn,
|
||||
sizeof(void*),
|
||||
(void*)&db_conn,
|
||||
sizeof(void*),
|
||||
NULL);
|
||||
/* first we check the hash for the hashed_details key. if it exists,
|
||||
* it should point us to the right offset where the actual mysql link sits.
|
||||
* if it doesn't, open a new mysql link, add it to the resource list,
|
||||
* and add a pointer to it with hashed_details as the key.
|
||||
*/
|
||||
if (zend_hash_find(list,hashed_details,hashed_details_length+1,(void **) &index_ptr)==SUCCESS) {
|
||||
int type,link;
|
||||
void *ptr;
|
||||
|
||||
if (index_ptr->type != le_index_ptr) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
link = (int) index_ptr->ptr;
|
||||
ptr = zend_list_find(link,&type); /* check if the link is still there */
|
||||
if (ptr && (type==le_conn || type==le_pconn)) {
|
||||
zend_list_addref(link);
|
||||
return_value->value.lval = link;
|
||||
return_value->type = IS_RESOURCE;
|
||||
efree(hashed_details);
|
||||
return;
|
||||
} else {
|
||||
zend_hash_del(list,hashed_details,hashed_details_length+1);
|
||||
}
|
||||
}
|
||||
if (ORA(max_links)!=-1 && ORA(num_links)>=ORA(max_links)) {
|
||||
php_error(E_WARNING,"Oracle: Too many open links (%d)",ORA(num_links));
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
db_conn = (oraConnection *) emalloc(sizeof(oraConnection));
|
||||
memset((void *) db_conn,0,sizeof(oraConnection));
|
||||
|
||||
if (
|
||||
#if HAS_OLOG
|
||||
olog(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0, -1, OCI_LM_DEF)
|
||||
#else
|
||||
orlon(&db_conn->lda, db_conn->hda, user,strlen(user), passwd, strlen(passwd), 0)
|
||||
#endif
|
||||
) {
|
||||
php_error(E_WARNING,"Oracle: Connection Failed: %s\n",ora_error(&db_conn->lda));
|
||||
efree(hashed_details);
|
||||
efree(db_conn);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
/* add it to the list */
|
||||
ZEND_REGISTER_RESOURCE(return_value, db_conn, le_conn);
|
||||
|
||||
/* add it to the hash */
|
||||
new_index_ptr.ptr = (void *) return_value->value.lval;
|
||||
new_index_ptr.type = le_index_ptr;
|
||||
if (zend_hash_update(list,hashed_details,hashed_details_length+1,(void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) {
|
||||
efree(hashed_details);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
zend_hash_add(ORA(conns),(void*)&db_conn,sizeof(void*),(void*)&db_conn,sizeof(void*),NULL);
|
||||
ORA(num_links)++;
|
||||
}
|
||||
|
||||
efree(hashed_details);
|
||||
}
|
||||
@ -602,7 +588,6 @@ void php3_Ora_Do_Logon(INTERNAL_FUNCTION_PARAMETERS, int persistent)
|
||||
Close an Oracle connection */
|
||||
PHP_FUNCTION(ora_logoff)
|
||||
{ /* conn_index */
|
||||
int type, ind;
|
||||
oraConnection *conn;
|
||||
pval *arg;
|
||||
ORALS_FETCH();
|
||||
@ -611,15 +596,10 @@ PHP_FUNCTION(ora_logoff)
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
|
||||
convert_to_long(arg);
|
||||
ind = (int)arg->value.lval;
|
||||
conn = (oraConnection *) zend_fetch_resource_ex(arg, -1, "Oracle-Connection", 2, le_conn, le_pconn);
|
||||
ZEND_VERIFY_RESOURCE(conn);
|
||||
|
||||
conn = (oraConnection *)php3_list_find(ind, &type);
|
||||
if (!conn || (type != le_conn &&
|
||||
type != le_pconn)) {
|
||||
return;
|
||||
}
|
||||
php3_list_delete(ind);
|
||||
php3_list_delete(arg->value.lval);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -630,7 +610,6 @@ PHP_FUNCTION(ora_open)
|
||||
pval *arg;
|
||||
oraConnection *conn = NULL;
|
||||
oraCursor *cursor = NULL;
|
||||
int conn_ind;
|
||||
|
||||
if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
|
||||
WRONG_PARAM_COUNT;
|
||||
@ -652,9 +631,8 @@ PHP_FUNCTION(ora_open)
|
||||
}
|
||||
cursor->open = 1;
|
||||
cursor->conn_ptr = conn;
|
||||
cursor->conn_id = conn_ind;
|
||||
|
||||
ZEND_REGISTER_RESOURCE(return_value, cursor, le_cursor);
|
||||
cursor->conn_id = return_value->value.lval;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -1173,16 +1151,14 @@ PHP_FUNCTION(ora_fetch_into)
|
||||
}
|
||||
cursor->fetched++;
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
tmp = emalloc(sizeof(pval));
|
||||
#endif
|
||||
|
||||
for (i = 0; i < cursor->ncols; i++) {
|
||||
|
||||
if (cursor->columns[i].col_retcode == 1405) {
|
||||
if (!(flags&ORA_FETCHINTO_NULLS)){
|
||||
continue; /* don't add anything for NULL columns, unless the calles wants it */
|
||||
} else {
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
|
||||
tmp->value.str.val = empty_string;
|
||||
tmp->value.str.len = 0;
|
||||
}
|
||||
@ -1196,9 +1172,7 @@ PHP_FUNCTION(ora_fetch_into)
|
||||
/* return what we did get, in that case */
|
||||
RETURN_FALSE;
|
||||
} else {
|
||||
#if PHP_API_VERSION >= 19990421
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
#endif
|
||||
|
||||
tmp->type = IS_STRING;
|
||||
tmp->value.str.len = 0;
|
||||
@ -1254,25 +1228,13 @@ PHP_FUNCTION(ora_fetch_into)
|
||||
}
|
||||
|
||||
if (flags&ORA_FETCHINTO_ASSOC){
|
||||
#if PHP_API_VERSION >= 19990421
|
||||
zend_hash_update(arr->value.ht, cursor->columns[i].cbuf, cursor->columns[i].cbufl+1, (void *) &tmp, sizeof(pval*), NULL);
|
||||
#else
|
||||
zend_hash_update(arr->value.ht, cursor->columns[i].cbuf, cursor->columns[i].cbufl+1, (void *) tmp, sizeof(pval), NULL);
|
||||
#endif
|
||||
} else {
|
||||
#if PHP_API_VERSION >= 19990421
|
||||
zend_hash_index_update(arr->value.ht, i, (void *) &tmp, sizeof(pval*), NULL);
|
||||
#else
|
||||
zend_hash_index_update(arr->value.ht, i, (void *) tmp, sizeof(pval), NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
efree(tmp);
|
||||
#endif
|
||||
|
||||
RETURN_LONG(cursor->ncols);
|
||||
}
|
||||
/* }}} */
|
||||
@ -1393,8 +1355,6 @@ PHP_FUNCTION(ora_columnsize)
|
||||
if (ARG_COUNT(ht) != 2 || getParametersArray(ht, 2, argv) == FAILURE) {
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
convert_to_long(argv[0]);
|
||||
|
||||
/* Find the cursor */
|
||||
if ((cursor = ora_get_cursor(list, argv[0])) == NULL) {
|
||||
RETURN_FALSE;
|
||||
@ -1496,54 +1456,44 @@ PHP_FUNCTION(ora_getcolumn)
|
||||
RETURN_STRINGL(column->buf, min(column->col_retlen, column->dsize), 1);
|
||||
case SQLT_LNG:
|
||||
case SQLT_LBI:
|
||||
#if 0
|
||||
{
|
||||
ub4 ret_len;
|
||||
/* XXX 64k max for LONG and LONG RAW */
|
||||
oflng(&cursor->cda, (sword)(colno + 1), column->buf, DB_SIZE, 1,
|
||||
&ret_len, 0);
|
||||
RETURN_STRINGL(column->buf, ret_len, 1);
|
||||
}
|
||||
#else
|
||||
{
|
||||
ub4 ret_len;
|
||||
int offset = column->col_retlen;
|
||||
sb2 result;
|
||||
|
||||
if (column->col_retcode == 1406) { /* truncation -> get the rest! */
|
||||
while (1) {
|
||||
column->buf = erealloc(column->buf,offset + DB_SIZE + 1);
|
||||
|
||||
if (! column->buf) {
|
||||
offset = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
result = oflng(&cursor->cda,
|
||||
(sword)(colno + 1),
|
||||
column->buf + offset,
|
||||
DB_SIZE,
|
||||
1,
|
||||
&ret_len,
|
||||
offset);
|
||||
if (result) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret_len <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
offset += ret_len;
|
||||
{
|
||||
ub4 ret_len;
|
||||
int offset = column->col_retlen;
|
||||
sb2 result;
|
||||
|
||||
if (column->col_retcode == 1406) { /* truncation -> get the rest! */
|
||||
while (1) {
|
||||
column->buf = erealloc(column->buf,offset + DB_SIZE + 1);
|
||||
|
||||
if (! column->buf) {
|
||||
offset = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (column->buf && offset) {
|
||||
RETURN_STRINGL(column->buf, offset, 1);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
|
||||
result = oflng(&cursor->cda,
|
||||
(sword)(colno + 1),
|
||||
column->buf + offset,
|
||||
DB_SIZE,
|
||||
1,
|
||||
&ret_len,
|
||||
offset);
|
||||
if (result) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret_len <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
offset += ret_len;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (column->buf && offset) {
|
||||
RETURN_STRINGL(column->buf, offset, 1);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
default:
|
||||
php_error(E_WARNING,
|
||||
"Ora_GetColumn found invalid type (%d)", type);
|
||||
@ -1768,16 +1718,8 @@ int ora_set_param_values(oraCursor *cursor, int isout)
|
||||
{
|
||||
char *paramname;
|
||||
oraParam *param;
|
||||
#if PHP_API_VERSION < 19990421
|
||||
pval *pdata;
|
||||
#else
|
||||
pval **pdata;
|
||||
#endif
|
||||
int i, len, plen;
|
||||
#if (WIN32|WINNT)
|
||||
/* see variables.c */
|
||||
HashTable *symbol_table=php3i_get_symbol_table();
|
||||
#endif
|
||||
|
||||
ELS_FETCH();
|
||||
|
||||
@ -1801,64 +1743,29 @@ int ora_set_param_values(oraCursor *cursor, int isout)
|
||||
}
|
||||
|
||||
if(isout){
|
||||
#if (WIN32|WINNT)
|
||||
/* see oracle_hack.c */
|
||||
{
|
||||
pval var;
|
||||
char *name=(paramname);
|
||||
var.value.str.val = estrdup(param->progv);
|
||||
var.value.str.len = strlen(param->progv);
|
||||
var.type = IS_STRING;
|
||||
zend_hash_update(symbol_table, name, strlen(name)+1, &var, sizeof(pval),NULL);
|
||||
}
|
||||
#else
|
||||
SET_VAR_STRINGL(paramname, estrdup(param->progv), strlen(param->progv));
|
||||
#endif
|
||||
efree(paramname);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* doing the in-loop */
|
||||
|
||||
/* FIXME Globals don't work in extensions on windows, have to do something
|
||||
else here. See oracle_hack.c */
|
||||
#if (WIN32|WINNT)
|
||||
if(zend_hash_find(symbol_table, paramname, strlen(paramname) + 1, (void **)&pdata) == FAILURE){
|
||||
if (zend_hash_find(&EG(symbol_table), paramname, strlen(paramname) + 1, (void **)&pdata) == FAILURE){
|
||||
php_error(E_WARNING, "Can't find variable for parameter");
|
||||
efree(paramname);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
if(zend_hash_find(&GLOBAL(symbol_table), paramname, strlen(paramname) + 1, (void **)&pdata) == FAILURE){
|
||||
#else
|
||||
if(zend_hash_find(&EG(symbol_table), paramname, strlen(paramname) + 1, (void **)&pdata) == FAILURE){
|
||||
#endif
|
||||
php_error(E_WARNING, "Can't find variable for parameter");
|
||||
efree(paramname);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
convert_to_string(pdata);
|
||||
plen = pdata->value.str.len;
|
||||
#else
|
||||
convert_to_string(*pdata);
|
||||
plen = (*pdata)->value.str.len;
|
||||
#endif
|
||||
|
||||
if (param->progvl <= plen){
|
||||
php_error(E_NOTICE, "Input value will be truncated");
|
||||
}
|
||||
|
||||
len = min(param->progvl - 1, plen);
|
||||
|
||||
#if PHP_API_VERSION < 19990421
|
||||
strncpy(param->progv, pdata->value.str.val, len);
|
||||
#else
|
||||
strncpy(param->progv, (*pdata)->value.str.val, len);
|
||||
#endif
|
||||
param->progv[len] = '\0';
|
||||
|
||||
efree(paramname);
|
||||
|
@ -1,24 +0,0 @@
|
||||
/*
|
||||
This file needs to be compiled in with php on windows so that the
|
||||
oracle dll will work (and can be compiled). preferably, I would
|
||||
like to see if there is another way accomplish what needs to be
|
||||
done with the symbol_table in ora_set_param_values() in oracle.c.
|
||||
This is just a quick hack to get this out.
|
||||
|
||||
Shane
|
||||
*/
|
||||
|
||||
#include "php.h"
|
||||
|
||||
PHPAPI HashTable *php3i_get_symbol_table(void) {
|
||||
TLS_VARS;
|
||||
return &GLOBAL(symbol_table);
|
||||
}
|
||||
|
||||
/* This is becoming a general callback file, rather than an oracle hack
|
||||
* file. Seems we need the following now for xml. */
|
||||
|
||||
PHPAPI HashTable *php3i_get_function_table(void) {
|
||||
TLS_VARS;
|
||||
return &GLOBAL(function_table);
|
||||
}
|
Loading…
Reference in New Issue
Block a user