Ai
1 Star 0 Fork 0

hantaohuang/php-rocksdb

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
rocksdb_transaction.cc 5.88 KB
一键复制 编辑 原始数据 按行查看 历史
哇咔咔 提交于 2020-04-29 18:32 +08:00 . improve: add zend_object_alloc
/* rocksdb extension for PHP */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "php_rocksdb.h"
#include "rocksdb/db.h"
#include "rocksdb/options.h"
#include "rocksdb/slice.h"
#include "rocksdb/utilities/transaction.h"
#include "rocksdb/utilities/transaction_db.h"
#include "error.h"
using namespace rocksdb;
typedef struct
{
Transaction *db;
zend_object std;
} rocksdb_transaction_t;
zend_class_entry *rocksdb_transaction_ce;
static zend_object_handlers rocksdb_transaction_handlers;
extern zend_class_entry *rocksdb_snapshot_ce;
extern void check_rocksdb_db_read_options(ReadOptions &rop, HashTable *vht);
void php_rocksdb_snapshot_set_ptr(zval *zobject, const Snapshot *snapshot);
ZEND_BEGIN_ARG_INFO_EX(arginfo_rocksdb_transaction_void, 0, 0, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_rocksdb_transaction_put, 0, 0, 2)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_rocksdb_transaction_get, 0, 0, 2)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, readOptions)
ZEND_END_ARG_INFO()
static inline rocksdb_transaction_t *php_rocksdb_transaction_fetch_object(zend_object *obj)
{
return (rocksdb_transaction_t *) ((char *) obj - rocksdb_transaction_handlers.offset);
}
static zend_object *php_rocksdb_transaction_create_object(zend_class_entry *ce)
{
rocksdb_transaction_t *rocksdb_transaction = (rocksdb_transaction_t *) zend_object_alloc(sizeof(rocksdb_transaction_t), ce);
zend_object_std_init(&rocksdb_transaction->std, ce);
object_properties_init(&rocksdb_transaction->std, ce);
rocksdb_transaction->std.handlers = &rocksdb_transaction_handlers;
return &rocksdb_transaction->std;
}
static void php_rocksdb_transaction_free_object(zend_object *object)
{
rocksdb_transaction_t *rocksdb_transaction = (rocksdb_transaction_t *) php_rocksdb_transaction_fetch_object(object);
zend_object_std_dtor(&rocksdb_transaction->std);
}
static Transaction *php_rocksdb_transaction_get_ptr(zval *zobject)
{
return php_rocksdb_transaction_fetch_object(Z_OBJ_P(zobject))->db;
}
void php_rocksdb_transaction_set_ptr(zval *zobject, Transaction *db)
{
php_rocksdb_transaction_fetch_object(Z_OBJ_P(zobject))->db = db;
}
static PHP_METHOD(rocksdb_transaction, put)
{
char *key;
size_t key_len;
char *value;
size_t value_len;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_STRING(key, key_len)
Z_PARAM_STRING(value, value_len)
ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
Status s = transaction->Put(std::string(key, key_len), std::string(value, value_len));
if (!s.ok()) {
zend_throw_exception(rocksdb_exception_ce, s.ToString().c_str(), ROCKSDB_PUT_ERROR);
}
RETURN_TRUE;
}
static PHP_METHOD(rocksdb_transaction, get)
{
char *key;
size_t key_len;
zval *zreadoptions = nullptr;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STRING(key, key_len)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY(zreadoptions)
ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
ReadOptions rop;
if (zreadoptions)
{
check_rocksdb_db_read_options(rop, Z_ARRVAL_P(zreadoptions));
}
std::string value;
Status s = transaction->Get(rop, std::string(key, key_len), &value);
if (!s.ok())
{
zend_throw_exception(rocksdb_exception_ce, s.ToString().c_str(), ROCKSDB_GET_ERROR);
}
RETURN_STRINGL(value.c_str(), value.length());
}
static PHP_METHOD(rocksdb_transaction, commit)
{
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
Status s = transaction->Commit();
if (!s.ok()) {
zend_throw_exception(rocksdb_exception_ce, s.ToString().c_str(), ROCKSDB_COMMIT_ERROR);
}
RETURN_TRUE;
}
static PHP_METHOD(rocksdb_transaction, getSnapshot)
{
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
const Snapshot *snapshot = transaction->GetSnapshot();
zval zsnapshot;
object_init_ex(&zsnapshot, rocksdb_snapshot_ce);
php_rocksdb_snapshot_set_ptr(&zsnapshot, snapshot);
RETVAL_OBJ(Z_OBJ_P(&zsnapshot));
}
static PHP_METHOD(rocksdb_transaction, rollback)
{
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
Status s = transaction->Rollback();
if (!s.ok()) {
zend_throw_exception(rocksdb_exception_ce, s.ToString().c_str(), ROCKSDB_COMMIT_ERROR);
}
RETURN_TRUE;
}
static PHP_METHOD(rocksdb_transaction, setSnapshot)
{
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
transaction->SetSnapshot();
RETURN_TRUE;
}
static PHP_METHOD(rocksdb_transaction, setSavePoint)
{
Transaction *transaction = php_rocksdb_transaction_get_ptr(ZEND_THIS);
transaction->SetSavePoint();
RETURN_TRUE;
}
static const zend_function_entry rocksdb_transaction_methods[] =
{
PHP_ME(rocksdb_transaction, put, arginfo_rocksdb_transaction_put, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, get, arginfo_rocksdb_transaction_get, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, commit, arginfo_rocksdb_transaction_void, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, getSnapshot, arginfo_rocksdb_transaction_void, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, rollback, arginfo_rocksdb_transaction_void, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, setSnapshot, arginfo_rocksdb_transaction_void, ZEND_ACC_PUBLIC)
PHP_ME(rocksdb_transaction, setSavePoint, arginfo_rocksdb_transaction_void, ZEND_ACC_PUBLIC)
PHP_FE_END
};
void php_rocksdb_transaction_minit(int module_number)
{
ROCKSDB_INIT_CLASS_ENTRY(rocksdb_transaction, "RocksDB\\Transaction", NULL, NULL, rocksdb_transaction_methods);
ROCKSDB_SET_CLASS_CUSTOM_OBJECT(rocksdb_transaction, php_rocksdb_transaction_create_object, php_rocksdb_transaction_free_object, rocksdb_transaction_t, std);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/codinghuang/php-rocksdb.git
git@gitee.com:codinghuang/php-rocksdb.git
codinghuang
php-rocksdb
php-rocksdb
master

搜索帮助