Skip to content

Commit 8eaa9ea

Browse files
committed
MFH: Cleanup before reusing failed persistant connection. Better formating of timestamp and decimal values
1 parent b4da7e6 commit 8eaa9ea

File tree

4 files changed

+76
-20
lines changed

4 files changed

+76
-20
lines changed

ext/fbsql/php_fbsql.c

+57-3
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858

5959
#define HAVE_FBSQL 1
6060

61+
#ifndef min
62+
# define min(a,b) ((a)<(b)?(a):(b))
63+
#endif
64+
6165
#if HAVE_FBSQL
6266
#include "php_fbsql.h"
6367
#include <signal.h>
@@ -737,6 +741,7 @@ PHP_INI_BEGIN()
737741
STD_PHP_INI_BOOLEAN ("fbsql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allowPersistent, zend_fbsql_globals, fbsql_globals)
738742
STD_PHP_INI_BOOLEAN ("fbsql.generate_warnings", "0", PHP_INI_SYSTEM, OnUpdateBool, generateWarnings, zend_fbsql_globals, fbsql_globals)
739743
STD_PHP_INI_BOOLEAN ("fbsql.autocommit", "1", PHP_INI_SYSTEM, OnUpdateBool, autoCommit, zend_fbsql_globals, fbsql_globals)
744+
STD_PHP_INI_BOOLEAN ("fbsql.show_timestamp_decimals", "0", PHP_INI_SYSTEM, OnUpdateBool, showTimestampDecimals, zend_fbsql_globals, fbsql_globals)
740745
STD_PHP_INI_ENTRY_EX ("fbsql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, maxPersistent, zend_fbsql_globals, fbsql_globals, display_link_numbers)
741746
STD_PHP_INI_ENTRY_EX ("fbsql.max_links", "128", PHP_INI_SYSTEM, OnUpdateLong, maxLinks, zend_fbsql_globals, fbsql_globals, display_link_numbers)
742747
STD_PHP_INI_ENTRY_EX ("fbsql.max_connections", "128", PHP_INI_SYSTEM, OnUpdateLong, maxConnections, zend_fbsql_globals, fbsql_globals, display_link_numbers)
@@ -896,7 +901,26 @@ static void php_fbsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
896901
if (persistent) {
897902
if (zend_hash_find(&EG(persistent_list), name, strlen(name) + 1, (void **)&lep) == SUCCESS)
898903
{
904+
FBCMetaData *md;
899905
phpLink = (PHPFBLink*)lep->ptr;
906+
// Check if connection still there.
907+
md = fbcdcRollback(phpLink->connection);
908+
if ( !mdOk(phpLink, md, "Rollback;") ) {
909+
if (FB_SQL_G(generateWarnings)) {
910+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "FrontBase link is not connected, ty to reconnect.");
911+
}
912+
// Make sure select_db will reconnect.
913+
fbcmdRelease(md);
914+
fbcdcClose(phpLink->connection);
915+
fbcdcRelease(phpLink->connection);
916+
free(phpLink->connection);
917+
phpLink->connection = NULL;
918+
if (phpLink->databaseName) free(phpLink->databaseName);
919+
phpLink->databaseName = NULL;
920+
}
921+
else {
922+
fbcmdRelease(md);
923+
}
900924
}
901925
else {
902926
zend_rsrc_list_entry le;
@@ -2866,8 +2890,6 @@ void phpfbColumnAsString(PHPFBResult* result, int column, void* data , int* leng
28662890
case FB_Float:
28672891
case FB_Real:
28682892
case FB_Double:
2869-
case FB_Numeric:
2870-
case FB_Decimal:
28712893
{
28722894
double v = *((double*)data);
28732895
char b[128];
@@ -2876,6 +2898,18 @@ void phpfbColumnAsString(PHPFBResult* result, int column, void* data , int* leng
28762898
}
28772899
break;
28782900

2901+
case FB_Numeric:
2902+
case FB_Decimal:
2903+
{
2904+
unsigned precision = fbcdmdPrecision(dtmd);
2905+
unsigned scale = fbcdmdScale(dtmd);
2906+
double v = *((double*)data);
2907+
char b[128];
2908+
snprintf(b, sizeof(b), "%.*f", scale, v);
2909+
phpfbestrdup(b, length, value);
2910+
}
2911+
break;
2912+
28792913
case FB_Character:
28802914
case FB_VCharacter:
28812915
{
@@ -2946,14 +2980,34 @@ void phpfbColumnAsString(PHPFBResult* result, int column, void* data , int* leng
29462980
case FB_Date:
29472981
case FB_Time:
29482982
case FB_TimeTZ:
2949-
case FB_Timestamp:
29502983
case FB_TimestampTZ:
29512984
{
29522985
char* v = (char*)data;
29532986
phpfbestrdup(v, length, value);
29542987
}
29552988
break;
29562989

2990+
case FB_Timestamp:
2991+
{
2992+
char* v = (char*)data;
2993+
if (FB_SQL_G(showTimestampDecimals)) {
2994+
phpfbestrdup(v, length, value);
2995+
}
2996+
// Copy only YYYY-MM-DD HH:MM:SS
2997+
else {
2998+
int stringLength = strlen(v);
2999+
stringLength = min(stringLength, 19);
3000+
if (value) {
3001+
char* r = emalloc(stringLength+1);
3002+
memcpy(r, v, stringLength);
3003+
r[stringLength] = 0;
3004+
*value = r;
3005+
}
3006+
*length = stringLength;
3007+
}
3008+
}
3009+
break;
3010+
29573011
case FB_YearMonth:
29583012
{
29593013
char b[128];

ext/fbsql/php_fbsql.h

+17-17
Original file line numberDiff line numberDiff line change
@@ -108,23 +108,23 @@ static void php_fbsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type,
108108
static void php_fbsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent);
109109

110110
ZEND_BEGIN_MODULE_GLOBALS(fbsql)
111-
zend_bool allowPersistent;
112-
zend_bool generateWarnings;
113-
zend_bool autoCommit;
114-
long maxPersistent;
115-
long maxLinks;
116-
long maxConnections;
117-
long maxResults;
118-
long batchSize;
119-
char *hostName;
120-
char *databaseName;
121-
char *databasePassword;
122-
char *userName;
123-
char *userPassword;
124-
long persistentCount;
125-
long linkCount;
126-
long linkIndex;
127-
111+
zend_bool allowPersistent;
112+
zend_bool generateWarnings;
113+
zend_bool autoCommit;
114+
zend_bool showTimestampDecimals;
115+
long maxPersistent;
116+
long maxLinks;
117+
long maxConnections;
118+
long maxResults;
119+
long batchSize;
120+
char *hostName;
121+
char *databaseName;
122+
char *databasePassword;
123+
char *userName;
124+
char *userPassword;
125+
long persistentCount;
126+
long linkCount;
127+
long linkIndex;
128128
ZEND_END_MODULE_GLOBALS(fbsql)
129129

130130
#ifdef ZTS

php.ini-dist

+1
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,7 @@ pfpro.defaulttimeout = 30
11541154
[FrontBase]
11551155
;fbsql.allow_persistent = On
11561156
;fbsql.autocommit = On
1157+
;fbsql.show_timestamp_decimals = Off
11571158
;fbsql.default_database =
11581159
;fbsql.default_database_password =
11591160
;fbsql.default_host =

php.ini-recommended

+1
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,7 @@ pfpro.defaulttimeout = 30
12091209
[FrontBase]
12101210
;fbsql.allow_persistent = On
12111211
;fbsql.autocommit = On
1212+
;fbsql.show_timestamp_decimals = Off
12121213
;fbsql.default_database =
12131214
;fbsql.default_database_password =
12141215
;fbsql.default_host =

0 commit comments

Comments
 (0)