summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/interbase/config.m41
-rw-r--r--ext/interbase/interbase.c211
-rw-r--r--ext/interbase/php_interbase.h11
3 files changed, 151 insertions, 72 deletions
diff --git a/ext/interbase/config.m4 b/ext/interbase/config.m4
index c3a266d651..c2acb383b6 100644
--- a/ext/interbase/config.m4
+++ b/ext/interbase/config.m4
@@ -15,6 +15,7 @@ if test "$PHP_INTERBASE" != "no"; then
AC_ADD_LIBRARY_WITH_PATH(gds, $IBASE_LIBDIR, INTERBASE_SHARED_LIBADD)
AC_ADD_INCLUDE($IBASE_INCDIR)
AC_DEFINE(HAVE_IBASE,1,[ ])
+dnl AC_CHECK_LIB(c, strptime, [AC_DEFINE(HAVE_STRPTIME,1,[])])
PHP_EXTENSION(interbase, $ext_shared)
PHP_SUBST(INTERBASE_SHARED_LIBADD)
fi
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c
index c3f6527da5..a884e6f52d 100644
--- a/ext/interbase/interbase.c
+++ b/ext/interbase/interbase.c
@@ -150,17 +150,6 @@ PHP_IBASE_API php_ibase_globals ibase_globals;
}}
-/* get query */
-/*
-#define GET_QUERY(query_id, ib_query) { \
- int type; \
- ib_query = (ibase_query *) zend_list_find(query_id, &type); \
- if (type!=IBG(le_query)) { \
- _php_ibase_module_error("%d is not query index",query_id); \
- RETURN_FALSE; \
- }}
-*/
-
#define RESET_ERRMSG { IBG(errmsg)[0] = '\0';}
#define TEST_ERRMSG ( IBG(errmsg)[0] != '\0')
@@ -173,6 +162,9 @@ typedef struct {
short sval;
float fval;
ISC_QUAD qval;
+ ISC_TIMESTAMP tsval;
+ ISC_DATE dtval;
+ ISC_TIME tmval;
} val;
short sqlind;
} BIND_BUF;
@@ -220,12 +212,6 @@ typedef struct {
/* }}} */
-/*
-#define IBASE_GLOBAL(a) a
-#define IBASE_TLS_VARS
-ibase_module php_ibase_module;
-*/
-
/* error handling ---------------------------- */
/* {{{ proto string ibase_errmsg(void)
@@ -429,15 +415,17 @@ PHP_INI_BEGIN()
STD_PHP_INI_ENTRY_EX("ibase.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, php_ibase_globals, ibase_globals, display_link_numbers)
STD_PHP_INI_ENTRY("ibase.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, php_ibase_globals, ibase_globals)
STD_PHP_INI_ENTRY("ibase.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, php_ibase_globals, ibase_globals)
+ STD_PHP_INI_ENTRY("ibase.timestampformat", "%m/%d/%Y %H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timestampformat, php_ibase_globals, ibase_globals)
+ STD_PHP_INI_ENTRY("ibase.dateformat", "%m/%d/%Y", PHP_INI_ALL, OnUpdateString, cfg_dateformat, php_ibase_globals, ibase_globals)
+ STD_PHP_INI_ENTRY("ibase.timeformat", "%H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timeformat, php_ibase_globals, ibase_globals)
PHP_INI_END()
PHP_MINIT_FUNCTION(ibase)
{
IBLS_FETCH();
- if (cfg_get_string("ibase.timeformat", &IBG(timeformat)) == FAILURE) {
- IBG(cfg_timeformat) = "%m/%d/%Y %H:%M:%S";
- }
+ IBG(timestampformat) = NULL;
+ IBG(dateformat) = NULL;
IBG(timeformat) = NULL;
IBG(errmsg) = NULL;
@@ -453,11 +441,14 @@ PHP_MINIT_FUNCTION(ibase)
REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_TEXT, CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("IBASE_UNIXTIME", PHP_IBASE_UNIXTIME, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_READ", PHP_IBASE_READ, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_COMMITTED", PHP_IBASE_COMMITTED, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_CONSISTENCY", PHP_IBASE_CONSISTENCY, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_NOWAIT", PHP_IBASE_NOWAIT, CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("IBASE_DATE", PHP_IBASE_DATE, CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("IBASE_TIME", PHP_IBASE_TIME, CONST_PERSISTENT);
return SUCCESS;
}
@@ -470,6 +461,14 @@ PHP_RINIT_FUNCTION(ibase)
IBG(default_link)= -1;
IBG(num_links) = IBG(num_persistent);
+ if (IBG(timestampformat))
+ DL_FREE(IBG(timestampformat));
+ IBG(timestampformat) = DL_STRDUP(IBG(cfg_timestampformat));
+
+ if (IBG(dateformat))
+ DL_FREE(IBG(dateformat));
+ IBG(dateformat) = DL_STRDUP(IBG(cfg_dateformat));
+
if (IBG(timeformat))
DL_FREE(IBG(timeformat));
IBG(timeformat) = DL_STRDUP(IBG(cfg_timeformat));
@@ -493,6 +492,14 @@ PHP_RSHUTDOWN_FUNCTION(ibase)
{
IBLS_FETCH();
+ if (IBG(timestampformat))
+ DL_FREE(IBG(timestampformat));
+ IBG(timestampformat) = NULL;
+
+ if (IBG(dateformat))
+ DL_FREE(IBG(dateformat));
+ IBG(dateformat) = NULL;
+
if (IBG(timeformat))
DL_FREE(IBG(timeformat));
IBG(timeformat) = NULL;
@@ -534,6 +541,8 @@ PHP_MINFO_FUNCTION(ibase)
tmp[31]=0;
php_info_print_table_row(2, "Total Links", tmp );
+ php_info_print_table_row(2, "Timestamp Format", IBG(timestampformat) );
+ php_info_print_table_row(2, "Date Format", IBG(dateformat) );
php_info_print_table_row(2, "Time Format", IBG(timeformat) );
php_info_print_table_end();
@@ -1129,40 +1138,50 @@ static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf)
var->sqllen = b_var->value.str.len;
var->sqltype = SQL_TEXT;
break;
- /* FIX THESE
+#ifndef SQL_TIMESTAMP
+ case SQL_DATE:
+#else
case SQL_TIMESTAMP:
case SQL_TYPE_DATE:
case SQL_TYPE_TIME:
+#ifndef HAVE_STRPTIME
+ /*
+ Once again, InterBase's internal parsing routines
+ seems to bea good solution... Might change this on
+ platforms that have strptime()? Code is there and works,
+ but the functions existence is not yet tested...
+ ask Sascha?
*/
- case SQL_DATE:
+ convert_to_string(b_var);
+ var->sqldata = (void ISC_FAR *)b_var->value.str.val;
+ var->sqllen = b_var->value.str.len;
+ var->sqltype = SQL_TEXT;
+#else
{
struct tm t;
-
- t.tm_year = t.tm_mon = t.tm_mday = t.tm_hour =
- t.tm_min = t.tm_sec = 0;
-
+
convert_to_string(b_var);
-
-#if HAVE_STRPTIME /*FIXME: HAVE_STRPTIME ?*/
-
- strptime(b_var->value.str.val, IBG(timeformat), &t);
-#else
- {
- int 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--;
+ switch (var->sqltype & ~1) {
+ case SQL_TIMESTAMP:
+ strptime(b_var->value.str.val, IBG(timestampformat), &t);
+ isc_encode_timestamp(&t, &buf[i].val.tsval);
+ var->sqldata = (void ISC_FAR *)(&buf[i].val.tsval);
+ break;
+ case SQL_TYPE_DATE:
+ strptime(b_var->value.str.val, IBG(dateformat), &t);
+ isc_encode_sql_date(&t, &buf[i].val.dtval);
+ var->sqldata = (void ISC_FAR *)(&buf[i].val.dtval);
+ break;
+ case SQL_TYPE_TIME:
+ strptime(b_var->value.str.val, IBG(timeformat), &t);
+ isc_encode_sql_time(&t, &buf[i].val.tmval);
+ var->sqldata = (void ISC_FAR *)(&buf[i].val.tmval);
+ break;
}
-#endif
- isc_encode_date(&t, &buf[i].val.qval);
- var->sqldata = (void ISC_FAR *)(&buf[i].val.qval);
}
+#endif
break;
+#endif
case SQL_BLOB:
{
ibase_blob_handle *ib_blob_id;
@@ -1588,7 +1607,6 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
{
char string_data[255];
-
switch(type & ~1) {
case SQL_VARYING:
len = ((IBASE_VCHAR *) data)->var_len;
@@ -1663,19 +1681,25 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
#endif
{
struct tm t;
+ char *format = NULL;
long timestamp = -1;
-#ifndef SQL_TIMESTAMP_
+
+#ifndef SQL_TIMESTAMP
isc_decode_date((ISC_QUAD *) data, &t);
+ format = IBG(timestampformat);
#else
switch (type & ~1) {
case SQL_TIMESTAMP:
isc_decode_timestamp((ISC_TIMESTAMP *) data, &t);
+ format = IBG(timestampformat);
break;
case SQL_TYPE_DATE:
isc_decode_sql_date((ISC_DATE *) data, &t);
+ format = IBG(dateformat);
break;
case SQL_TYPE_TIME:
isc_decode_sql_time((ISC_TIME *) data, &t);
+ format = IBG(timeformat);
break;
}
#endif
@@ -1688,14 +1712,15 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
#if HAVE_TM_ZONE
t.tm_zone = tzname[0];
#endif
- if (flag & PHP_IBASE_TIMESTAMP) {
+ if (flag & PHP_IBASE_UNIXTIME) {
val->type = IS_LONG;
val->value.lval = timestamp;
} else {
val->type = IS_STRING;
#if HAVE_STRFTIME
- val->value.str.len = strftime(string_data, sizeof(string_data), IBG(timeformat), &t);
+ val->value.str.len = strftime(string_data, sizeof(string_data), format, &t);
#else
+ /* FIXME */
if (!t.tm_hour && !t.tm_min && !t.tm_sec)
val->value.str.len = sprintf(string_data, "%02d/%02d/%4d", t.tm_mon+1, t.tm_mday, t.tm_year+1900);
else
@@ -1839,7 +1864,13 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type)
#ifdef SQL_INT64
case SQL_INT64:
#endif
+#ifndef SQL_TIMESTAMP
case SQL_DATE:
+#else
+ case SQL_TIMESTAMP:
+ case SQL_TYPE_DATE:
+ case SQL_TYPE_TIME:
+#endif
_php_ibase_var_pval(tmp, var->sqldata, var->sqltype, var->sqllen, var->sqlscale, flag);
break;
case SQL_BLOB:
@@ -2142,25 +2173,56 @@ PHP_FUNCTION(ibase_free_query)
/* {{{ proto int ibase_timefmt(string format)
- Sets the format of datetime columns returned from queries. Still nonfunctional */
+ Sets the format of timestamp, date and time columns returned from queries */
PHP_FUNCTION(ibase_timefmt)
{
- pval *fmt;
+#if HAVE_STRFTIME
+ pval ***args;
+ char *fmt = NULL;
+ int type = PHP_IBASE_TIMESTAMP;
IBLS_FETCH();
+ RESET_ERRMSG; /* ??? */
- RESET_ERRMSG;
-#if HAVE_STRFTIME
- if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) {
+ if (ARG_COUNT(ht) < 1 || ARG_COUNT(ht) > 2){
WRONG_PARAM_COUNT;
}
- convert_to_string(fmt);
-
- if (IBG(timeformat))
- DL_FREE(IBG(timeformat));
- IBG(timeformat) = DL_STRDUP(fmt->value.str.val);
+
+ args = (pval ***) emalloc(sizeof(pval **)*ARG_COUNT(ht));
+ if (zend_get_parameters_array_ex(ARG_COUNT(ht), args) == FAILURE) {
+ efree(args);
+ RETURN_FALSE;
+ }
+
+ switch (ARG_COUNT(ht)) {
+ case 2:
+ convert_to_long_ex(args[1]);
+ type = (*args[1])->value.lval;
+ case 1:
+ convert_to_string_ex(args[0]);
+ fmt = (*args[0])->value.str.val;
+ }
+
+ switch (type) {
+ case PHP_IBASE_TIMESTAMP:
+ if (IBG(timestampformat))
+ DL_FREE(IBG(timestampformat));
+ IBG(timestampformat) = DL_STRDUP(fmt);
+ break;
+ case PHP_IBASE_DATE:
+ if (IBG(dateformat))
+ DL_FREE(IBG(dateformat));
+ IBG(dateformat) = DL_STRDUP(fmt);
+ break;
+ case PHP_IBASE_TIME:
+ if (IBG(timeformat))
+ DL_FREE(IBG(timeformat));
+ IBG(timeformat) = DL_STRDUP(fmt);
+ break;
+ }
+ efree(args);
RETURN_TRUE;
#else
_php_ibase_module_error("ibase_timefmt not supported on this platform");
@@ -2266,17 +2328,26 @@ PHP_FUNCTION(ibase_field_info)
*/
switch (var->sqltype & ~1) {
- case SQL_TEXT: s = "TEXT"; break;
- case SQL_VARYING: s = "VARYING"; break;
- case SQL_SHORT: s = "SHORT"; break;
- case SQL_LONG: s = "LONG"; break;
- case SQL_FLOAT: s = "FLOAT"; break;
- case SQL_DOUBLE: s = "DOUBLE"; break;
- case SQL_D_FLOAT: s = "D_FLOAT"; break;
- case SQL_DATE: s = "DATE"; break;
- case SQL_BLOB: s = "BLOB"; break;
- case SQL_ARRAY: s = "ARRAY"; break;
- case SQL_QUAD: s = "QUAD"; break;
+ case SQL_TEXT: s = "TEXT"; break;
+ case SQL_VARYING: s = "VARYING"; break;
+ case SQL_SHORT: s = "SHORT"; break;
+ case SQL_LONG: s = "LONG"; break;
+ case SQL_FLOAT: s = "FLOAT"; break;
+ case SQL_DOUBLE: s = "DOUBLE"; break;
+ case SQL_D_FLOAT: s = "D_FLOAT"; break;
+#ifdef SQL_INT64
+ case SQL_INT64: s = "INT64"; break;
+#endif
+#ifdef SQL_TIMESTAMP
+ case SQL_TIMESTAMP: s = "TIMESTAMP"; break;
+ case SQL_TYPE_DATE: s = "DATE"; break;
+ case SQL_TYPE_TIME: s = "TIME"; break;
+#else
+ case SQL_DATE: s = "DATE"; break;
+#endif
+ case SQL_BLOB: s = "BLOB"; break;
+ case SQL_ARRAY: s = "ARRAY"; break;
+ case SQL_QUAD: s = "QUAD"; break;
default:
sprintf(buf,"unknown (%d)", var->sqltype & ~1);
s = buf;
diff --git a/ext/interbase/php_interbase.h b/ext/interbase/php_interbase.h
index adbfa45b0f..00fb62d251 100644
--- a/ext/interbase/php_interbase.h
+++ b/ext/interbase/php_interbase.h
@@ -89,6 +89,10 @@ typedef struct {
long allow_persistent;
int le_blob, le_link, le_plink, le_result, le_query;
char *default_user, *default_password;
+ char *timestampformat;
+ char *cfg_timestampformat;
+ char *dateformat;
+ char *cfg_dateformat;
char *timeformat;
char *cfg_timeformat;
char *errmsg;
@@ -143,11 +147,14 @@ typedef struct _php_ibase_varchar {
enum php_interbase_option {
PHP_IBASE_DEFAULT = 0,
PHP_IBASE_TEXT = 1,
- PHP_IBASE_TIMESTAMP = 2,
+ PHP_IBASE_UNIXTIME = 2,
PHP_IBASE_READ = 4,
PHP_IBASE_COMMITTED = 8,
PHP_IBASE_CONSISTENCY = 16,
- PHP_IBASE_NOWAIT = 32
+ PHP_IBASE_NOWAIT = 32,
+ PHP_IBASE_TIMESTAMP = 64,
+ PHP_IBASE_DATE = 128,
+ PHP_IBASE_TIME = 256
};
#ifdef ZTS