{
php_pqlob_object_t *obj = PHP_PQ_OBJ(NULL, o);
#if DBG_GC
- fprintf(stderr, "FREE lob(#%d) %p (txn(#%d): %p)\n", obj->zv.handle, obj, obj->intern->txn->zv.handle, obj->intern->txn);
+ fprintf(stderr, "FREE lob(#%d) %p (txn(#%d): %p)\n", obj->zo.handle, obj, obj->intern->txn->zo.handle, obj->intern->txn);
#endif
if (obj->intern) {
if (obj->intern->lofd) {
efree(obj->intern);
obj->intern = NULL;
}
- zend_object_std_dtor(o);
- efree(obj);
+ php_pq_object_dtor(o);
}
php_pqlob_object_t *php_pqlob_create_object_ex(zend_class_entry *ce, php_pqlob_t *intern)
{
- php_pqlob_object_t *o;
-
- o = ecalloc(1, sizeof(*o) + zend_object_properties_size(ce));
- zend_object_std_init(&o->zo, ce);
- object_properties_init(&o->zo, ce);
- o->prophandler = &php_pqlob_object_prophandlers;
-
- if (intern) {
- o->intern = intern;
- }
-
- o->zo.handlers = &php_pqlob_object_handlers;
-
- return o;
+ return php_pq_object_create(ce, intern, sizeof(php_pqlob_object_t),
+ &php_pqlob_object_handlers, &php_pqlob_object_prophandlers);
}
static zend_object *php_pqlob_create_object(zend_class_entry *class_type)
return &php_pqlob_create_object_ex(class_type, NULL)->zo;
}
-static void php_pqlob_object_read_transaction(zval *object, void *o, zval *return_value)
+static void php_pqlob_object_read_transaction(void *o, zval *return_value)
{
php_pqlob_object_t *obj = o;
php_pq_object_to_zval(obj->intern->txn, return_value);
}
-static void php_pqlob_object_read_oid(zval *object, void *o, zval *return_value)
+static void php_pqlob_object_gc_transaction(void *o, zval *return_value)
+{
+ php_pqlob_object_t *obj = o;
+ zval ztxn;
+
+ php_pq_object_to_zval_no_addref(obj->intern->txn, &ztxn);
+ add_next_index_zval(return_value, &ztxn);
+}
+
+static void php_pqlob_object_read_oid(void *o, zval *return_value)
{
php_pqlob_object_t *obj = o;
RETVAL_LONG(obj->intern->loid);
}
-static void php_pqlob_object_update_stream(zval *this_ptr, php_pqlob_object_t *obj, zval *zstream);
+static void php_pqlob_object_update_stream(php_pqlob_object_t *obj, zval *zstream);
-static void php_pqlob_object_read_stream(zval *object, void *o, zval *return_value)
+static void php_pqlob_object_read_stream(void *o, zval *return_value)
{
php_pqlob_object_t *obj = o;
zval zstream;
if (!obj->intern->stream) {
- php_pqlob_object_update_stream(object, obj, &zstream);
+ php_pqlob_object_update_stream(obj, &zstream);
} else {
php_stream_to_zval(obj->intern->stream, &zstream);
}
- RETVAL_ZVAL(&zstream, 1, 1);
+ RETVAL_ZVAL(&zstream, 1, 0);
}
-static size_t php_pqlob_stream_write(php_stream *stream, const char *buffer, size_t length TSRMLS_DC)
+#if PHP_VERSION_ID < 70400
+static size_t php_pqlob_stream_write(php_stream *stream, const char *buffer, size_t length)
+#else
+static ssize_t php_pqlob_stream_write(php_stream *stream, const char *buffer, size_t length)
+#endif
{
php_pqlob_object_t *obj = stream->abstract;
- int written = 0;
+ ssize_t written = 0;
if (obj) {
written = lo_write(obj->intern->txn->intern->conn->intern->conn, obj->intern->lofd, buffer, length);
if (written < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write to LOB with oid=%u (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
+ php_error_docref(NULL, E_WARNING, "Failed to write to LOB with oid=%u (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
}
- php_pqconn_notify_listeners(obj->intern->txn->intern->conn TSRMLS_CC);
+ php_pqconn_notify_listeners(obj->intern->txn->intern->conn);
}
+#if PHP_VERSION_ID < 70400
+ return (written < 0 ? 0 : written);
+#else
return written;
+#endif
}
-static size_t php_pqlob_stream_read(php_stream *stream, char *buffer, size_t length TSRMLS_DC)
+#if PHP_VERSION_ID < 70400
+static size_t php_pqlob_stream_read(php_stream *stream, char *buffer, size_t length)
+#else
+static ssize_t php_pqlob_stream_read(php_stream *stream, char *buffer, size_t length)
+#endif
{
php_pqlob_object_t *obj = stream->abstract;
- int read = 0;
+ ssize_t read = 0;
if (obj) {
read = lo_read(obj->intern->txn->intern->conn->intern->conn, obj->intern->lofd, buffer, length);
if (read < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read from LOB with oid=%d (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
+ php_error_docref(NULL, E_WARNING, "Failed to read from LOB with oid=%d (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
}
}
- php_pqconn_notify_listeners(obj->intern->txn->intern->conn TSRMLS_CC);
+ php_pqconn_notify_listeners(obj->intern->txn->intern->conn);
}
+#if PHP_VERSION_ID < 70400
+ return (read < 0 ? 0 : read);
+#else
return read;
+#endif
}
-static ZEND_RESULT_CODE php_pqlob_stream_close(php_stream *stream, int close_handle TSRMLS_DC)
+static ZEND_RESULT_CODE php_pqlob_stream_close(php_stream *stream, int close_handle)
{
return SUCCESS;
}
-static int php_pqlob_stream_flush(php_stream *stream TSRMLS_DC)
+static int php_pqlob_stream_flush(php_stream *stream)
{
return SUCCESS;
}
-static ZEND_RESULT_CODE php_pqlob_stream_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC)
+static ZEND_RESULT_CODE php_pqlob_stream_seek(php_stream *stream, zend_off_t offset, int whence, zend_off_t *newoffset)
{
ZEND_RESULT_CODE rv = FAILURE;
php_pqlob_object_t *obj = stream->abstract;
int position = lo_lseek(obj->intern->txn->intern->conn->intern->conn, obj->intern->lofd, offset, whence);
if (position < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek offset in LOB with oid=%d (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
+ php_error_docref(NULL, E_WARNING, "Failed to seek offset in LOB with oid=%d (%s)", obj->intern->loid, PHP_PQerrorMessage(obj->intern->txn->intern->conn->intern->conn));
rv = FAILURE;
} else {
*newoffset = position;
rv = SUCCESS;
}
- php_pqconn_notify_listeners(obj->intern->txn->intern->conn TSRMLS_CC);
+ php_pqconn_notify_listeners(obj->intern->txn->intern->conn);
}
return rv;
NULL, /* set_option */
};
-static void php_pqlob_object_update_stream(zval *zpqlob, php_pqlob_object_t *obj, zval *zstream)
+static void php_pqlob_object_update_stream(php_pqlob_object_t *obj, zval *zstream)
{
- zval zmember;
+ zval zobj, zmember;
ZVAL_STRINGL(&zmember, "stream", sizeof("stream")-1);
- if (!obj) {
- obj = PHP_PQ_OBJ(zpqlob, NULL);
- }
obj->intern->stream = php_stream_alloc(&php_pqlob_stream_ops, obj, NULL, "r+b");
obj->intern->stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
php_stream_to_zval(obj->intern->stream, zstream);
- zend_get_std_object_handlers()->write_property(zpqlob, &zmember, zstream, NULL);
+#if PHP_VERSION_ID >= 80000
+ zend_std_write_property(&obj->zo, Z_STR(zmember), zstream, NULL);
+#else
+ ZVAL_OBJ(&zobj, &obj->zo);
+ zend_std_write_property(&zobj, &zmember, zstream, NULL);
+#endif
+ zval_ptr_dtor(&zmember);
}
ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct, 0, 0, 1)
}
static zend_function_entry php_pqlob_methods[] = {
- PHP_ME(pqlob, __construct, ai_pqlob_construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
+ PHP_ME(pqlob, __construct, ai_pqlob_construct, ZEND_ACC_PUBLIC)
PHP_ME(pqlob, write, ai_pqlob_write, ZEND_ACC_PUBLIC)
PHP_ME(pqlob, read, ai_pqlob_read, ZEND_ACC_PUBLIC)
PHP_ME(pqlob, seek, ai_pqlob_seek, ZEND_ACC_PUBLIC)
php_pqlob_object_handlers.read_property = php_pq_object_read_prop;
php_pqlob_object_handlers.write_property = php_pq_object_write_prop;
php_pqlob_object_handlers.clone_obj = NULL;
- php_pqlob_object_handlers.get_property_ptr_ptr = NULL;
- php_pqlob_object_handlers.get_gc = NULL;
+ php_pqlob_object_handlers.get_property_ptr_ptr = php_pq_object_get_prop_ptr_null;
+ php_pqlob_object_handlers.get_gc = php_pq_object_get_gc;
php_pqlob_object_handlers.get_properties = php_pq_object_properties;
php_pqlob_object_handlers.get_debug_info = php_pq_object_debug_info;
- zend_hash_init(&php_pqlob_object_prophandlers, 3, NULL, NULL, 1);
+ zend_hash_init(&php_pqlob_object_prophandlers, 3, NULL, php_pq_object_prophandler_dtor, 1);
zend_declare_property_null(php_pqlob_class_entry, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC);
ph.read = php_pqlob_object_read_transaction;
+ ph.gc = php_pqlob_object_gc_transaction;
zend_hash_str_add_mem(&php_pqlob_object_prophandlers, "transaction", sizeof("transaction")-1, (void *) &ph, sizeof(ph));
+ ph.gc = NULL;
zend_declare_property_long(php_pqlob_class_entry, ZEND_STRL("oid"), InvalidOid, ZEND_ACC_PUBLIC);
ph.read = php_pqlob_object_read_oid;
- zend_hash_str_add_mem(&php_pqlob_object_prophandlers, "oid", sizeof("oid"), (void *) &ph, sizeof(ph));
+ zend_hash_str_add_mem(&php_pqlob_object_prophandlers, "oid", sizeof("oid")-1, (void *) &ph, sizeof(ph));
zend_declare_property_null(php_pqlob_class_entry, ZEND_STRL("stream"), ZEND_ACC_PUBLIC);
ph.read = php_pqlob_object_read_stream;
- zend_hash_str_add_mem(&php_pqlob_object_prophandlers, "stream", sizeof("stream"), (void *) &ph, sizeof(ph));
+ zend_hash_str_add_mem(&php_pqlob_object_prophandlers, "stream", sizeof("stream")-1, (void *) &ph, sizeof(ph));
zend_declare_class_constant_long(php_pqlob_class_entry, ZEND_STRL("INVALID_OID"), InvalidOid);
zend_declare_class_constant_long(php_pqlob_class_entry, ZEND_STRL("R"), INV_READ);