]> git.pld-linux.org Git - packages/php-pecl-session_mysql.git/blame - php-pecl-session_mysql-reconnect.patch
- do not write to readonly memory
[packages/php-pecl-session_mysql.git] / php-pecl-session_mysql-reconnect.patch
CommitLineData
e9e4cede
ER
1--- session_mysql-1.9-reconnect/session_mysql.c 2007-08-29 19:35:53.222688544 +0300
2+++ session_mysql-1.9-reconnect/session_mysql.c 2007-08-30 13:29:10.614270156 +0300
79b3b1df
ER
3@@ -8,6 +8,15 @@
4
5 #include "ext/session/php_session.h"
6
7+//#define DEBUG
8+#undef DEBUG
9+
10+#ifdef DEBUG
11+#define _D(args...) { fprintf(stderr, "%s:%d %s(): ", strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__, __LINE__, __FUNCTION__); fprintf(stderr, args); fprintf(stderr, "\n"); fflush(stderr); }
12+#else
13+#define _D(args...)
14+#endif
15+
16 ZEND_DECLARE_MODULE_GLOBALS(session_mysql)
17
18 /* {{{ zend_session_mysql_init_globals
19@@ -300,21 +309,25 @@
20 }
21
22 static int session_mysql_connect(TSRMLS_D) {
23-#if MYSQL_VERSION_ID >= 50013
24- my_bool opt=1;
25-#endif
26+ // here we don't check for persistent, as if persistent is disabled the
27+ // mysql handle is closed at the end of request.
28+ if (!SESSION_MYSQL_G(mysql)) {
29+ int ret;
30+ MYSQL *h;
31
32- if (!SESSION_MYSQL_G(mysql) || !SESSION_MYSQL_G(persistent)) {
33- if (!SESSION_MYSQL_G(mysql)) {
34- if (!(SESSION_MYSQL_G(mysql)=mysql_init(SESSION_MYSQL_G(mysql)))) {
35- return FAILURE;
36- }
37+ if (!(h = mysql_init(SESSION_MYSQL_G(mysql)))) {
38+ return FAILURE;
39 }
40+ SESSION_MYSQL_G(mysql) = h;
41
42+_D("mysql version: %d", MYSQL_VERSION_ID);
43 #if MYSQL_VERSION_ID >= 50013
44- mysql_options(SESSION_MYSQL_G(mysql), MYSQL_OPT_RECONNECT, &opt);
45+ // in mysql versions above 5.0.3 the reconnect flag is off by default,
46+ // since 5.0.13 it's possible to set reconnect flag
47+ my_bool reconnect = 1;
48+ mysql_options(SESSION_MYSQL_G(mysql), MYSQL_OPT_RECONNECT, &reconnect);
49 #endif
50- if (mysql_real_connect(
51+ h = mysql_real_connect(
52 SESSION_MYSQL_G(mysql),
53 SESSION_MYSQL_G(host),
54 SESSION_MYSQL_G(user),
55@@ -322,15 +335,25 @@
56 SESSION_MYSQL_G(db),
57 SESSION_MYSQL_G(port),
58 SESSION_MYSQL_G(sock),
59- CLIENT_FOUND_ROWS)) {
60-
61- return SUCCESS;
62- }
63- } else {
64- if (mysql_ping(SESSION_MYSQL_G(mysql))==0) {
65+ CLIENT_FOUND_ROWS);
66+#if MYSQL_VERSION_ID >= 50013 && MYSQL_VERSION_ID < 50019
67+ // address bug prior 5.0.19
68+ reconnect = 1;
69+ mysql_options(SESSION_MYSQL_G(mysql), MYSQL_OPT_RECONNECT, &reconnect);
70+#endif
71+ if (h) {
72 return SUCCESS;
73 }
74 }
75+
e9e4cede 76+ if (mysql_ping(SESSION_MYSQL_G(mysql)) == 0) {
79b3b1df
ER
77+ return SUCCESS;
78+ }
79+
80+ // so ping_failed(), we reset mysql handle so it would be attempted to
81+ // connect on next request again
82+ mysql_close(SESSION_MYSQL_G(mysql));
83+ SESSION_MYSQL_G(mysql) = NULL;
84 return FAILURE;
85 }
86
87@@ -422,7 +445,7 @@
88 }
89
90 return ret;
91-}
92+}
93
94 static int session_mysql_write(const char *key, const char *val, const int vallen TSRMLS_DC) {
95 int key_len, query_len, updatequery_len, insertquery_len, unlockquery_len, escapedhost_len, ret=FAILURE;
96@@ -606,14 +629,14 @@
97 PS_OPEN_FUNC(mysql)
98 {
99 int ret;
100- *mod_data = (void *)1;
101+ *mod_data = (void *)1;
102
103 ret=session_mysql_connect(TSRMLS_C);
104 if (SESSION_MYSQL_G(quiet)) {
105 return SUCCESS;
106 } else {
107 return ret;
108- }
109+ }
110 }
111 /* }}} */
112
113@@ -732,7 +755,7 @@
114 {
115 int ret, vallen;
116 char *val, c;
117- const char *p;
118+ const char *p;
119
120
121 for (p = key; (c = *p); p++) {
122@@ -758,7 +781,7 @@
123
124 ret=session_mysql_read(key,&val,&vallen TSRMLS_CC);
125
126- return ret;
127+ return ret;
128 }
129 /* }}} */
130 #endif
This page took 0.089176 seconds and 4 git commands to generate.