1 #ifndef PHP_DRIVER_H
2 #define PHP_DRIVER_H
3
4 #ifdef HAVE_CONFIG_H
5 # include "config.h"
6 #endif
7
8 #include <gmp.h>
9 #include <cassandra.h>
10
11 /* Ensure Visual Studio 2010 does not load MSVC++ stdint definitions */
12 #ifdef _WIN32
13 # ifdef DISABLE_MSVC_STDINT
14 # pragma once
15 # ifndef _STDINT
16 # define _STDINT
17 # endif
18 # endif
19 #endif
20
21 #include <php.h>
22 #include <Zend/zend_exceptions.h>
23 #include <Zend/zend_interfaces.h>
24 #include <Zend/zend_types.h>
25
26 #ifdef HAVE_SYS_TYPES_H
27 #include <sys/types.h>
28 #endif
29
30 #ifdef HAVE_UNISTD_H
31 #include <unistd.h>
32 #endif
33
34 #ifdef PHP_WIN32
35 typedef int pid_t;
36 #include <process.h>
37 #endif
38
39 #ifdef WIN32
40 # define LL_FORMAT "%I64d"
41 #else
42 # define LL_FORMAT "%lld"
43 #endif
44
45 #if PHP_VERSION_ID < 50600
46 # error PHP 5.6.0 or later is required in order to build the driver
47 #endif
48
49 #include <ext/spl/spl_iterators.h>
50 #include <ext/spl/spl_exceptions.h>
51
52 #include "version.h"
53
54 #ifdef PHP_WIN32
55 # define PHP_DRIVER_API __declspec(dllexport)
56 #elif defined(__GNUC__) && __GNUC__ >= 4
57 # define PHP_DRIVER_API __attribute__ ((visibility("default")))
58 #else
59 # define PHP_DRIVER_API
60 #endif
61
62 #define PHP_DRIVER_NAMESPACE "Cassandra"
63
64 #define PHP_DRIVER_NAMESPACE_ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) \
65 ZEND_ARG_OBJ_INFO(pass_by_ref, name, Cassandra\\classname, allow_null)
66
67 #define PHP_DRIVER_CORE_METHOD(name) \
68 PHP_METHOD(Cassandra, name)
69
70 #define PHP_DRIVER_CORE_ME(name, arg_info, flags) \
71 PHP_ME(Cassandra, name, arg_info, flags)
72
73 #ifndef ZEND_MOD_END
74 # define ZEND_MOD_END {NULL, NULL, NULL}
75 #endif
76
77 #ifndef PHP_FE_END
78 # define PHP_FE_END { NULL, NULL, NULL, 0, 0 }
79 #endif
80
81 #if ZEND_MODULE_API_NO < 20100525
82 # define object_properties_init(value, class_entry) \
83 zend_hash_copy(*value.properties, &class_entry->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
84 #endif
85
86 #define SAFE_STR(a) ((a)?a:"")
87
88 #ifdef ZTS
89 # include "TSRM.h"
90 #endif
91
92 #ifdef ZTS
93 # define PHP_DRIVER_G(v) TSRMG(php_driver_globals_id, zend_php_driver_globals *, v)
94 #else
95 # define PHP_DRIVER_G(v) (php_driver_globals.v)
96 #endif
97
98 #define CPP_DRIVER_VERSION(major, minor, patch) \
99 (((major) << 16) + ((minor) << 8) + (patch))
100
101 #define CURRENT_CPP_DRIVER_VERSION \
102 CPP_DRIVER_VERSION(CASS_VERSION_MAJOR, CASS_VERSION_MINOR, CASS_VERSION_PATCH)
103
104 #if PHP_MAJOR_VERSION >= 7
105 #define php5to7_zend_register_internal_class_ex(ce, parent_ce) zend_register_internal_class_ex((ce), (parent_ce) TSRMLS_CC);
106
107 typedef zval php5to7_zval;
108 typedef zval *php5to7_zval_args;
109 typedef zval *php5to7_zval_arg;
110 typedef zend_string *php5to7_string;
111 typedef zend_long php5to7_long;
112 typedef zend_ulong php5to7_ulong;
113 typedef zval php5to7_zend_resource_le;
114 typedef zend_resource* php5to7_zend_resource;
115 typedef zend_object *php5to7_zend_object;
116 typedef zend_object php5to7_zend_object_free;
117 typedef zval **php5to7_zval_gc;
118 typedef zval *php5to7_dtor;
119 typedef size_t php5to7_size;
120 #if ((PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION >= 4) || PHP_MAJOR_VERSION > 7)
121 typedef unsigned long ulong;
122 #endif
123
124 static inline int
php5to7_string_compare(php5to7_string s1,php5to7_string s2)125 php5to7_string_compare(php5to7_string s1, php5to7_string s2)
126 {
127 if (s1->len != s2->len) {
128 return s1->len < s2->len ? -1 : 1;
129 }
130 return memcmp(s1->val, s2->val, s1->len);
131 }
132
133 #define PHP5TO7_ZEND_OBJECT_GET(type_name, object) \
134 php_driver_##type_name##_object_fetch(object);
135
136 #define PHP5TO7_SMART_STR_INIT { NULL, 0 }
137 #define PHP5TO7_SMART_STR_VAL(ss) ((ss).s ? (ss).s->val : NULL)
138 #define PHP5TO7_SMART_STR_LEN(ss) ((ss).s ? (ss).s->len : 0)
139
140 #define PHP5TO7_STRCMP(s, c) strcmp((s)->val, (c))
141 #define PHP5TO7_STRVAL(s) ((s)->val)
142
143 #define PHP5TO7_ZEND_ACC_FINAL ZEND_ACC_FINAL
144
145 #define PHP5TO7_ZEND_OBJECT_ECALLOC(type_name, ce) \
146 (php_driver_##type_name *) ecalloc(1, sizeof(php_driver_##type_name) + zend_object_properties_size(ce))
147
148 #define PHP5TO7_ZEND_OBJECT_INIT(type_name, self, ce) \
149 PHP5TO7_ZEND_OBJECT_INIT_EX(type_name, type_name, self, ce)
150
151 #define PHP5TO7_ZEND_OBJECT_INIT_EX(type_name, name, self, ce) do { \
152 zend_object_std_init(&self->zval, ce TSRMLS_CC); \
153 ((zend_object_handlers *) &php_driver_##name##_handlers)->offset = \
154 XtOffsetOf(php_driver_##type_name, zval); \
155 ((zend_object_handlers *) &php_driver_##name##_handlers)->free_obj = \
156 php_driver_##name##_free; \
157 self->zval.handlers = (zend_object_handlers *) &php_driver_##name##_handlers; \
158 return &self->zval; \
159 } while(0)
160
161 #define PHP5TO7_MAYBE_EFREE(p) ((void)0)
162
163 #define PHP5TO7_ADD_ASSOC_ZVAL_EX(zv, key, len, val) \
164 add_assoc_zval_ex((zv), (key), (size_t)(len - 1), val)
165
166 #define PHP5TO7_ADD_ASSOC_STRINGL_EX(zv, key, key_len, str, str_len) \
167 add_assoc_stringl_ex((zv), (key), (size_t)(key_len - 1), (char *)(str), (size_t)(str_len))
168
169 #define PHP5TO7_ADD_NEXT_INDEX_STRING(zv, str) \
170 add_next_index_string((zv), (char*)(str));
171
172 #define PHP5TO7_ZEND_HASH_FOREACH_VAL(ht, _val) \
173 ZEND_HASH_FOREACH_VAL(ht, _val)
174
175 #define PHP5TO7_ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
176 ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val)
177
178 #define PHP5TO7_ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
179 ZEND_HASH_FOREACH(ht, 0); \
180 if (_p->key) { \
181 (_key) = _p->key->val; \
182 } else { \
183 (_key) = NULL; \
184 } \
185 _val = _z;
186
187 #define PHP5TO7_ZEND_HASH_FOREACH_END(ht) ZEND_HASH_FOREACH_END()
188
189 #define PHP5TO7_ZEND_HASH_GET_CURRENT_DATA(ht, res) \
190 ((res = zend_hash_get_current_data((ht))) != NULL)
191
192 #define PHP5TO7_ZEND_HASH_GET_CURRENT_DATA_EX(ht, res, pos) \
193 ((res = zend_hash_get_current_data_ex((ht), (pos))) != NULL)
194
195 #define PHP5TO7_ZEND_HASH_GET_CURRENT_DATA_EX(ht, res, pos) \
196 ((res = zend_hash_get_current_data_ex((ht), (pos))) != NULL)
197
198 #define PHP5TO7_ZEND_HASH_GET_CURRENT_KEY(ht, str_index, num_index) \
199 zend_hash_get_current_key((ht), (str_index), (num_index))
200
201 #define PHP5TO7_ZEND_HASH_GET_CURRENT_KEY_EX(ht, str_index, num_index, pos) \
202 zend_hash_get_current_key_ex((ht), (str_index), (num_index), pos)
203
204 #define PHP5TO7_ZEND_HASH_EXISTS(ht, key, len) \
205 zend_hash_str_exists((ht), (key), (size_t)(len - 1))
206
207 #define PHP5TO7_ZEND_HASH_FIND(ht, key, len, res) \
208 ((res = zend_hash_str_find((ht), (key), (size_t)(len - 1))) != NULL)
209
210 #define PHP5TO7_ZEND_HASH_INDEX_FIND(ht, index, res) \
211 ((res = zend_hash_index_find((ht), (php5to7_ulong) (index))) != NULL)
212
213 #define PHP5TO7_ZEND_HASH_NEXT_INDEX_INSERT(ht, val, val_size) \
214 ((void) zend_hash_next_index_insert((ht), (val)))
215
216 #define PHP5TO7_ZEND_HASH_UPDATE(ht, key, len, val, val_size) \
217 ((void) zend_hash_str_update((ht), (key), (size_t)(len - 1), (val)))
218
219 #define PHP5TO7_ZEND_HASH_INDEX_UPDATE(ht, index, val, val_size) \
220 ((void) zend_hash_index_update((ht), (index), (val)))
221
222 #define PHP5TO7_ZEND_HASH_ADD(ht, key, len, val, val_size) \
223 ((void) zend_hash_str_add((ht), (key), (size_t)(len - 1), (val)))
224
225 #define PHP5TO7_ZEND_HASH_DEL(ht, key, len) \
226 ((zend_hash_str_del((ht), (key), (size_t)(len - 1))) == SUCCESS)
227
228 #define PHP5TO7_ZEND_HASH_ZVAL_COPY(dst, src) \
229 zend_hash_copy((dst), (src), (copy_ctor_func_t) zval_add_ref);
230
231 #define PHP5TO7_ZEND_HASH_SORT(ht, compare_func, renumber) \
232 zend_hash_sort(ht, compare_func, renumber TSRMLS_CC)
233
234 #define PHP5TO7_ZEND_STRING_VAL(str) (str)->val
235 #define PHP5TO7_ZEND_STRING_LEN(str) (str)->len
236
237 #define PHP5TO7_ZVAL_COPY(zv1, zv2) ZVAL_COPY(zv1, zv2)
238 #define PHP5TO7_ZVAL_IS_UNDEF(zv) Z_ISUNDEF(zv)
239 #define PHP5TO7_ZVAL_IS_UNDEF_P(zv) Z_ISUNDEF_P(zv)
240
241 #define PHP5TO7_ZVAL_IS_BOOL_P(zv) \
242 (Z_TYPE_P(zv) == IS_TRUE || Z_TYPE_P(zv) == IS_FALSE)
243 #define PHP5TO7_ZVAL_IS_FALSE_P(zv) (Z_TYPE_P(zv) == IS_FALSE)
244 #define PHP5TO7_ZVAL_IS_TRUE_P(zv) (Z_TYPE_P(zv) == IS_TRUE)
245
246 #define PHP5TO7_ZVAL_UNDEF(zv) ZVAL_UNDEF(&(zv));
247 #define PHP5TO7_ZVAL_MAYBE_MAKE(zv) ((void)0)
248 #define PHP5TO7_ZVAL_MAYBE_DESTROY(zv) do { \
249 if (!Z_ISUNDEF(zv)) { \
250 zval_ptr_dtor(&(zv)); \
251 ZVAL_UNDEF(&(zv)); \
252 } \
253 } while(0)
254
255 #define PHP5TO7_ZVAL_STRING(zv, s) ZVAL_STRING(zv, s)
256 #define PHP5TO7_ZVAL_STRINGL(zv, s, len) ZVAL_STRINGL(zv, s, len)
257 #define PHP5TO7_RETVAL_STRING(s) RETVAL_STRING(s)
258 #define PHP5TO7_RETURN_STRING(s) RETURN_STRING(s)
259 #define PHP5TO7_RETVAL_STRINGL(s, len) RETVAL_STRINGL(s, len)
260 #define PHP5TO7_RETURN_STRINGL(s, len) RETURN_STRINGL(s, len)
261
262 #define PHP5TO7_ZVAL_ARG(zv) &(zv)
263 #define PHP5TO7_ZVAL_MAYBE_DEREF(zv) (zv)
264 #define PHP5TO7_ZVAL_MAYBE_ADDR_OF(zv) (zv)
265 #define PHP5TO7_ZVAL_MAYBE_P(zv) &(zv)
266 #define PHP5TO7_Z_TYPE_MAYBE_P(zv) Z_TYPE(zv)
267 #define PHP5TO7_Z_ARRVAL_MAYBE_P(zv) Z_ARRVAL(zv)
268 #define PHP5TO7_Z_OBJCE_MAYBE_P(zv) Z_OBJCE(zv)
269 #define PHP5TO7_Z_LVAL_MAYBE_P(zv) Z_LVAL(zv)
270 #define PHP5TO7_Z_DVAL_MAYBE_P(zv) Z_DVAL(zv)
271 #define PHP5TO7_Z_STRVAL_MAYBE_P(zv) Z_STRVAL(zv)
272 #define PHP5TO7_Z_STRLEN_MAYBE_P(zv) Z_STRLEN(zv)
273
274 #define PHP5TO7_ZEND_LONG_MAX ZEND_LONG_MAX
275 #define PHP5TO7_ZEND_LONG_MIN ZEND_LONG_MIN
276
277 #else
278 typedef zval *php5to7_zval;
279 typedef zval ***php5to7_zval_args;
280 typedef char *php5to7_string;
281 typedef long php5to7_long;
282 typedef ulong php5to7_ulong;
283 typedef zend_rsrc_list_entry php5to7_zend_resource_le;
284 typedef zend_rsrc_list_entry *php5to7_zend_resource;
285 typedef zend_object_value php5to7_zend_object;
286 typedef void php5to7_zend_object_free;
287 typedef zval ***php5to7_zval_gc;
288 typedef void **php5to7_dtor;
289 typedef int php5to7_size;
290
291 static inline int
php5to7_string_compare(php5to7_string s1,php5to7_string s2)292 php5to7_string_compare(php5to7_string s1, php5to7_string s2)
293 {
294 return strcmp(s1, s2);
295 }
296
297 #define PHP5TO7_ZEND_OBJECT_GET(type_name, object) \
298 (php_driver_##type_name *) object
299
300 #define Z_RES_P(zv) (zv)
301 #define Z_RES(zv) (&(zv))
302 #define Z_TRY_ADDREF_P(zv) Z_ADDREF_P(zv)
303
304 #define PHP5TO7_SMART_STR_INIT { NULL, 0, 0 }
305 #define PHP5TO7_SMART_STR_VAL(ss) (ss).c
306 #define PHP5TO7_SMART_STR_LEN(ss) (ss).len
307
308 #define PHP5TO7_STRCMP(s, c) strcmp((s), (c))
309 #define PHP5TO7_STRVAL(s) (s)
310
311 #define PHP5TO7_ZEND_ACC_FINAL ZEND_ACC_FINAL_CLASS
312
313 #define PHP5TO7_ZEND_OBJECT_ECALLOC(type_name, ce) (php_driver_##type_name *) \
314 ecalloc(1, sizeof(php_driver_##type_name))
315
316 #define PHP5TO7_ZEND_OBJECT_INIT(type_name, self, ce) \
317 PHP5TO7_ZEND_OBJECT_INIT_EX(type_name, type_name, self, ce)
318
319 #define PHP5TO7_ZEND_OBJECT_INIT_EX(type_name, name, self, ce) do { \
320 zend_object_value retval; \
321 zend_object_std_init(&self->zval, ce TSRMLS_CC); \
322 object_properties_init(&self->zval, ce); \
323 retval.handle = zend_objects_store_put(self, \
324 (zend_objects_store_dtor_t) zend_objects_destroy_object, \
325 php_driver_##name##_free, NULL TSRMLS_CC); \
326 retval.handlers = (zend_object_handlers *) &php_driver_##name##_handlers; \
327 return retval; \
328 } while(0)
329
330 #define PHP5TO7_MAYBE_EFREE(p) efree(p)
331
332 #define PHP5TO7_ADD_ASSOC_ZVAL_EX(zv, key, len, val) \
333 add_assoc_zval_ex((zv), (key), (uint)(len), val)
334
335 #define PHP5TO7_ADD_ASSOC_STRINGL_EX(zv, key, key_len, str, str_len) \
336 add_assoc_stringl_ex((zv), (key), (uint)(key_len), (char*)(str), (uint)(str_len), 1)
337
338 #define PHP5TO7_ADD_NEXT_INDEX_STRING(zv, str) \
339 add_next_index_string((zv), (char*)(str), 1);
340
341 #define PHP5TO7_ZEND_HASH_FOREACH_VAL(ht, _val) do { \
342 HashPosition _pos; \
343 zend_hash_internal_pointer_reset_ex((ht), &_pos); \
344 while (zend_hash_get_current_data_ex((ht), (void **)&(_val), &_pos) == SUCCESS) {
345
346 #define PHP5TO7_ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _key_len, _val) \
347 PHP5TO7_ZEND_HASH_FOREACH_VAL(ht, _val) \
348 (_key) = NULL; \
349 zend_hash_get_current_key_ex((ht), &(_key), &(_key_len), &(_h), 0, &_pos);
350
351 #define PHP5TO7_ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
352 PHP5TO7_ZEND_HASH_FOREACH_VAL(ht, _val) \
353 char *_key; \
354 uint _len; \
355 zend_hash_get_current_key_ex((ht), &_key, &_len, &(_h), 0, &_pos);
356
357 #define PHP5TO7_ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
358 PHP5TO7_ZEND_HASH_FOREACH_VAL(ht, _val) \
359 ulong _h; \
360 (_key) = NULL; \
361 zend_hash_get_current_key_ex((ht), &(_key), NULL, &_h, 0, &_pos);
362
363 #define PHP5TO7_ZEND_HASH_FOREACH_END(ht) \
364 zend_hash_move_forward_ex((ht), &_pos); \
365 } \
366 } while(0)
367
368 #define PHP5TO7_ZEND_HASH_GET_CURRENT_DATA(ht, res) \
369 (zend_hash_get_current_data((ht), (void **) &(res)) == SUCCESS)
370
371 #define PHP5TO7_ZEND_HASH_GET_CURRENT_DATA_EX(ht, res, pos) \
372 (zend_hash_get_current_data_ex((ht), (void **) &(res), (pos)) == SUCCESS)
373
374 #define PHP5TO7_ZEND_HASH_GET_CURRENT_KEY(ht, str_index, num_index) \
375 zend_hash_get_current_key((ht), (str_index), (num_index), 0)
376
377 #define PHP5TO7_ZEND_HASH_GET_CURRENT_KEY_EX(ht, str_index, num_index, pos) \
378 zend_hash_get_current_key_ex((ht), (str_index), NULL, (num_index), 0, pos)
379
380 #define PHP5TO7_ZEND_HASH_EXISTS(ht, key, len) \
381 zend_hash_exists((ht), (key), (len))
382
383 #define PHP5TO7_ZEND_HASH_FIND(ht, key, len, res) \
384 (zend_hash_find((ht), (key), (uint)(len), (void **)&(res)) == SUCCESS)
385
386 #define PHP5TO7_ZEND_HASH_INDEX_FIND(ht, index, res) \
387 (zend_hash_index_find((ht), (php5to7_ulong) (index), (void **) &res) == SUCCESS)
388
389 #define PHP5TO7_ZEND_HASH_NEXT_INDEX_INSERT(ht, val, val_size) \
390 ((void) zend_hash_next_index_insert((ht), (void*) &(val), (uint) (val_size), NULL))
391
392 #define PHP5TO7_ZEND_HASH_UPDATE(ht, key, len, val, val_size) \
393 ((void) zend_hash_update((ht), (key), (uint)(len), (void *) &(val), (uint)(val_size), NULL))
394
395 #define PHP5TO7_ZEND_HASH_INDEX_UPDATE(ht, index, val, val_size) \
396 ((void) zend_hash_index_update((ht), (index), (void *) &(val), (uint)(val_size), NULL))
397
398 #define PHP5TO7_ZEND_HASH_ADD(ht, key, len, val, val_size) \
399 ((void) zend_hash_add((ht), (key), (len), (void *) &(val), (uint)(val_size), NULL))
400
401 #define PHP5TO7_ZEND_HASH_DEL(ht, key, len) \
402 ((zend_hash_del((ht), (key), (uint)(len))) == SUCCESS)
403
404 #define PHP5TO7_ZEND_HASH_ZVAL_COPY(dst, src) do { \
405 zval *_tmp; \
406 zend_hash_copy((dst), (src), \
407 (copy_ctor_func_t) zval_add_ref, \
408 (void *) &_tmp, sizeof(zval *)); \
409 } while (0)
410
411 #define PHP5TO7_ZEND_HASH_SORT(ht, compare_func, renumber) \
412 zend_hash_sort(ht, zend_qsort, compare_func, renumber TSRMLS_CC);
413
414 #define php5to7_zend_register_internal_class_ex(ce, parent_ce) zend_register_internal_class_ex((ce), (parent_ce), NULL TSRMLS_CC);
415
416 #define PHP5TO7_ZVAL_COPY(zv1, zv2) do { \
417 zv1 = zv2; \
418 if(zv1) Z_TRY_ADDREF_P(zv1); \
419 } while(0)
420
421 #define PHP5TO7_ZVAL_IS_UNDEF(zv) ((zv) == NULL)
422 #define PHP5TO7_ZVAL_IS_UNDEF_P(zv) ((zv) == NULL)
423 #define PHP5TO7_ZVAL_IS_BOOL_P(zv) (Z_TYPE_P(zv) == IS_BOOL)
424 #define PHP5TO7_ZVAL_IS_FALSE_P(zv) (Z_TYPE_P(zv) == IS_BOOL && !Z_BVAL_P(zv))
425 #define PHP5TO7_ZVAL_IS_TRUE_P(zv) (Z_TYPE_P(zv) == IS_BOOL && Z_BVAL_P(zv))
426
427 #define PHP5TO7_ZVAL_UNDEF(zv) (zv) = NULL;
428 #define PHP5TO7_ZVAL_MAYBE_MAKE(zv) MAKE_STD_ZVAL(zv)
429 #define PHP5TO7_ZVAL_MAYBE_DESTROY(zv) do { \
430 if ((zv) != NULL) { \
431 zval_ptr_dtor(&(zv)); \
432 (zv) = NULL; \
433 } \
434 } while(0)
435
436 #define PHP5TO7_ZVAL_STRING(zv, s) ZVAL_STRING(zv, s, 1)
437 #define PHP5TO7_ZVAL_STRINGL(zv, s, len) ZVAL_STRINGL(zv, s, len, 1)
438 #define PHP5TO7_RETVAL_STRING(s) RETVAL_STRING(s, 1)
439 #define PHP5TO7_RETURN_STRING(s) RETURN_STRING(s, 1)
440 #define PHP5TO7_RETVAL_STRINGL(s, len) RETVAL_STRINGL(s, len, 1)
441 #define PHP5TO7_RETURN_STRINGL(s, len) RETURN_STRINGL(s, len, 1)
442
443 #define PHP5TO7_ZVAL_ARG(zv) *(zv)
444 #define PHP5TO7_ZVAL_MAYBE_DEREF(zv) *(zv)
445 #define PHP5TO7_ZVAL_MAYBE_ADDR_OF(zv) &(zv)
446 #define PHP5TO7_ZVAL_MAYBE_P(zv) (zv)
447 #define PHP5TO7_Z_TYPE_MAYBE_P(zv) Z_TYPE_P(zv)
448 #define PHP5TO7_Z_ARRVAL_MAYBE_P(zv) Z_ARRVAL_P(zv)
449 #define PHP5TO7_Z_OBJCE_MAYBE_P(zv) Z_OBJCE_P(zv)
450 #define PHP5TO7_Z_LVAL_MAYBE_P(zv) Z_LVAL_P(zv)
451 #define PHP5TO7_Z_DVAL_MAYBE_P(zv) Z_DVAL_P(zv)
452 #define PHP5TO7_Z_STRVAL_MAYBE_P(zv) Z_STRVAL_P(zv)
453 #define PHP5TO7_Z_STRLEN_MAYBE_P(zv) Z_STRLEN_P(zv)
454
455 #define PHP5TO7_ZEND_LONG_MAX LONG_MAX
456 #define PHP5TO7_ZEND_LONG_MIN LONG_MIN
457
458 #endif /* PHP_MAJOR_VERSION >= 7 */
459
460 extern zend_module_entry php_driver_module_entry;
461
462 #define phpext_cassandra_ptr &php_driver_module_entry
463
464 PHP_MINIT_FUNCTION(php_driver);
465 PHP_MSHUTDOWN_FUNCTION(php_driver);
466 PHP_RINIT_FUNCTION(php_driver);
467 PHP_RSHUTDOWN_FUNCTION(php_driver);
468 PHP_MINFO_FUNCTION(php_driver);
469
470 zend_class_entry *exception_class(CassError rc);
471
472 void throw_invalid_argument(zval *object,
473 const char *object_name,
474 const char *expected_type TSRMLS_DC);
475
476 #define INVALID_ARGUMENT(object, expected) \
477 { \
478 throw_invalid_argument(object, #object, expected TSRMLS_CC); \
479 return; \
480 }
481
482 #define INVALID_ARGUMENT_VALUE(object, expected, failed_value) \
483 { \
484 throw_invalid_argument(object, #object, expected TSRMLS_CC); \
485 return failed_value; \
486 }
487
488 #define ASSERT_SUCCESS_BLOCK(rc, block) \
489 { \
490 if (rc != CASS_OK) { \
491 zend_throw_exception_ex(exception_class(rc), rc TSRMLS_CC, \
492 "%s", cass_error_desc(rc)); \
493 block \
494 } \
495 }
496
497 #define ASSERT_SUCCESS(rc) ASSERT_SUCCESS_BLOCK(rc, return;)
498
499 #define ASSERT_SUCCESS_VALUE(rc, value) ASSERT_SUCCESS_BLOCK(rc, return value;)
500
501 #define PHP_DRIVER_DEFAULT_CONSISTENCY CASS_CONSISTENCY_LOCAL_ONE
502
503 #define PHP_DRIVER_DEFAULT_LOG PHP_DRIVER_NAME ".log"
504 #define PHP_DRIVER_DEFAULT_LOG_LEVEL "ERROR"
505
506 #define PHP_DRIVER_INI_ENTRY_LOG \
507 PHP_INI_ENTRY(PHP_DRIVER_NAME ".log", PHP_DRIVER_DEFAULT_LOG, PHP_INI_ALL, OnUpdateLog)
508
509 #define PHP_DRIVER_INI_ENTRY_LOG_LEVEL \
510 PHP_INI_ENTRY(PHP_DRIVER_NAME ".log_level", PHP_DRIVER_DEFAULT_LOG_LEVEL, PHP_INI_ALL, OnUpdateLogLevel)
511
512 PHP_INI_MH(OnUpdateLogLevel);
513 PHP_INI_MH(OnUpdateLog);
514
515 #endif /* PHP_DRIVER_H */
516