23 #define AFW_IMPLEMENTATION_ID "lmdb_index"
42 self->pub.inf = &impl_afw_adaptor_impl_index_inf;
43 self->session = session;
44 self->adaptor = adaptor;
46 self->pub.indexDefinitions = impl_afw_adaptor_impl_index_get_index_definitions(
80 &separator, object_type_id, &separator, key, NULL);
83 &separator, key, NULL);
93 void impl_afw_adaptor_impl_index_release(
104 impl_afw_adaptor_impl_index_get_index_definitions (
116 self->adaptor->internalConfig, &afw_lmdb_s_indexDefinitions, xctx);
135 impl_afw_adaptor_impl_index_update_index_definitions (
145 MDB_txn *txn = self->txn;
153 session->adaptor->internalConfig, &afw_lmdb_s_indexDefinitions,
155 indexDefinitions, pool, xctx),
159 afw_lmdb_internal_save_config(session->adaptor,
160 session->adaptor->internalConfig, txn, xctx);
170 impl_afw_adaptor_impl_index_open(
187 database = afw_lmdb_index_database(object_type_id, key, pool, xctx);
193 if (!unique) flags |= MDB_DUPSORT;
195 if (reverse) flags |= MDB_REVERSEKEY | MDB_REVERSEDUP;
197 if (integer) flags |= MDB_INTEGERKEY;
200 if (self->txn == NULL) {
204 afw_lmdb_internal_open_database(adaptor,
205 AFW_LMDB_GET_TRANSACTION(),
206 database, flags, pool, xctx);
213 afw_lmdb_internal_open_database(adaptor,
214 self->txn, database, flags, pool, xctx);
239 const afw_uuid_t *uuid;
247 if (value->len == 0) {
251 database = afw_lmdb_index_database(
252 object_type_id, indexKey, pool, xctx);
257 dbi = afw_lmdb_internal_open_database(session->adaptor,
258 txn, database, MDB_DUPSORT|MDB_CREATE, pool, xctx);
262 afw_lmdb_internal_set_key(&raw,
263 object_type_id, uuid, pool, xctx);
265 key.mv_data = (
void*)value->s;
266 key.mv_size = value->len;
268 data.mv_data = (
void*)raw.ptr;
269 data.mv_size = raw.size;
272 rc = mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE);
275 "Unable to add unique index value.", xctx);
278 rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
279 if (rc != 0 && rc != MDB_KEYEXIST) {
281 "Unable to add index value.", xctx);
305 MDB_txn *txn =
self->txn;
307 const afw_uuid_t *uuid;
315 if (value->len == 0) {
319 database = afw_lmdb_index_database(
320 object_type_id, indexKey, pool, xctx);
322 dbi = afw_lmdb_internal_open_database(session->adaptor,
323 txn, database, MDB_DUPSORT, pool, xctx);
327 afw_lmdb_internal_set_key(&raw, object_type_id, uuid, pool, xctx);
329 memset(&key, 0,
sizeof(MDB_val));
330 key.mv_data = (
void *)value->s;
331 key.mv_size = value->len;
333 memset(&data, 0,
sizeof(MDB_val));
334 data.mv_data = (
void*)raw.ptr;
335 data.mv_size = raw.size;
337 rc = mdb_del(txn, dbi, &key, &data);
338 if (rc != 0 && rc != MDB_NOTFOUND) {
340 "Unable to delete index value.", xctx);
349 afw_rc_t impl_afw_adaptor_impl_index_replace(
364 MDB_txn *txn =
self->txn;
366 const afw_uuid_t *uuid;
370 database = afw_lmdb_index_database(
371 object_type_id, indexKey, pool, xctx);
373 dbi = afw_lmdb_internal_open_database(session->adaptor,
374 txn, database, MDB_DUPSORT, pool, xctx);
376 memset(&key, 0,
sizeof(MDB_val));
377 key.mv_data = (
void *)old_value->s;
378 key.mv_size = old_value->len;
380 memset(&data, 0,
sizeof(MDB_val));
383 afw_lmdb_internal_set_key(&raw, object_type_id, uuid, pool, xctx);
385 data.mv_data = (
void*)raw.ptr;
386 data.mv_size = raw.size;
389 rc = mdb_del(txn, dbi, &key, &data);
392 "Unable to remove old index value.", xctx);
395 memset(&key, 0,
sizeof(MDB_val));
396 key.mv_data = (
void *)new_value->s;
397 key.mv_size = new_value->len;
399 memset(&data, 0,
sizeof(MDB_val));
402 afw_lmdb_internal_set_key(&raw, object_type_id, uuid, pool, xctx);
404 data.mv_data = (
void*)raw.ptr;
405 data.mv_size = raw.size;
408 rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
417 impl_afw_adaptor_impl_index_drop (
429 MDB_txn *txn =
self->txn;
432 database = afw_lmdb_index_database(
433 object_type_id, key, pool, xctx);
435 dbi = afw_lmdb_internal_open_database(session->adaptor,
436 txn, database, MDB_DUPSORT|MDB_CREATE, pool, xctx);
439 rc = mdb_drop(txn, dbi, 1);
448 impl_afw_adaptor_impl_index_open_cursor (
463 database = afw_lmdb_index_database(
464 object_type_id, key, pool, xctx);
466 cursor = afw_lmdb_internal_cursor_create(self->session,
467 database, object_type_id, value,
operator, unique, xctx);
476 impl_afw_adaptor_impl_index_get_session (
Adaptive Framework Core API.
Helpers for adaptor implementation development.
Helpers for afw_adaptor implementation index development.
Interface afw_interface implementation declares.
Adaptive Framework register generated (afw_lmdb) header.
Helpers for afw_adaptor implementation index development.
Adaptive Framework LMDB Adaptor Internal Header.
#define AFW_LMDB_END_TRANSACTION()
End an LMDB transaction.
#define AFW_LMDB_BEGIN_TRANSACTION(adaptor, session, flags, exclusive, xctx)
Begin an LMDB transaction.
#define AFW_LMDB_COMMIT_TRANSACTION()
Commit a transaction.
Adaptive Framework UUID header.
afw_rc_t impl_afw_adaptor_impl_index_delete(const afw_adaptor_impl_index_t *instance, const afw_utf8_t *object_type_id, const afw_utf8_t *object_id, const afw_utf8_t *indexKey, const afw_utf8_t *value, const afw_pool_t *pool, afw_xctx_t *xctx)
afw_rc_t impl_afw_adaptor_impl_index_add(const afw_adaptor_impl_index_t *instance, const afw_utf8_t *object_type_id, const afw_utf8_t *object_id, const afw_utf8_t *indexKey, const afw_utf8_t *value, afw_boolean_t unique, const afw_pool_t *pool, afw_xctx_t *xctx)
#define AFW_ADAPTOR_IMPL_LOCK_WRITE_END
Macro to end an adaptor write lock section.
#define AFW_ADAPTOR_IMPL_LOCK_READ_END
Macro to end an adaptor read lock section.
#define AFW_ADAPTOR_IMPL_LOCK_READ_BEGIN(adaptor)
Macro to begin an adaptor read lock section.
#define AFW_ADAPTOR_IMPL_LOCK_WRITE_BEGIN(adaptor)
Macro to begin an adaptor write lock section.
afw_object_set_property_as_object(const afw_object_t *object, const afw_utf8_t *property_name, const afw_object_t *internal, afw_xctx_t *xctx)
Set property function for data type object values.
#define afw_object_old_get_property_as_object(object, property_name, xctx)
Get property function for data type object value.
#define AFW_UTF8_LITERAL(A_STRING)
String literal initializer.
#define AFW_THROW_ERROR_RV_Z(code, rv_source_id, rv, message_z, xctx)
Macro used to set error and rv in xctx and throw it.
afw_object_create_clone(const afw_object_t *object, const afw_pool_t *p, afw_xctx_t *xctx)
Clone an object to a specified pool.
#define afw_object_create_managed(p, xctx)
Create an empty entity object in its own pool.
const afw_utf8_t * afw_utf8_concat(const afw_pool_t *p, afw_xctx_t *xctx,...)
Concatenate strings with result in specifed pool.
afw_uuid_from_utf8(const afw_utf8_t *s, const afw_pool_t *p, afw_xctx_t *xctx)
Convert standard format UUID utf-8 string to uuid.
#define afw_xctx_calloc_type(type, xctx)
Macro to allocate cleared memory to hold type in xctx's pool.
Interface afw_adaptor_impl_index_cursor public struct.
Interface afw_adaptor_impl_index public struct.
Interface afw_adaptor public struct.
Interface afw_adaptor_session public struct.
Struct for memory pointer and size.
Interface afw_object public struct.
Interface afw_pool public struct.
NFC normalized UTF-8 string.
Interface afw_xctx public struct.