2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2013, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
22 #include "php_pq_misc.h"
23 #include "php_pq_object.h"
24 #include "php_pqexc.h"
25 #include "php_pqcancel.h"
27 zend_class_entry
*php_pqcancel_class_entry
;
28 static zend_object_handlers php_pqcancel_object_handlers
;
29 static HashTable php_pqcancel_object_prophandlers
;
31 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
33 php_pqcancel_object_t
*obj
= o
;
35 fprintf(stderr
, "FREE cancel(#%d) %p (conn(#%d): %p)\n", obj
->zv
.handle
, obj
, obj
->intern
->conn
->zv
.handle
, obj
->intern
->conn
);
38 PQfreeCancel(obj
->intern
->cancel
);
39 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
43 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
47 zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
49 php_pqcancel_object_t
*o
;
51 o
= ecalloc(1, sizeof(*o
));
52 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
53 object_properties_init((zend_object
*) o
, ce
);
54 o
->prophandler
= &php_pqcancel_object_prophandlers
;
64 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
65 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
70 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
72 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
75 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
77 php_pqcancel_object_t
*obj
= o
;
79 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
82 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
83 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
85 static PHP_METHOD(pqcancel
, __construct
) {
86 zend_error_handling zeh
;
90 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
91 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
);
92 zend_restore_error_handling(&zeh TSRMLS_CC
);
95 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
97 if (!conn_obj
->intern
) {
98 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Connection not initialized");
100 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
103 throw_exce(EX_RUNTIME TSRMLS_CC
, "Failed to acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
105 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
107 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
108 obj
->intern
->cancel
= cancel
;
109 php_pq_object_addref(conn_obj TSRMLS_CC
);
110 obj
->intern
->conn
= conn_obj
;
116 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
118 static PHP_METHOD(pqcancel
, cancel
) {
119 zend_error_handling zeh
;
122 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
123 rv
= zend_parse_parameters_none();
124 zend_restore_error_handling(&zeh TSRMLS_CC
);
127 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
130 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Cancel not initialized");
134 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
135 throw_exce(EX_RUNTIME TSRMLS_CC
, "Failed to request cancellation (%s)", err
);
141 static zend_function_entry php_pqcancel_methods
[] = {
142 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
143 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
147 PHP_MSHUTDOWN_FUNCTION(pqcancel
)
149 zend_hash_destroy(&php_pqcancel_object_prophandlers
);
153 PHP_MINIT_FUNCTION(pqcancel
)
155 zend_class_entry ce
= {0};
156 php_pq_object_prophandler_t ph
= {0};
158 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
159 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
160 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
162 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
163 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
164 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
165 php_pqcancel_object_handlers
.clone_obj
= NULL
;
166 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
167 php_pqcancel_object_handlers
.get_gc
= NULL
;
168 php_pqcancel_object_handlers
.get_properties
= php_pq_object_properties
;
169 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
171 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
173 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
174 ph
.read
= php_pqcancel_object_read_connection
;
175 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
185 * vim600: noet sw=4 ts=4 fdm=marker
186 * vim<600: noet sw=4 ts=4