cvs: php4 /ext/interbase/
| From: | Jouni Ahto | Date: | Fri, 12 May 2000 03:02:14 +0000 |
| Subject: | cvs: php4 /ext/interbase/ | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-14869@lists.php.net to get a copy of this message | ||
jah Fri May 12 05:02:14 2000 EDT
Modified files:
/php4/ext/interbase config.m4 interbase.c php_interbase.h
Log:
Fixed all (?) remaining issues with InterBase 6 datatypes, especially
with timestamp, date and time.
Incombatible change: renamed constant IBASE_TIMESTAMP to IBASE_UNIXTIME.
Incompatible change: renamed configuration directive ibase.timeformat
to ibase.timestampformat.
Added constants IBASE_TIMESTAMP, IBASE_DATE, IBASE_TIME.
Added configuration directives ibase.dateformat and ibase.timeformat.
ibase_timefmt() now takes an optional second argument specifying which
format to change, default is IBASE_TIMESTAMP (for even a little backwards
compatibility).
Index: php4/ext/interbase/config.m4
diff -u php4/ext/interbase/config.m4:1.4 php4/ext/interbase/config.m4:1.5
--- php4/ext/interbase/config.m4:1.4 Tue May 2 06:26:22 2000
+++ php4/ext/interbase/config.m4 Fri May 12 05:02:14 2000
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.4 2000/05/02 04:26:22 sas Exp $
+dnl $Id: config.m4,v 1.5 2000/05/12 03:02:14 jah Exp $
PHP_ARG_WITH(interbase,for InterBase support,
[ --with-interbase[=DIR] Include InterBase support. DIR is the InterBase base
@@ -15,6 +15,7 @@
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
Index: php4/ext/interbase/interbase.c
diff -u php4/ext/interbase/interbase.c:1.28 php4/ext/interbase/interbase.c:1.29
--- php4/ext/interbase/interbase.c:1.28 Thu May 11 21:38:02 2000
+++ php4/ext/interbase/interbase.c Fri May 12 05:02:14 2000
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interbase.c,v 1.28 2000/05/11 19:38:02 jah Exp $ */
+/* $Id: interbase.c,v 1.29 2000/05/12 03:02:14 jah Exp $ */
/* TODO: Arrays, roles?
@@ -150,17 +150,6 @@
}}
-/* 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 @@
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 @@
/* }}} */
-/*
-#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 @@
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 @@
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 @@
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 @@
{
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;
@@ -512,7 +519,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "Interbase Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.28 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.29 $");
#if defined(COMPILE_DL) || defined(COMPILE_DL_INTERBASE)
php_info_print_table_row(2, "Dynamic Module", "yes");
#endif
@@ -534,6 +541,8 @@
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 @@
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 @@
{
char string_data[255];
-
switch(type & ~1) {
case SQL_VARYING:
len = ((IBASE_VCHAR *) data)->var_len;
@@ -1663,19 +1681,25 @@
#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 @@
#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 @@
#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 @@
/* {{{ 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 @@
*/
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;
Index: php4/ext/interbase/php_interbase.h
diff -u php4/ext/interbase/php_interbase.h:1.8 php4/ext/interbase/php_interbase.h:1.9
--- php4/ext/interbase/php_interbase.h:1.8 Tue May 9 22:30:23 2000
+++ php4/ext/interbase/php_interbase.h Fri May 12 05:02:14 2000
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_interbase.h,v 1.8 2000/05/09 20:30:23 jah Exp $ */
+/* $Id: php_interbase.h,v 1.9 2000/05/12 03:02:14 jah Exp $ */
#ifndef _PHP_IBASE_H
#define _PHP_IBASE_H
@@ -89,6 +89,10 @@
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 @@
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