mysqlnd_ext_plugin.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 7 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 2006-2018 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Andrey Hristov <andrey@php.net> |
  16. | Johannes Schlüter <johannes@php.net> |
  17. | Ulf Wendel <uw@php.net> |
  18. +----------------------------------------------------------------------+
  19. */
  20. #include "php.h"
  21. #include "mysqlnd.h"
  22. #include "mysqlnd_priv.h"
  23. #include "mysqlnd_result.h"
  24. #include "mysqlnd_debug.h"
  25. #include "mysqlnd_commands.h"
  26. #include "mysqlnd_ext_plugin.h"
  27. static struct st_mysqlnd_conn_methods * mysqlnd_conn_methods;
  28. static struct st_mysqlnd_conn_data_methods * mysqlnd_conn_data_methods;
  29. static struct st_mysqlnd_stmt_methods * mysqlnd_stmt_methods;
  30. /* {{{ mysqlnd_plugin__get_plugin_connection_data */
  31. static void **
  32. mysqlnd_plugin__get_plugin_connection_data(const MYSQLND * conn, const unsigned int plugin_id)
  33. {
  34. DBG_ENTER("mysqlnd_plugin__get_plugin_connection_data");
  35. DBG_INF_FMT("plugin_id=%u", plugin_id);
  36. if (!conn || plugin_id >= mysqlnd_plugin_count()) {
  37. return NULL;
  38. }
  39. DBG_RETURN((void *)((char *)conn + sizeof(MYSQLND) + plugin_id * sizeof(void *)));
  40. }
  41. /* }}} */
  42. /* {{{ mysqlnd_plugin__get_plugin_connection_data_data */
  43. static void **
  44. mysqlnd_plugin__get_plugin_connection_data_data(const MYSQLND_CONN_DATA * conn, const unsigned int plugin_id)
  45. {
  46. DBG_ENTER("mysqlnd_plugin__get_plugin_connection_data_data");
  47. DBG_INF_FMT("plugin_id=%u", plugin_id);
  48. if (!conn || plugin_id >= mysqlnd_plugin_count()) {
  49. return NULL;
  50. }
  51. DBG_RETURN((void *)((char *)conn + sizeof(MYSQLND_CONN_DATA) + plugin_id * sizeof(void *)));
  52. }
  53. /* }}} */
  54. /* {{{ mysqlnd_plugin__get_plugin_result_data */
  55. static void **
  56. mysqlnd_plugin__get_plugin_result_data(const MYSQLND_RES * result, const unsigned int plugin_id)
  57. {
  58. DBG_ENTER("mysqlnd_plugin__get_plugin_result_data");
  59. DBG_INF_FMT("plugin_id=%u", plugin_id);
  60. if (!result || plugin_id >= mysqlnd_plugin_count()) {
  61. return NULL;
  62. }
  63. DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES) + plugin_id * sizeof(void *)));
  64. }
  65. /* }}} */
  66. /* {{{ _mysqlnd_plugin__get_plugin_result_unbuffered_data */
  67. static void **
  68. mysqlnd_plugin__get_plugin_result_unbuffered_data(const MYSQLND_RES_UNBUFFERED * result, const unsigned int plugin_id)
  69. {
  70. DBG_ENTER("mysqlnd_plugin__get_plugin_result_data");
  71. DBG_INF_FMT("plugin_id=%u", plugin_id);
  72. if (!result || plugin_id >= mysqlnd_plugin_count()) {
  73. return NULL;
  74. }
  75. DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_UNBUFFERED) + plugin_id * sizeof(void *)));
  76. }
  77. /* }}} */
  78. /* {{{ _mysqlnd_plugin__get_plugin_result_buffered_data */
  79. static void **
  80. mysqlnd_plugin__get_plugin_result_buffered_data_zval(const MYSQLND_RES_BUFFERED_ZVAL * result, const unsigned int plugin_id)
  81. {
  82. DBG_ENTER("_mysqlnd_plugin__get_plugin_result_data");
  83. DBG_INF_FMT("plugin_id=%u", plugin_id);
  84. if (!result || plugin_id >= mysqlnd_plugin_count()) {
  85. return NULL;
  86. }
  87. DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_ZVAL) + plugin_id * sizeof(void *)));
  88. }
  89. /* }}} */
  90. /* {{{ mysqlnd_plugin__get_plugin_result_buffered_data */
  91. static void **
  92. mysqlnd_plugin__get_plugin_result_buffered_data_c(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id)
  93. {
  94. DBG_ENTER("mysqlnd_plugin__get_plugin_result_data");
  95. DBG_INF_FMT("plugin_id=%u", plugin_id);
  96. if (!result || plugin_id >= mysqlnd_plugin_count()) {
  97. return NULL;
  98. }
  99. DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_C) + plugin_id * sizeof(void *)));
  100. }
  101. /* }}} */
  102. /* {{{ mysqlnd_plugin__get_plugin_protocol_data */
  103. static void **
  104. mysqlnd_plugin__get_plugin_protocol_data(const MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory, const unsigned int plugin_id)
  105. {
  106. DBG_ENTER("mysqlnd_plugin__get_plugin_protocol_data");
  107. DBG_INF_FMT("plugin_id=%u", plugin_id);
  108. if (!factory || plugin_id >= mysqlnd_plugin_count()) {
  109. return NULL;
  110. }
  111. DBG_RETURN((void *)((char *)factory + sizeof(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY) + plugin_id * sizeof(void *)));
  112. }
  113. /* }}} */
  114. /* {{{ mysqlnd_plugin__get_plugin_stmt_data */
  115. static void **
  116. mysqlnd_plugin__get_plugin_stmt_data(const MYSQLND_STMT * stmt, const unsigned int plugin_id)
  117. {
  118. DBG_ENTER("mysqlnd_plugin__get_plugin_stmt_data");
  119. DBG_INF_FMT("plugin_id=%u", plugin_id);
  120. if (!stmt || plugin_id >= mysqlnd_plugin_count()) {
  121. return NULL;
  122. }
  123. DBG_RETURN((void *)((char *)stmt + sizeof(MYSQLND_STMT) + plugin_id * sizeof(void *)));
  124. }
  125. /* }}} */
  126. /* {{{ mysqlnd_plugin__get_plugin_pfc_data */
  127. static void **
  128. mysqlnd_plugin__get_plugin_pfc_data(const MYSQLND_PFC * pfc, const unsigned int plugin_id)
  129. {
  130. DBG_ENTER("mysqlnd_plugin__get_plugin_pfc_data");
  131. DBG_INF_FMT("plugin_id=%u", plugin_id);
  132. if (!pfc || plugin_id >= mysqlnd_plugin_count()) {
  133. return NULL;
  134. }
  135. DBG_RETURN((void *)((char *)pfc + sizeof(MYSQLND_PFC) + plugin_id * sizeof(void *)));
  136. }
  137. /* }}} */
  138. /* {{{ _mysqlnd_plugin__get_plugin_vio_data */
  139. static void **
  140. mysqlnd_plugin__get_plugin_vio_data(const MYSQLND_VIO * vio, const unsigned int plugin_id)
  141. {
  142. DBG_ENTER("_mysqlnd_plugin__get_plugin_vio_data");
  143. DBG_INF_FMT("plugin_id=%u", plugin_id);
  144. if (!vio || plugin_id >= mysqlnd_plugin_count()) {
  145. return NULL;
  146. }
  147. DBG_RETURN((void *)((char *)vio + sizeof(MYSQLND_VIO) + plugin_id * sizeof(void *)));
  148. }
  149. /* }}} */
  150. struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_getters =
  151. {
  152. mysqlnd_plugin__get_plugin_connection_data,
  153. mysqlnd_plugin__get_plugin_connection_data_data,
  154. mysqlnd_plugin__get_plugin_result_data,
  155. mysqlnd_plugin__get_plugin_result_unbuffered_data,
  156. mysqlnd_plugin__get_plugin_result_buffered_data_zval,
  157. mysqlnd_plugin__get_plugin_result_buffered_data_c,
  158. mysqlnd_plugin__get_plugin_stmt_data,
  159. mysqlnd_plugin__get_plugin_protocol_data,
  160. mysqlnd_plugin__get_plugin_pfc_data,
  161. mysqlnd_plugin__get_plugin_vio_data,
  162. };
  163. /* {{{ _mysqlnd_object_factory_get_methods */
  164. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *
  165. _mysqlnd_object_factory_get_methods()
  166. {
  167. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
  168. }
  169. /* }}} */
  170. /* {{{ mysqlnd_conn_set_methods */
  171. static void
  172. _mysqlnd_object_factory_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *methods)
  173. {
  174. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory) = *methods;
  175. }
  176. /* }}} */
  177. /* {{{ _mysqlnd_conn_get_methods */
  178. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) *
  179. _mysqlnd_conn_get_methods()
  180. {
  181. return mysqlnd_conn_methods;
  182. }
  183. /* }}} */
  184. /* {{{ _mysqlnd_conn_set_methods */
  185. static void
  186. _mysqlnd_conn_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) *methods)
  187. {
  188. mysqlnd_conn_methods = methods;
  189. }
  190. /* }}} */
  191. /* {{{ _mysqlnd_conn_data_get_methods */
  192. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) *
  193. _mysqlnd_conn_data_get_methods()
  194. {
  195. return mysqlnd_conn_data_methods;
  196. }
  197. /* }}} */
  198. /* {{{ _mysqlnd_conn_data_set_methods */
  199. static void
  200. _mysqlnd_conn_data_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) * methods)
  201. {
  202. mysqlnd_conn_data_methods = methods;
  203. }
  204. /* }}} */
  205. /* {{{ _mysqlnd_result_get_methods */
  206. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) *
  207. _mysqlnd_result_get_methods()
  208. {
  209. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_res);
  210. }
  211. /* }}} */
  212. /* {{{ _mysqlnd_result_set_methods */
  213. static void
  214. _mysqlnd_result_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) * methods)
  215. {
  216. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_res) = *methods;
  217. }
  218. /* }}} */
  219. /* {{{ _mysqlnd_result_unbuffered_get_methods */
  220. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) *
  221. _mysqlnd_result_unbuffered_get_methods()
  222. {
  223. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_unbuffered);
  224. }
  225. /* }}} */
  226. /* {{{ _mysqlnd_result_unbuffered_set_methods */
  227. static void
  228. _mysqlnd_result_unbuffered_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) * methods)
  229. {
  230. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_unbuffered) = *methods;
  231. }
  232. /* }}} */
  233. /* {{{ _mysqlnd_result_buffered_get_methods */
  234. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) *
  235. _mysqlnd_result_buffered_get_methods()
  236. {
  237. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_buffered);
  238. }
  239. /* }}} */
  240. /* {{{ _mysqlnd_result_buffered_set_methods */
  241. static void
  242. _mysqlnd_result_buffered_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) * methods)
  243. {
  244. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_buffered) = *methods;
  245. }
  246. /* }}} */
  247. /* {{{ _mysqlnd_stmt_get_methods */
  248. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt) *
  249. _mysqlnd_stmt_get_methods()
  250. {
  251. return mysqlnd_stmt_methods;
  252. }
  253. /* }}} */
  254. /* {{{ _mysqlnd_stmt_set_methods */
  255. static void
  256. _mysqlnd_stmt_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt) *methods)
  257. {
  258. mysqlnd_stmt_methods = methods;
  259. }
  260. /* }}} */
  261. /* {{{ _mysqlnd_protocol_payload_decoder_factory_get_methods */
  262. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) *
  263. _mysqlnd_protocol_payload_decoder_factory_get_methods()
  264. {
  265. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory);
  266. }
  267. /* }}} */
  268. /* {{{ _mysqlnd_protocol_payload_decoder_factory_set_methods */
  269. static void
  270. _mysqlnd_protocol_payload_decoder_factory_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) * methods)
  271. {
  272. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory) = *methods;
  273. }
  274. /* }}} */
  275. /* {{{ _mysqlnd_pfc_get_methods */
  276. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) *
  277. _mysqlnd_pfc_get_methods()
  278. {
  279. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_packet_frame_codec);
  280. }
  281. /* }}} */
  282. /* {{{ _mysqlnd_pfc_set_methods */
  283. static void
  284. _mysqlnd_pfc_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) * methods)
  285. {
  286. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_packet_frame_codec) = *methods;
  287. }
  288. /* }}} */
  289. /* {{{ _mysqlnd_vio_get_methods */
  290. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) *
  291. _mysqlnd_vio_get_methods()
  292. {
  293. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio);
  294. }
  295. /* }}} */
  296. /* {{{ _mysqlnd_vio_set_methods */
  297. static void
  298. _mysqlnd_vio_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) * methods)
  299. {
  300. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio) = *methods;
  301. }
  302. /* }}} */
  303. /* {{{ mysqlnd_command_factory_get */
  304. static func_mysqlnd__run_command
  305. _mysqlnd_command_factory_get()
  306. {
  307. return mysqlnd_run_command;
  308. }
  309. /* }}} */
  310. /* {{{ mysqlnd_command_factory_set */
  311. static void
  312. _mysqlnd_command_factory_set(func_mysqlnd__run_command run_command)
  313. {
  314. mysqlnd_run_command = run_command;
  315. }
  316. /* }}} */
  317. /* {{{ _mysqlnd_error_info_get_methods */
  318. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *
  319. _mysqlnd_error_info_get_methods()
  320. {
  321. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_error_info);
  322. }
  323. /* }}} */
  324. /* {{{ _mysqlnd_error_info_set_methods */
  325. static void
  326. _mysqlnd_error_info_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *methods)
  327. {
  328. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_error_info) = *methods;
  329. }
  330. /* }}} */
  331. struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters =
  332. {
  333. {
  334. _mysqlnd_object_factory_get_methods,
  335. _mysqlnd_object_factory_set_methods
  336. },
  337. {
  338. _mysqlnd_conn_get_methods,
  339. _mysqlnd_conn_set_methods,
  340. },
  341. {
  342. _mysqlnd_conn_data_get_methods,
  343. _mysqlnd_conn_data_set_methods,
  344. },
  345. {
  346. _mysqlnd_result_get_methods,
  347. _mysqlnd_result_set_methods,
  348. },
  349. {
  350. _mysqlnd_result_unbuffered_get_methods,
  351. _mysqlnd_result_unbuffered_set_methods,
  352. },
  353. {
  354. _mysqlnd_result_buffered_get_methods,
  355. _mysqlnd_result_buffered_set_methods,
  356. },
  357. {
  358. _mysqlnd_stmt_get_methods,
  359. _mysqlnd_stmt_set_methods,
  360. },
  361. {
  362. _mysqlnd_protocol_payload_decoder_factory_get_methods,
  363. _mysqlnd_protocol_payload_decoder_factory_set_methods,
  364. },
  365. {
  366. _mysqlnd_pfc_get_methods,
  367. _mysqlnd_pfc_set_methods,
  368. },
  369. {
  370. _mysqlnd_vio_get_methods,
  371. _mysqlnd_vio_set_methods,
  372. },
  373. {
  374. _mysqlnd_error_info_get_methods,
  375. _mysqlnd_error_info_set_methods,
  376. },
  377. {
  378. _mysqlnd_command_factory_get,
  379. _mysqlnd_command_factory_set,
  380. },
  381. };
  382. /*
  383. * Local variables:
  384. * tab-width: 4
  385. * c-basic-offset: 4
  386. * End:
  387. * vim600: noet sw=4 ts=4 fdm=marker
  388. * vim<600: noet sw=4 ts=4
  389. */