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