@@ -72,6 +72,7 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D)
72
72
if (mysqlnd_library_initted == FALSE) {
73
73
mysqlnd_library_initted = TRUE;
74
74
mysqlnd_conn_set_methods (& MYSQLND_CLASS_METHOD_TABLE_NAME (mysqlnd_conn ));
75
+ mysqlnd_conn_data_set_methods (& MYSQLND_CLASS_METHOD_TABLE_NAME (mysqlnd_conn_data ));
75
76
_mysqlnd_init_ps_subsystem ();
76
77
/* Should be calloc, as mnd_calloc will reference LOCK_access*/
77
78
mysqlnd_stats_init (& mysqlnd_global_stats , STAT_LAST );
@@ -126,26 +127,26 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
126
127
DBG_RETURN (NULL );
127
128
}
128
129
new_object -> persistent = persistent ;
129
-
130
+ new_object -> m = mysqlnd_conn_get_methods ();
130
131
data = new_object -> data ;
131
132
132
133
data -> error_info = & (data -> error_info_impl );
133
134
data -> options = & (data -> options_impl );
134
135
data -> upsert_status = & (data -> upsert_status_impl );
135
136
136
137
data -> persistent = persistent ;
137
- data -> m = mysqlnd_conn_get_methods ();
138
+ data -> m = mysqlnd_conn_data_get_methods ();
138
139
CONN_SET_STATE (data , CONN_ALLOCED );
139
140
data -> m -> get_reference (data TSRMLS_CC );
140
141
141
142
if (PASS != data -> m -> init (data TSRMLS_CC )) {
142
- data -> m -> outter_dtor (new_object TSRMLS_CC );
143
+ new_object -> m -> dtor (new_object TSRMLS_CC );
143
144
DBG_RETURN (NULL );
144
145
}
145
146
146
147
data -> error_info -> error_list = mnd_pecalloc (1 , sizeof (zend_llist ), persistent );
147
148
if (!data -> error_info -> error_list ) {
148
- data -> m -> outter_dtor (new_object TSRMLS_CC );
149
+ new_object -> m -> dtor (new_object TSRMLS_CC );
149
150
DBG_RETURN (NULL );
150
151
} else {
151
152
zend_llist_init (data -> error_info -> error_list , sizeof (MYSQLND_ERROR_LIST_ELEMENT ), (llist_dtor_func_t )mysqlnd_error_list_pdtor , persistent );
@@ -156,6 +157,35 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
156
157
/* }}} */
157
158
158
159
160
+ /* {{{ mysqlnd_object_factory::clone_connection_object */
161
+ static MYSQLND *
162
+ MYSQLND_METHOD (mysqlnd_object_factory , clone_connection_object )(MYSQLND * to_be_cloned TSRMLS_DC )
163
+ {
164
+ size_t alloc_size_ret = sizeof (MYSQLND ) + mysqlnd_plugin_count () * sizeof (void * );
165
+ MYSQLND * new_object ;
166
+
167
+ DBG_ENTER ("mysqlnd_driver::clone_connection_object" );
168
+ DBG_INF_FMT ("persistent=%u" , to_be_cloned -> persistent );
169
+ if (!to_be_cloned || !to_be_cloned -> data ) {
170
+ DBG_RETURN (NULL );
171
+ }
172
+ new_object = mnd_pecalloc (1 , alloc_size_ret , to_be_cloned -> persistent );
173
+ if (!new_object ) {
174
+ DBG_RETURN (NULL );
175
+ }
176
+ new_object -> persistent = to_be_cloned -> persistent ;
177
+ new_object -> m = mysqlnd_conn_get_methods ();
178
+
179
+ new_object -> data = to_be_cloned -> data -> m -> get_reference (to_be_cloned -> data TSRMLS_CC );
180
+ if (!new_object -> data ) {
181
+ new_object -> m -> dtor (new_object TSRMLS_CC );
182
+ new_object = NULL ;
183
+ }
184
+ DBG_RETURN (new_object );
185
+ }
186
+ /* }}} */
187
+
188
+
159
189
/* {{{ mysqlnd_object_factory::get_prepared_statement */
160
190
static MYSQLND_STMT *
161
191
MYSQLND_METHOD (mysqlnd_object_factory , get_prepared_statement )(MYSQLND_CONN_DATA * const conn TSRMLS_DC )
@@ -258,6 +288,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder)(zend_bool persisten
258
288
259
289
MYSQLND_CLASS_METHODS_START (mysqlnd_object_factory )
260
290
MYSQLND_METHOD (mysqlnd_object_factory , get_connection ),
291
+ MYSQLND_METHOD (mysqlnd_object_factory , clone_connection_object ),
261
292
MYSQLND_METHOD (mysqlnd_object_factory , get_prepared_statement ),
262
293
MYSQLND_METHOD (mysqlnd_object_factory , get_io_channel ),
263
294
MYSQLND_METHOD (mysqlnd_object_factory , get_protocol_decoder )
0 commit comments