abies Fri Jun 4 10:26:33 2004 EDT Modified files: /php-src/ext/interbase php_ibase_udf.c Log: Added support for scaled integers http://cvs.php.net/diff.php/php-src/ext/interbase/php_ibase_udf.c?r1=1.5&r2=1.6&ty=u Index: php-src/ext/interbase/php_ibase_udf.c diff -u php-src/ext/interbase/php_ibase_udf.c:1.5 php-src/ext/interbase/php_ibase_udf.c:1.6 --- php-src/ext/interbase/php_ibase_udf.c:1.5 Fri Jun 4 09:33:56 2004 +++ php-src/ext/interbase/php_ibase_udf.c Fri Jun 4 10:26:33 2004 @@ -16,14 +16,14 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ibase_udf.c,v 1.5 2004/06/04 13:33:56 abies Exp $ */ +/* $Id: php_ibase_udf.c,v 1.6 2004/06/04 14:26:33 abies Exp $ */ /** * This UDF library adds the ability to call PHP functions from SQL * statements. Because of SQL's strong typing, you will have to declare * an external function for every combination of input and output parameters * your application requires. The types of the input arguments and the result -* type can be either [VAR]CHARs or unscaled integers or floats. +* type can be either [VAR]CHARs, (un)scaled integers or doubles/floats. * * Declare the functions like this: * @@ -73,6 +73,16 @@ #define min(a,b) ((a)<(b)?(a):(b)) +#ifdef PHP_WIN32 +#define LL_LIT(lit) lit ## I64 +#else +#define LL_LIT(lit) lit ## ll +#endif + +static ISC_INT64 const scales[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 100000000, 1000000000, + 1000000000, LL_LIT(10000000000),LL_LIT(100000000000),LL_LIT(10000000000000),LL_LIT(100000000000000), + LL_LIT(1000000000000000),LL_LIT(1000000000000000),LL_LIT(1000000000000000000) }; + static void call_php(char *name, PARAMDSC *r, int argc, PARAMDSC **argv) { @@ -102,27 +112,53 @@ } switch (argv[i]->dsc_dtype) { + ISC_INT64 l; + case dtype_cstring: ZVAL_STRING(argp[i], (char*)argv[i]->dsc_address,0); break; + case dtype_text: ZVAL_STRINGL(argp[i], (char*)argv[i]->dsc_address, argv[i]->dsc_length,0); break; + case dtype_varying: ZVAL_STRINGL(argp[i], ((PARAMVARY*)argv[i]->dsc_address)->vary_string, ((PARAMVARY*)argv[i]->dsc_address)->vary_length,0); break; case dtype_short: - ZVAL_LONG(argp[i], *(short*)argv[i]->dsc_address); + if (argv[i]->dsc_scale == 0) { + ZVAL_LONG(argp[i], *(short*)argv[i]->dsc_address); + } else { + ZVAL_DOUBLE(argp[i], + ((double)*(short*)argv[i]->dsc_address)/scales[-argv[i]->dsc_scale]); + } break; + case dtype_long: - ZVAL_LONG(argp[i], *(ISC_LONG*)argv[i]->dsc_address); + if (argv[i]->dsc_scale == 0) { + ZVAL_LONG(argp[i], *(ISC_LONG*)argv[i]->dsc_address); + } else { + ZVAL_DOUBLE(argp[i], + ((double)*(ISC_LONG*)argv[i]->dsc_address)/scales[-argv[i]->dsc_scale]); + } + break; + + case dtype_int64: + l = *(ISC_INT64*)argv[i]->dsc_address; + + if (argv[i]->dsc_scale == 0 && l <= LONG_MAX && l >= LONG_MIN) { + ZVAL_LONG(argp[i], (long)l); + } else { + ZVAL_DOUBLE(argp[i], ((double)l)/scales[-argv[i]->dsc_scale]); + } break; case dtype_real: ZVAL_DOUBLE(argp[i], *(float*)argv[i]->dsc_address); break; + case dtype_double: ZVAL_DOUBLE(argp[i], *(double*)argv[i]->dsc_address); break;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php