php-src/ext/ovrimos/ovrimos.c
2000-10-11 20:32:04 +00:00

953 lines
24 KiB
C

#include <stdio.h>
#include <string.h>
/* #include <dl/phpdl.h> */
#include <php.h>
#include <php_globals.h>
#include <zend_API.h>
#include "ext/standard/php_standard.h"
#include "ext/standard/info.h"
#include <sqlcli.h>
#if !defined(WIN32)
# define stricmp strcasecmp
#endif
static longreadlen=0;
static void column_to_string(SQLS stmt, int i, char *buffer, int *len);
PHP_MINFO_FUNCTION(ovrimos) {
php_printf("&quot;Ovrimos&quot; module<br>\n");
}
/* Main User Functions */
/* {{{ proto int ovrimos_connect(string host, string db, string user, string password)
Connect to an Ovrimos database */
PHP_FUNCTION(ovrimos_connect) {
pval *arg1, *arg2, *arg3, *arg4;
SQLH conn=0;
if(ARG_COUNT(ht)!=4 || getParameters(ht,4,&arg1,&arg2,&arg3,&arg4)==FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(arg1);
convert_to_string(arg2);
convert_to_string(arg3);
convert_to_string(arg4);
if(!sqlConnect(arg1->value.str.val,arg2->value.str.val,arg3->value.str.val,
arg4->value.str.val,&conn)) {
RETURN_LONG(0);
}
RETURN_LONG((int)conn+1);
}
/* }}} */
/* {{{ proto void ovrimos_close(int connection)
Close a connection */
PHP_FUNCTION(ovrimos_close) {
pval *arg1;
SQLH conn;
if(ARG_COUNT(ht)!=1 || getParameters(ht,1,&arg1)==FAILURE || arg1->type!=IS_LONG) {
WRONG_PARAM_COUNT;
}
conn=(SQLH)(arg1->value.lval-1);
(void)sqlDisConnect(conn);
}
/* }}} */
/* {{{ proto void ovrimos_close_all()
Close all connections */
PHP_FUNCTION(ovrimos_close_all) {
pval *arg1;
SQLH conn;
(void)sqlDisconnectAll();
}
/* }}} */
/* {{{ proto int ovrimos_longreadlen(int result_id, int length)
Handle LONG columns */
PHP_FUNCTION(ovrimos_longreadlen) {
pval *arg1, *arg2;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_long(arg2);
longreadlen=arg2->value.lval;
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int ovrimos_prepare(int connection_id, string query)
Prepares a statement for execution */
PHP_FUNCTION(ovrimos_prepare) {
pval *arg1, *arg2;
SQLH conn;
char *query;
SQLS stmt;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE){
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_string(arg2);
conn = (SQLH)(arg1->value.lval-1);
query = arg2->value.str.val;
if(!sqlAllocStmt(conn,&stmt)) {
RETURN_FALSE;
}
if(!sqlPrepare(stmt,query)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
if(!sqlGetOutputColDescr(stmt)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
if(!sqlGetParamDescr(stmt)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
RETURN_LONG((int)stmt+1);
}
/* }}} */
/*
* Execute prepared SQL statement. Supports only input parameters.
*/
/* {{{ proto int ovrimos_execute(int result_id [, array parameters_array])
Execute a prepared statement */
PHP_FUNCTION(ovrimos_execute) {
pval *arg1, *arg2;
SQLS stmt;
int numArgs;
int icol, colnb;
numArgs = ARG_COUNT(ht);
if (getParameters(ht, numArgs, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
colnb=sqlGetParamNb(stmt);
if(colnb!=0) {
pval **tmp;
int arr_elem;
if (arg2->type != IS_ARRAY){
php_error(E_WARNING, "Not an array in call to ovrimos_execute()");
RETURN_FALSE;
}
arr_elem=zend_hash_num_elements(arg2->value.ht);
if (arr_elem < colnb) {
php_error(E_WARNING,"Not enough parameters in call to ovrimos_execute(): %d instead of %d",arr_elem,colnb);
RETURN_FALSE;
}
zend_hash_internal_pointer_reset(arg2->value.ht);
for(icol=0; icol<colnb; icol++) {
int len;
cvt_error err;
bool ret;
char *msg;
char buffer[10240];
sql_type to_type=sqlGetParamSQLType(stmt,icol);
sql_type from_type;
if (zend_hash_get_current_data(arg2->value.ht, (void **) &tmp) == FAILURE) {
php_error(E_WARNING,"Error getting parameter %d in call to ovrimos_execute()", icol);
RETURN_FALSE;
}
convert_to_string(*tmp);
if ((*tmp)->type != IS_STRING) {
php_error(E_WARNING,"Error converting parameter %d to string in call to ovrimos_execute()",icol);
RETURN_FALSE;
}
/* PHP data to param type */
from_type.type=T_VARCHAR;
from_type.u.length=(*tmp)->value.str.len;
*buffer=0;
memcpy(buffer+1,(*tmp)->value.str.val,from_type.u.length);
buffer[from_type.u.length+1]=0;
ret=type_convert(buffer,&from_type,&to_type,0,&err);
switch(err) {
case cvt_trunc: msg="Data truncated"; break;
case cvt_range: msg="Numeric value out of range"; break;
case cvt_prec: msg="Precision lost"; break;
case cvt_incomp: msg="Restricted data type attribute violation"; break;
case cvt_no: msg="Conversion failed"; break;
}
if(!ret) {
php_error(E_WARNING,"Error converting parameter %d: %s in call to ovrimos_execute()",icol, msg);
RETURN_FALSE;
}
len=sql_type_size(to_type)-1;
if(!sqlPutParam(stmt,icol,buffer+1,len)) {
php_error(E_WARNING, "Could send parameter %d (%d bytes) in call to ovrimos_execute()",icol,len);
RETURN_FALSE;
}
}
}
if(!sqlExec(stmt)) {
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto string ovrimos_cursor(int result_id)
Get cursor name */
PHP_FUNCTION(ovrimos_cursor) {
char cname[126];
pval *arg1;
SQLS stmt;
if ( getParameters(ht, 1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
if(!sqlGetCursorName(stmt,cname)) {
RETURN_FALSE;
}
RETURN_STRING(cname,1);
}
/* }}} */
/* {{{ proto int ovrimos_exec(int connection_id, string query)
Prepare and execute an SQL statement */
PHP_FUNCTION(ovrimos_exec) {
pval *arg1, *arg2;
SQLH conn;
SQLS stmt;
int numArgs;
char *query;
numArgs = ARG_COUNT(ht);
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_string(arg2);
conn = (SQLH)(arg1->value.lval-1);
query = arg2->value.str.val;
if(!sqlAllocStmt(conn,&stmt)) {
RETURN_FALSE;
}
if(!sqlExecDirect(stmt,query)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
if(!sqlGetOutputColDescr(stmt)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
if(!sqlGetParamDescr(stmt)) {
sqlFreeStmt(stmt);
RETURN_FALSE;
}
RETURN_LONG((int)stmt+1);
}
/* }}} */
static void column_to_string(SQLS stmt, int i, char *buffer, int *len) {
const char *bf=sqlColValue(stmt,i,0);
switch(sqlGetOutputColType(stmt,i)) {
case T_BIGINT:
case T_UBIGINT: {
switch(sqlGetOutputColType(stmt,i)) {
case T_BIGINT:
printsint64(Read(sint64,bf),buffer); break;
case T_UBIGINT:
printuint64(Read(uint64,bf),buffer); break;
}
*len=strlen(buffer);
} break;
case T_INTEGER:
sprintf(buffer,"%11ld",Read(sint32,bf));
*len=strlen(buffer);
break;
case T_UINTEGER:
sprintf(buffer,"%10lu",Read(uint32,bf));
*len=strlen(buffer);
break;
case T_SMALLINT:
sprintf(buffer,"%6hd",Read(sint16,bf));
*len=strlen(buffer);
break;
case T_USMALLINT:
sprintf(buffer,"%5hu",Read(uint16,bf));
*len=strlen(buffer);
break;
case T_TINYINT:
sprintf(buffer,"%4hd",(sint16)Read(sint8,bf));
*len=strlen(buffer);
break;
case T_UTINYINT:
sprintf(buffer,"%3hu",(uint16)Read(uint8,bf));
*len=strlen(buffer);
break;
case T_BIT:
sprintf(buffer,"%s",(Read(uint8,bf)==0)?"off":"on");
*len=strlen(buffer);
break;
case T_REAL:
sprintf(buffer,"%9.7g",(double)Read(float,bf));
*len=strlen(buffer);
break;
case T_FLOAT:
case T_DOUBLE:
sprintf(buffer,"%19.17g",Read(double,bf));
*len=strlen(buffer);
break;
case T_DECIMAL:
case T_NUMERIC: {
int prec=sqlGetOutputColPrecision(stmt,i);
int scale=sqlGetOutputColScale(stmt,i);
sprintf(buffer,"%*.*f",prec+2,scale,Read(double,bf));
*len=strlen(buffer);
} break;
case T_CHAR:
case T_VARCHAR:
strcpy(buffer,bf);
*len=strlen(buffer);
break;
case T_UNI_CHAR:
case T_UNI_VARCHAR:
uni_strcpy((uni_char*)buffer,(uni_char*)bf);
*len=uni_strlen((uni_char*)buffer);
break;
case T_BINARY: {
int sz=sqlGetOutputColLength(stmt,i);
memcpy(buffer,bf,sz);
*len=sz;
} break;
case T_VARBINARY: {
int sz=Read(uint16,bf);
memcpy(buffer,bf+2,sz);
*len=sz;
} break;
case T_DATE: {
char db[11];
if(!sql_date_to_str((uint32*)bf,buffer)) {
strcpy(buffer,"Error!");
}
} break;
case T_TIME: {
int prec=sqlGetOutputColPrecision(stmt,i);
if(!sql_time_to_str((uint32*)bf,prec,0,buffer)) {
strcpy(buffer,"Error!");
}
} break;
case T_TIMESTAMP: {
int prec=sqlGetOutputColPrecision(stmt,i);
if(!sql_timestamp_to_str((uint32*)bf,prec,0,buffer)) {
strcpy(buffer,"Error!");
}
} break;
case T_LONGVARCHAR:
case T_LONGVARBINARY: {
if(longreadlen==0) {
*buffer=0;
*len=0;
} else if(!sqlColValueLong(stmt,i,0,0,longreadlen,buffer,len)) {
strcpy(buffer,"Error!");
}
} break;
}
}
/* {{{ proto int ovrimos_fetch_into(int result_id, array result_array [, string how, [int rownumber]])
Fetch one result row into an array
how: 'Next' (default), 'Prev', 'First', 'Last', 'Absolute'
*/
PHP_FUNCTION(ovrimos_fetch_into) {
int numArgs;
char *s_how;
typedef enum { h_next=0, h_prev, h_first, h_last, h_absolute } h_type;
h_type how=h_next; /* default */
sint32 rownum = 0;
pval *arg_id, *arg_how=0, *arg_row=0, *arr, *tmp;
SQLS stmt;
int icol,colnb;
bool ret;
numArgs = ARG_COUNT(ht);
switch(numArgs){
case 2:
if (getParameters(ht, 2, &arg_id, &arr) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 3:
if (getParameters(ht, 3, &arg_id, &arr, &arg_how) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 4:
if (getParameters(ht, 4, &arg_id, &arr, &arg_how, &arg_row) == FAILURE)
WRONG_PARAM_COUNT;
break;
default:
WRONG_PARAM_COUNT;
}
convert_to_long(arg_id);
stmt = (SQLS)(arg_id->value.lval-1);
if(arg_how!=0) {
if(arg_how->type!=IS_STRING) {
php_error(E_WARNING, "Third argument not string in ovrimos_fetch_into()");
RETURN_FALSE;
}
s_how = arg_how->value.str.val;
if(stricmp(s_how,"next")==0) {
how=h_next;
} else if(stricmp(s_how,"prev")==0) {
how=h_prev;
} else if(stricmp(s_how,"first")==0) {
how=h_first;
} else if(stricmp(s_how,"last")==0) {
how=h_last;
} else if(stricmp(s_how,"absolute")==0) {
how=h_absolute;
} else {
php_error(E_WARNING, "Third argument not valid in ovrimos_fetch_into()");
RETURN_FALSE;
}
if(arg_row==0 && how==h_absolute) {
php_error(E_WARNING, "Fourth argument is required for ABSOLUTE in ovrimos_fetch_into()");
RETURN_FALSE;
}
if(arg_row!=0) {
convert_to_long(arg_row);
rownum = arg_row->value.lval;
switch(how) {
case h_next:
case h_prev:
rownum--; /* Next 1 should send FUNC_CURSOR_NEXT(0) */
break;
}
}
}
if (!ParameterPassedByReference(ht, 2)){ /* 1-based?...*/
php_error(E_WARNING, "Array not passed by reference in call to ovrimos_fetch_into()");
RETURN_FALSE;
}
if (arr->type != IS_ARRAY){
if (array_init(arr) == FAILURE){
php_error(E_WARNING, "Can't convert to type Array");
RETURN_FALSE;
}
}
switch(how) {
case h_absolute:
case h_first:
ret=sqlCursorFirst(stmt,rownum);
break;
case h_last:
ret=sqlCursorLast(stmt,rownum);
break;
case h_next:
ret=sqlCursorNext(stmt,rownum);
break;
case h_prev:
ret=sqlCursorPrev(stmt,rownum);
break;
}
if(!ret) {
RETURN_FALSE;
}
colnb=sqlGetOutputColNb(stmt);
for(icol=0; icol<colnb; icol++) {
int len;
char buffer[10240];
tmp = (pval *) emalloc(sizeof(pval));
tmp->refcount=1;
tmp->type = IS_STRING;
tmp->value.str.len = 0;
/* Produce column value in 'tmp' ...*/
column_to_string(stmt, icol, buffer,&len);
tmp->value.str.len=len;
tmp->value.str.val=estrndup(buffer,len);
zend_hash_index_update(arr->value.ht, icol, &tmp, sizeof(pval *), NULL);
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int ovrimos_fetch_row(int result_id [, int how, [int row_number]])
how: 'Next' (default), 'Prev', 'First', 'Last', 'Absolute'
Fetch a row */
PHP_FUNCTION(ovrimos_fetch_row) {
int numArgs, i;
char *s_how;
typedef enum { h_next=0, h_prev, h_first, h_last, h_absolute } h_type;
h_type how=h_next; /* default */
sint32 rownum = 0;
pval *arg_id, *arg_how=0, *arg_row=0;
SQLS stmt;
bool ret;
numArgs = ARG_COUNT(ht);
switch(numArgs){
case 1:
if (getParameters(ht, 1, &arg_id) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 2:
if (getParameters(ht, 2, &arg_id, &arg_how) == FAILURE)
WRONG_PARAM_COUNT;
break;
case 3:
if (getParameters(ht, 3, &arg_id, &arg_how, &arg_row) == FAILURE)
WRONG_PARAM_COUNT;
break;
default:
WRONG_PARAM_COUNT;
}
convert_to_long(arg_id);
stmt = (SQLS)(arg_id->value.lval-1);
if(arg_how!=0) {
if(arg_how->type!=IS_STRING) {
php_error(E_WARNING, "Second argument not string in ovrimos_fetch_row()");
RETURN_FALSE;
}
s_how = arg_how->value.str.val;
if(stricmp(s_how,"next")==0) {
how=h_next;
} else if(stricmp(s_how,"prev")==0) {
how=h_prev;
} else if(stricmp(s_how,"first")==0) {
how=h_first;
} else if(stricmp(s_how,"last")==0) {
how=h_last;
} else if(stricmp(s_how,"absolute")==0) {
how=h_absolute;
} else {
php_error(E_WARNING, "Second argument not valid in ovrimos_fetch_row()");
RETURN_FALSE;
}
if(arg_row==0 && how==4) {
php_error(E_WARNING, "Third argument is required for ABSOLUTE in ovrimos_fetch_row()");
RETURN_FALSE;
}
if(arg_row!=0) {
convert_to_long(arg_row);
rownum = arg_row->value.lval;
switch(how) {
case h_next:
case h_prev:
rownum--; /* Next 1 should send FUNC_CURSOR_NEXT(0) */
break;
}
}
}
switch(how) {
case h_absolute:
case h_first:
ret=sqlCursorFirst(stmt,rownum);
break;
case h_last:
ret=sqlCursorLast(stmt,rownum);
break;
case h_next:
ret=sqlCursorNext(stmt,rownum);
break;
case h_prev:
ret=sqlCursorPrev(stmt,rownum);
break;
}
if(!ret) {
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto string ovrimos_result(int result_id, mixed field)
Get result data */
PHP_FUNCTION(ovrimos_result) {
int numArgs = ARG_COUNT(ht);
pval *arg_id, *arg_field;
int icol, colnb;
SQLS stmt;
int len;
char buffer[1024];
if (numArgs!=2 || getParameters(ht, 2, &arg_id, &arg_field) == FAILURE)
WRONG_PARAM_COUNT;
convert_to_long(arg_id);
stmt = (SQLS)(arg_id->value.lval-1);
colnb=sqlGetOutputColNb(stmt);
if(arg_field->type==IS_STRING) {
int i;
for(i=0; i<colnb; i++) {
if(!stricmp(arg_field->value.str.val,sqlGetOutputColName(stmt,i))) {
icol=i;
break;
}
}
} else if(arg_field->type==IS_LONG) {
icol=arg_field->value.lval-1;
} else {
php_error(E_WARNING, "Second argument neither number nor string in ovrimos_result()");
RETURN_FALSE;
}
if(icol<0 || icol>colnb) {
php_error(E_WARNING, "Unknown column in ovrimos_result()");
RETURN_FALSE;
}
column_to_string(stmt, icol, buffer,&len);
RETURN_STRINGL(buffer,len,1);
}
/* }}} */
/* {{{ proto int ovrimos_result_all(int result_id [, string format])
Print result as HTML table */
PHP_FUNCTION(ovrimos_result_all) {
long fetched=0;
pval *arg1, *arg2;
int numArgs;
SQLS stmt;
int icol, colnb;
char buffer[1024];
int len;
numArgs = ARG_COUNT(ht);
if (numArgs == 1){
if (getParameters(ht, 1, &arg1) == FAILURE)
WRONG_PARAM_COUNT;
} else {
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE)
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt = (SQLS)(arg1->value.lval-1);
colnb=sqlGetOutputColNb(stmt);
/* Start table tag */
if (numArgs == 1){
php_printf("<table><tr>");
} else {
convert_to_string(arg2);
php_printf("<table %s ><tr>",arg2->value.str.val);
}
for(icol = 0; icol<colnb; icol++) {
php_printf("<th>%s</th>", sqlGetOutputColName(stmt,icol));
}
php_printf("</tr>\n");
if(sqlCursorFirst(stmt,0)) {
do {
fetched++;
php_printf("<tr>");
for(icol=0; icol<colnb; icol++) {
column_to_string(stmt, icol, buffer,&len);
php_printf("<td>%s</td>",buffer);
}
php_printf("</tr>\n");
} while(sqlCursorNext(stmt,0));
}
php_printf("</table>\n");
RETURN_LONG(fetched);
}
/* }}} */
/* {{{ proto int ovrimos_free_result(int result_id)
Free resources associated with a result */
PHP_FUNCTION(ovrimos_free_result) {
pval *arg1;
SQLS stmt;
if ( getParameters(ht, 1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
sqlCloseCursor(stmt);
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int ovrimos_num_rows(int result_id)
Get number of rows in a result */
PHP_FUNCTION(ovrimos_num_rows) {
uint32 rows;
pval *arg1;
SQLS stmt;
if ( getParameters(ht, 1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
sqlGetRowCount(stmt, &rows);
RETURN_LONG(rows);
}
/* }}} */
/* {{{ proto int ovrimos_num_fields(int result_id)
Get number of columns in a result */
PHP_FUNCTION(ovrimos_num_fields) {
pval *arg1;
SQLS stmt;
if ( getParameters(ht, 1, &arg1) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
RETURN_LONG(sqlGetOutputColNb(stmt));
}
/* }}} */
/* {{{ proto string ovrimos_field_name(int result_id, int field_number)
Get a column name */
PHP_FUNCTION(ovrimos_field_name) {
pval *arg1, *arg2;
SQLS stmt;
int field;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_long(arg2);
stmt=(SQLS)(arg1->value.lval-1);
if (arg2->value.lval < 1){
php_error(E_WARNING, "Field numbering starts at 1! in call to ovrimos_field_name()");
RETURN_FALSE;
}
field=arg2->value.lval-1;
if (field>=sqlGetOutputColNb(stmt)){
php_error(E_WARNING, "No field at this index (%d) in call to ovrimos_field_name()",field);
RETURN_FALSE;
}
RETURN_STRING((char*)sqlGetOutputColName(stmt,field),1);
}
/* }}} */
/* {{{ proto string ovrimos_field_type(int result_id, int field_number)
Get the datatype of a column */
PHP_FUNCTION(ovrimos_field_type) {
pval *arg1, *arg2;
SQLS stmt;
int field;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_long(arg2);
stmt=(SQLS)(arg1->value.lval-1);
if (arg2->value.lval < 1){
php_error(E_WARNING, "Field numbering starts at 1! in call to ovrimos_field_type()");
RETURN_FALSE;
}
field=arg2->value.lval-1;
if (field>=sqlGetOutputColNb(stmt)){
php_error(E_WARNING, "No field at this index (%d) in call to ovrimos_field_type()",field);
RETURN_FALSE;
}
RETURN_LONG(sqlGetOutputColType(stmt,field));
}
/* }}} */
/* {{{ proto int ovrimos_field_len(int result_id, int field_number)
Get the length of a column */
PHP_FUNCTION(ovrimos_field_len) {
pval *arg1, *arg2;
SQLS stmt;
int field;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_long(arg2);
stmt=(SQLS)(arg1->value.lval-1);
if (arg2->value.lval < 1){
php_error(E_WARNING, "Field numbering starts at 1! in call to ovrimos_field_len()");
RETURN_FALSE;
}
field=arg2->value.lval-1;
if (field>=sqlGetOutputColNb(stmt)){
php_error(E_WARNING, "No field at this index (%d) in call to ovrimos_field_len()",field);
RETURN_FALSE;
}
switch(sqlGetOutputColType(stmt,field)) {
case T_LONGVARCHAR:
case T_LONGVARBINARY:
RETURN_LONG(longreadlen);
default:
RETURN_LONG(sqlGetOutputColLength(stmt,field));
}
}
/* }}} */
/* {{{ proto int ovrimos_field_num(int result_id, string field_name)
Return column number */
PHP_FUNCTION(ovrimos_field_num) {
pval *arg1, *arg2;
SQLS stmt;
int i,n;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE || arg2->type!=IS_STRING) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
stmt=(SQLS)(arg1->value.lval-1);
n=sqlGetOutputColNb(stmt);
for(i=0; i<n; i++) {
if(!strcmp(arg2->value.str.val,sqlGetOutputColName(stmt,i))) {
RETURN_LONG(i+1);
}
}
RETURN_FALSE;
}
/* }}} */
#if 0
/* {{{ proto int ovrimos_autocommit(int connection_id, int OnOff)
Toggle autocommit mode
There can be problems with pconnections!*/
PHP_FUNCTION(ovrimos_autocommit) {
}
/* }}} */
#endif
/* {{{ proto int ovrimos_commit(int connection_id)
Commit an ovrimos transaction */
PHP_FUNCTION(ovrimos_commit) {
pval *arg1;
SQLH conn;
if(ARG_COUNT(ht)!=1 || getParameters(ht,1,&arg1)==FAILURE || arg1->type!=IS_LONG) {
WRONG_PARAM_COUNT;
}
conn=(SQLH)(arg1->value.lval-1);
if(!sqlTransactCommit(conn)) {
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int ovrimos_rollback(int connection_id)
Rollback a transaction */
PHP_FUNCTION(ovrimos_rollback) {
pval *arg1;
SQLH conn;
if(ARG_COUNT(ht)!=1 || getParameters(ht,1,&arg1)==FAILURE || arg1->type!=IS_LONG) {
WRONG_PARAM_COUNT;
}
conn=(SQLH)(arg1->value.lval-1);
if(!sqlTransactRollback(conn)) {
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
#if 0
/* {{{ proto int ovrimos_setoption(int conn_id|result_id, int which, int option, int value)
Sets connection or statement options */
PHP_FUNCTION(ovrimos_setoption) {
}
/* }}} */
#endif
function_entry ovrimos_functions[] = {
/* PHP_FE(ovrimos_setoption, NULL)*/
/* PHP_FE(ovrimos_autocommit, NULL)*/
PHP_FE(ovrimos_close, NULL)
PHP_FE(ovrimos_close_all, NULL)
PHP_FE(ovrimos_commit, NULL)
PHP_FE(ovrimos_connect, NULL)
PHP_FE(ovrimos_cursor, NULL)
PHP_FE(ovrimos_exec, NULL)
PHP_FE(ovrimos_prepare, NULL)
PHP_FE(ovrimos_execute, NULL)
PHP_FE(ovrimos_fetch_row, NULL)
PHP_FE(ovrimos_fetch_into, NULL)
PHP_FE(ovrimos_field_len, NULL)
PHP_FE(ovrimos_field_name, NULL)
PHP_FE(ovrimos_field_type, NULL)
PHP_FE(ovrimos_field_num, NULL)
PHP_FE(ovrimos_free_result, NULL)
PHP_FE(ovrimos_num_fields, NULL)
PHP_FE(ovrimos_num_rows, NULL)
PHP_FE(ovrimos_result, NULL)
PHP_FE(ovrimos_result_all, NULL)
PHP_FE(ovrimos_rollback, NULL)
/* PHP_FE(ovrimos_binmode, NULL)*/
PHP_FE(ovrimos_longreadlen, NULL)
PHP_FALIAS(ovrimos_do, ovrimos_exec, NULL)
{ NULL, NULL, NULL }
};
zend_module_entry ovrimos_module_entry = {
"Ovrimos",
ovrimos_functions,
NULL,
NULL,
NULL,
NULL,
PHP_MINFO(ovrimos),
STANDARD_MODULE_PROPERTIES
};
DLEXPORT zend_module_entry *get_module() { return &ovrimos_module_entry; };