mysqlnd_ext_plugin.c 12 KB

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