| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jah@mork.net> |
- | Andrew Avdeev <andy@rsc.mv.ru> |
+ | Andrew Avdeev <andy@rsc.mv.ru> |
+----------------------------------------------------------------------+
*/
#include <math.h>
#endif
+#ifndef SQL_DIALECT_CURRENT
+#define SQL_DIALECT_CURRENT 1
+#endif
+
/*
#define IBDEBUG(a) printf("::: %s (%d)\n", a, __LINE__);
*/
short sval;
float fval;
ISC_QUAD qval;
+#ifdef ISC_TIMESTAMP
ISC_TIMESTAMP tsval;
ISC_DATE dtval;
ISC_TIME tmval;
+#endif
} val;
short sqlind;
} BIND_BUF;
isc_db_handle db_handle = NULL;
char *hashed_details;
int hashed_details_length = 0;
- ibase_db_link *ib_link;
+ ibase_db_link *ib_link = NULL;
IBLS_FETCH();
PLS_FETCH();
ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link));
ib_link->link = db_handle;
- ib_link->dialect = (ib_dialect ? strtoul(ib_dialect, NULL, 10) : 1);
+ ib_link->dialect = (ib_dialect ? strtoul(ib_dialect, NULL, 10) : SQL_DIALECT_CURRENT);
for (i = 0; i < IBASE_TRANS_ON_LINK; i++)
ib_link->trans[i] = NULL;
ib_link = (ibase_db_link *) emalloc(sizeof(ibase_db_link));
ib_link->link = db_handle;
- ib_link->dialect = (ib_dialect ? strtoul(ib_dialect, NULL, 10) : 1);
+ ib_link->dialect = (ib_dialect ? strtoul(ib_dialect, NULL, 10) : SQL_DIALECT_CURRENT);
for (i = 0; i < IBASE_TRANS_ON_LINK; i++)
ib_link->trans[i] = NULL;
convert_to_double(b_var);
var->sqldata = (void ISC_FAR *)(&b_var->value.dval);
break;
+#ifdef SQL_INT64
case SQL_INT64:
/*
Just let InterBase's internal routines handle it.
var->sqllen = b_var->value.str.len;
var->sqltype = SQL_TEXT;
break;
+#endif
#ifndef SQL_TIMESTAMP
case SQL_DATE:
#else
case SQL_TIMESTAMP:
case SQL_TYPE_DATE:
case SQL_TYPE_TIME:
+#endif
#ifndef HAVE_STRPTIME
+#ifndef SQL_TIMESTAMP
+ /* Parsing doesn't seem to happen with older versions... */
+ {
+ struct tm t;
+ int n;
+
+ t.tm_year = t.tm_mon = t.tm_mday = t.tm_hour =
+ t.tm_min = t.tm_sec = 0;
+
+ convert_to_string(b_var);
+
+ n = sscanf(b_var->value.str.val,"%d%*[/]%d%*[/]%d %d%*[:]%d%*[:]%d",
+ &t.tm_mon, &t.tm_mday, &t.tm_year, &t.tm_hour, &t.tm_min, &t.tm_sec);
+ if(n != 3 && n != 6){
+ _php_ibase_module_error("invalid date/time format");
+ return FAILURE;
+ }
+ t.tm_year -= 1900;
+ t.tm_mon--;
+ isc_encode_date(&t, &buf[i].val.qval);
+ var->sqldata = (void ISC_FAR *)(&buf[i].val.qval);
+ }
+#else
/*
Once again, InterBase's internal parsing routines
seems to bea good solution... Might change this on
*/
convert_to_string(b_var);
var->sqldata = (void ISC_FAR *)b_var->value.str.val;
- var->sqllen = b_var->value.str.len;
+ var->sqllen = b_var->value.str.len;
var->sqltype = SQL_TEXT;
+#endif
#else
{
struct tm t;
convert_to_string(b_var);
+#ifndef SQL_TIMESTAMP
+ strptime(b_var->value.str.val, IBG(timestampformat), &t);
+ isc_encode_date(&t, &buf[i].val.qval);
+ var->sqldata = (void ISC_FAR *)(&buf[i].val.qval);
+#else
switch (var->sqltype & ~1) {
case SQL_TIMESTAMP:
strptime(b_var->value.str.val, IBG(timestampformat), &t);
var->sqldata = (void ISC_FAR *)(&buf[i].val.tmval);
break;
}
+#endif
}
#endif
break;
-#endif
case SQL_BLOB:
{
ibase_blob_handle *ib_blob_id;
flag) == FAILURE){
return FAILURE;
}
- /* FIXME */
+ /* FIXME ??? */
zend_hash_index_update(ar_pval->value.ht,
l_bound + i,
(void *) &tmp, sizeof(pval),NULL);
break;
} /*switch*/
if (fetch_type & FETCH_ARRAY) {
- /* FIXME
- zend_hash_index_update(return_value->value.ht, i, (void *) &tmp, sizeof(pval *),NULL);
- */
switch (tmp->type) {
case IS_STRING:
add_index_stringl(return_value, i, tmp->value.str.val, tmp->value.str.len, 0);
break;
}
} else {
- /* FIXME
- zend_hash_update(return_value->value.ht, var->aliasname, var->aliasname_length+1, (void *) &tmp, sizeof(pval), NULL);
- */
switch (tmp->type) {
case IS_STRING:
add_property_stringl(return_value, var->aliasname, tmp->value.str.val, tmp->value.str.len, 0);
var = ib_result->out_sqlda->sqlvar + (*field_arg)->value.lval;
- /* FIXME */
add_get_index_stringl(return_value, 0, var->sqlname, var->sqlname_length, (void **) &ret_val, 1);
- /*
- zend_hash_pointer_update(return_value->value.ht, "name", sizeof(char)*5, ret_val);
- */
+ add_assoc_stringl(return_value, "name", var->sqlname, var->sqlname_length, 1);
add_get_index_stringl(return_value, 1, var->aliasname, var->aliasname_length, (void **) &ret_val, 1);
- /*
- zend_hash_pointer_update(return_value->value.ht, "alias", sizeof(char)*6, ret_val);
- */
+ add_assoc_stringl(return_value, "alias", var->aliasname, var->aliasname_length, 1);
add_get_index_stringl(return_value, 2, var->relname, var->relname_length, (void **) &ret_val, 1);
- /*
- zend_hash_pointer_update(return_value->value.ht, "relation", sizeof(char)*9, ret_val);
- */
+ add_assoc_stringl(return_value, "relation", var->relname, var->relname_length, 1);
len = sprintf(buf, "%d", var->sqllen);
add_get_index_stringl(return_value, 3, buf, len, (void **) &ret_val, 1);
- /*
- zend_hash_pointer_update(return_value->value.ht, "length", sizeof(char)*7, ret_val);
- */
+ add_assoc_stringl(return_value, "length", buf, len, 1);
switch (var->sqltype & ~1) {
case SQL_TEXT: s = "TEXT"; break;
break;
}
add_get_index_stringl(return_value, 4, s, strlen(s), (void **) &ret_val, 1);
- /*
- zend_hash_pointer_update(return_value->value.ht, "type", sizeof(char)*5, ret_val);
- */
-
+ add_assoc_stringl(return_value, "type", s, strlen(s), 1);
}
/* }}} */
PHP_FUNCTION(ibase_blob_import)
{
zval **link_arg, **file_arg;
- int trans_n, type, link_id = 0, file_id, size, b;
- int issock=0, socketd=0, *sock;
+ int trans_n, link_id = 0, file_id, size, b;
+ int issock=0, socketd=0;
ibase_blob_handle ib_blob;
ibase_db_link *ib_link;
char bl_data[IBASE_BLOB_SEG]; /* FIXME? blob_seg_size parameter? */