]>
Commit | Line | Data |
---|---|---|
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 |