PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/ext/mysqlnd/mysqlnd_ext_plugin.c

http://github.com/php/php-src
C | 448 lines | 294 code | 69 blank | 85 comment | 20 complexity | 7a41a608404b2be89e40b4531d80b159 MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, LGPL-2.1
  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. | http://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_zval(const MYSQLND_RES_BUFFERED_ZVAL * 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_ZVAL) + plugin_id * sizeof(void *)));
  86. }
  87. /* }}} */
  88. /* {{{ mysqlnd_plugin__get_plugin_result_buffered_data */
  89. static void **
  90. mysqlnd_plugin__get_plugin_result_buffered_data_c(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id)
  91. {
  92. DBG_ENTER("mysqlnd_plugin__get_plugin_result_data");
  93. DBG_INF_FMT("plugin_id=%u", plugin_id);
  94. if (!result || plugin_id >= mysqlnd_plugin_count()) {
  95. return NULL;
  96. }
  97. DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_C) + plugin_id * sizeof(void *)));
  98. }
  99. /* }}} */
  100. /* {{{ mysqlnd_plugin__get_plugin_protocol_data */
  101. static void **
  102. mysqlnd_plugin__get_plugin_protocol_data(const MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory, const unsigned int plugin_id)
  103. {
  104. DBG_ENTER("mysqlnd_plugin__get_plugin_protocol_data");
  105. DBG_INF_FMT("plugin_id=%u", plugin_id);
  106. if (!factory || plugin_id >= mysqlnd_plugin_count()) {
  107. return NULL;
  108. }
  109. DBG_RETURN((void *)((char *)factory + sizeof(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY) + plugin_id * sizeof(void *)));
  110. }
  111. /* }}} */
  112. /* {{{ mysqlnd_plugin__get_plugin_stmt_data */
  113. static void **
  114. mysqlnd_plugin__get_plugin_stmt_data(const MYSQLND_STMT * stmt, const unsigned int plugin_id)
  115. {
  116. DBG_ENTER("mysqlnd_plugin__get_plugin_stmt_data");
  117. DBG_INF_FMT("plugin_id=%u", plugin_id);
  118. if (!stmt || plugin_id >= mysqlnd_plugin_count()) {
  119. return NULL;
  120. }
  121. DBG_RETURN((void *)((char *)stmt + sizeof(MYSQLND_STMT) + plugin_id * sizeof(void *)));
  122. }
  123. /* }}} */
  124. /* {{{ mysqlnd_plugin__get_plugin_pfc_data */
  125. static void **
  126. mysqlnd_plugin__get_plugin_pfc_data(const MYSQLND_PFC * pfc, const unsigned int plugin_id)
  127. {
  128. DBG_ENTER("mysqlnd_plugin__get_plugin_pfc_data");
  129. DBG_INF_FMT("plugin_id=%u", plugin_id);
  130. if (!pfc || plugin_id >= mysqlnd_plugin_count()) {
  131. return NULL;
  132. }
  133. DBG_RETURN((void *)((char *)pfc + sizeof(MYSQLND_PFC) + plugin_id * sizeof(void *)));
  134. }
  135. /* }}} */
  136. /* {{{ _mysqlnd_plugin__get_plugin_vio_data */
  137. static void **
  138. mysqlnd_plugin__get_plugin_vio_data(const MYSQLND_VIO * vio, const unsigned int plugin_id)
  139. {
  140. DBG_ENTER("_mysqlnd_plugin__get_plugin_vio_data");
  141. DBG_INF_FMT("plugin_id=%u", plugin_id);
  142. if (!vio || plugin_id >= mysqlnd_plugin_count()) {
  143. return NULL;
  144. }
  145. DBG_RETURN((void *)((char *)vio + sizeof(MYSQLND_VIO) + plugin_id * sizeof(void *)));
  146. }
  147. /* }}} */
  148. struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_getters =
  149. {
  150. mysqlnd_plugin__get_plugin_connection_data,
  151. mysqlnd_plugin__get_plugin_connection_data_data,
  152. mysqlnd_plugin__get_plugin_result_data,
  153. mysqlnd_plugin__get_plugin_result_unbuffered_data,
  154. mysqlnd_plugin__get_plugin_result_buffered_data_zval,
  155. mysqlnd_plugin__get_plugin_result_buffered_data_c,
  156. mysqlnd_plugin__get_plugin_stmt_data,
  157. mysqlnd_plugin__get_plugin_protocol_data,
  158. mysqlnd_plugin__get_plugin_pfc_data,
  159. mysqlnd_plugin__get_plugin_vio_data,
  160. };
  161. /* {{{ _mysqlnd_object_factory_get_methods */
  162. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *
  163. _mysqlnd_object_factory_get_methods()
  164. {
  165. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
  166. }
  167. /* }}} */
  168. /* {{{ mysqlnd_conn_set_methods */
  169. static void
  170. _mysqlnd_object_factory_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *methods)
  171. {
  172. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory) = *methods;
  173. }
  174. /* }}} */
  175. /* {{{ _mysqlnd_conn_get_methods */
  176. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) *
  177. _mysqlnd_conn_get_methods()
  178. {
  179. return mysqlnd_conn_methods;
  180. }
  181. /* }}} */
  182. /* {{{ _mysqlnd_conn_set_methods */
  183. static void
  184. _mysqlnd_conn_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) *methods)
  185. {
  186. mysqlnd_conn_methods = methods;
  187. }
  188. /* }}} */
  189. /* {{{ _mysqlnd_conn_data_get_methods */
  190. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) *
  191. _mysqlnd_conn_data_get_methods()
  192. {
  193. return mysqlnd_conn_data_methods;
  194. }
  195. /* }}} */
  196. /* {{{ _mysqlnd_conn_data_set_methods */
  197. static void
  198. _mysqlnd_conn_data_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) * methods)
  199. {
  200. mysqlnd_conn_data_methods = methods;
  201. }
  202. /* }}} */
  203. /* {{{ _mysqlnd_result_get_methods */
  204. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) *
  205. _mysqlnd_result_get_methods()
  206. {
  207. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_res);
  208. }
  209. /* }}} */
  210. /* {{{ _mysqlnd_result_set_methods */
  211. static void
  212. _mysqlnd_result_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) * methods)
  213. {
  214. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_res) = *methods;
  215. }
  216. /* }}} */
  217. /* {{{ _mysqlnd_result_unbuffered_get_methods */
  218. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) *
  219. _mysqlnd_result_unbuffered_get_methods()
  220. {
  221. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_unbuffered);
  222. }
  223. /* }}} */
  224. /* {{{ _mysqlnd_result_unbuffered_set_methods */
  225. static void
  226. _mysqlnd_result_unbuffered_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) * methods)
  227. {
  228. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_unbuffered) = *methods;
  229. }
  230. /* }}} */
  231. /* {{{ _mysqlnd_result_buffered_get_methods */
  232. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) *
  233. _mysqlnd_result_buffered_get_methods()
  234. {
  235. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_buffered);
  236. }
  237. /* }}} */
  238. /* {{{ _mysqlnd_result_buffered_set_methods */
  239. static void
  240. _mysqlnd_result_buffered_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) * methods)
  241. {
  242. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_result_buffered) = *methods;
  243. }
  244. /* }}} */
  245. /* {{{ _mysqlnd_stmt_get_methods */
  246. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt) *
  247. _mysqlnd_stmt_get_methods()
  248. {
  249. return mysqlnd_stmt_methods;
  250. }
  251. /* }}} */
  252. /* {{{ _mysqlnd_stmt_set_methods */
  253. static void
  254. _mysqlnd_stmt_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt) *methods)
  255. {
  256. mysqlnd_stmt_methods = methods;
  257. }
  258. /* }}} */
  259. /* {{{ _mysqlnd_protocol_payload_decoder_factory_get_methods */
  260. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) *
  261. _mysqlnd_protocol_payload_decoder_factory_get_methods()
  262. {
  263. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory);
  264. }
  265. /* }}} */
  266. /* {{{ _mysqlnd_protocol_payload_decoder_factory_set_methods */
  267. static void
  268. _mysqlnd_protocol_payload_decoder_factory_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) * methods)
  269. {
  270. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory) = *methods;
  271. }
  272. /* }}} */
  273. /* {{{ _mysqlnd_pfc_get_methods */
  274. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) *
  275. _mysqlnd_pfc_get_methods()
  276. {
  277. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_packet_frame_codec);
  278. }
  279. /* }}} */
  280. /* {{{ _mysqlnd_pfc_set_methods */
  281. static void
  282. _mysqlnd_pfc_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) * methods)
  283. {
  284. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_packet_frame_codec) = *methods;
  285. }
  286. /* }}} */
  287. /* {{{ _mysqlnd_vio_get_methods */
  288. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) *
  289. _mysqlnd_vio_get_methods()
  290. {
  291. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio);
  292. }
  293. /* }}} */
  294. /* {{{ _mysqlnd_vio_set_methods */
  295. static void
  296. _mysqlnd_vio_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) * methods)
  297. {
  298. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio) = *methods;
  299. }
  300. /* }}} */
  301. /* {{{ mysqlnd_command_factory_get */
  302. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_command) *
  303. _mysqlnd_command_factory_get()
  304. {
  305. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_command);
  306. }
  307. /* }}} */
  308. /* {{{ mysqlnd_command_factory_set */
  309. static void
  310. _mysqlnd_command_factory_set(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_command) * methods)
  311. {
  312. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_command) = *methods;
  313. }
  314. /* }}} */
  315. /* {{{ _mysqlnd_error_info_get_methods */
  316. static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *
  317. _mysqlnd_error_info_get_methods()
  318. {
  319. return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_error_info);
  320. }
  321. /* }}} */
  322. /* {{{ _mysqlnd_error_info_set_methods */
  323. static void
  324. _mysqlnd_error_info_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *methods)
  325. {
  326. MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_error_info) = *methods;
  327. }
  328. /* }}} */
  329. struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters =
  330. {
  331. {
  332. _mysqlnd_object_factory_get_methods,
  333. _mysqlnd_object_factory_set_methods
  334. },
  335. {
  336. _mysqlnd_conn_get_methods,
  337. _mysqlnd_conn_set_methods,
  338. },
  339. {
  340. _mysqlnd_conn_data_get_methods,
  341. _mysqlnd_conn_data_set_methods,
  342. },
  343. {
  344. _mysqlnd_result_get_methods,
  345. _mysqlnd_result_set_methods,
  346. },
  347. {
  348. _mysqlnd_result_unbuffered_get_methods,
  349. _mysqlnd_result_unbuffered_set_methods,
  350. },
  351. {
  352. _mysqlnd_result_buffered_get_methods,
  353. _mysqlnd_result_buffered_set_methods,
  354. },
  355. {
  356. _mysqlnd_stmt_get_methods,
  357. _mysqlnd_stmt_set_methods,
  358. },
  359. {
  360. _mysqlnd_protocol_payload_decoder_factory_get_methods,
  361. _mysqlnd_protocol_payload_decoder_factory_set_methods,
  362. },
  363. {
  364. _mysqlnd_pfc_get_methods,
  365. _mysqlnd_pfc_set_methods,
  366. },
  367. {
  368. _mysqlnd_vio_get_methods,
  369. _mysqlnd_vio_set_methods,
  370. },
  371. {
  372. _mysqlnd_error_info_get_methods,
  373. _mysqlnd_error_info_set_methods,
  374. },
  375. {
  376. _mysqlnd_command_factory_get,
  377. _mysqlnd_command_factory_set,
  378. },
  379. };