+ZEND_BEGIN_ARG_INFO_EX(ai_pqconv_convert_from_string, 0, 0, 2)
+ ZEND_ARG_INFO(0, data)
+ ZEND_ARG_INFO(0, type)
+ZEND_END_ARG_INFO();
+
+ZEND_BEGIN_ARG_INFO_EX(ai_pqconv_convert_to_string, 0, 0, 2)
+ ZEND_ARG_INFO(0, data)
+ ZEND_ARG_INFO(0, type)
+ZEND_END_ARG_INFO();
+
+zend_function_entry php_pqconv_methods[] = {
+ PHP_ABSTRACT_ME(pqconv, convertTypes, ai_pqconv_convert_types)
+ PHP_ABSTRACT_ME(pqconv, convertFromString, ai_pqconv_convert_from_string)
+ PHP_ABSTRACT_ME(pqconv, convertToString, ai_pqconv_convert_to_string)
+ {0}
+};
+
+
+PHP_MINIT_FUNCTION(pq_misc)
+{
+ zend_class_entry *json, ce = {0};
+
+ INIT_NS_CLASS_ENTRY(ce, "pq", "Converter", php_pqconv_methods);
+ php_pqconv_class_entry = zend_register_internal_interface(&ce);
+
+ memset(&ce, 0, sizeof(ce));
+ INIT_NS_CLASS_ENTRY(ce ,"pq", "DateTime", php_pqdt_methods);
+ php_pqdt_class_entry = zend_register_internal_class_ex(&ce, php_date_get_date_ce());
+
+ zend_declare_property_stringl(php_pqdt_class_entry, ZEND_STRL("format"), ZEND_STRL("Y-m-d H:i:s.uO"), ZEND_ACC_PUBLIC);
+
+ /* stop reading this file right here! */
+ if ((json = zend_hash_str_find_ptr(CG(class_table), ZEND_STRL("jsonserializable")))) {
+ zend_class_implements(php_pqdt_class_entry, 1, json);
+ }
+
+ return SUCCESS;
+}
+
+typedef struct _HashTableList {
+ zval arr;
+ struct _HashTableList *parent;
+} HashTableList;
+
+typedef struct _ArrayParserState {
+ const char *ptr, *end;
+ HashTableList *list;
+ php_pqres_t *res;
+ Oid typ;
+ unsigned quotes:1;
+ unsigned escaped:1;
+} ArrayParserState;
+
+static char caa(ArrayParserState *a, const char *any, unsigned advance)
+{
+ const char *p = any;
+
+ do {
+ if (*p == *a->ptr) {
+ a->ptr += advance;
+ return *p;