Adaptive Framework  0.9.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
afw_lmdb_internal.h
Go to the documentation of this file.
1 // See the 'COPYING' file in the project root for licensing information.
2 /*
3  * Adaptive Framework LMDB Adaptor Internal Header
4  *
5  * Copyright (c) 2010-2023 Clemson University
6  *
7  */
8 
9 #ifndef __AFW_LMDB_INTERNAL_H__
10 #define __AFW_LMDB_INTERNAL_H__
11 
12 
18 #include "afw_minimal.h"
19 #include "afw_lmdb.h"
20 #include "afw_uuid.h"
22 #include <lmdb.h>
23 
25 
27 
28 /* Defined in afw_lmdb_metadata.h */
30 
31 typedef struct afw_lmdb_env_s {
32  const afw_utf8_z_t *path_z;
33  int mode;
34  int maxreaders;
35  int maxdbs;
36  size_t mapsize;
37  unsigned int flags;
39 
40 typedef struct afw_lmdb_limits_s {
41  int size_soft;
42  int size_hard;
43  int time_soft;
44  int time_hard;
46 
47 typedef struct afw_lmdb_adaptor_s {
48  afw_adaptor_t pub;
49  const afw_content_type_t *ubjson;
50  const afw_lmdb_limits_t *limits;
51  const afw_lmdb_env_t *env;
52  const afw_object_t *internalConfig;
53  MDB_env *dbEnv;
54  afw_lmdb_metadata_t *metadata;
55  apr_hash_t *dbi_handles;
56  apr_thread_rwlock_t *dbLock;
58 
59 typedef struct afw_lmdb_journal_s {
61  afw_adaptor_session_t *session;
63 
64 typedef struct afw_lmdb_key_value_s {
66  afw_adaptor_session_t *session;
68 
69 typedef struct afw_lmdb_transaction_s {
71  afw_adaptor_session_t *session;
72  MDB_txn *txn;
74 
75 /* defines the data used to remember our open transaction handle */
76 typedef struct {
77  const afw_lmdb_adaptor_t *adaptor;
78  MDB_txn *txn;
79  afw_boolean_t transCommitted;
81 
84  afw_lmdb_adaptor_t *adaptor;
85  afw_adaptor_session_t *metadata_session;
86  afw_adaptor_impl_index_t *indexer;
87  afw_lmdb_journal_t *journal;
88  afw_lmdb_key_value_t *key_value;
89 
90  /* currently used, inner, transaction */
91  MDB_txn *currTxn;
92 
93  /* storage for transaction interface */
94  afw_lmdb_transaction_t *transaction;
95 
97 
100  const afw_lmdb_adaptor_session_t * session;
101  const afw_lmdb_adaptor_t * adaptor;
102  MDB_txn *txn;
104 
107 
108  /* Private implementation variables */
109  const afw_lmdb_adaptor_session_t *session;
110  const afw_utf8_t *object_type_id;
111  const afw_utf8_t *key_string;
112  afw_boolean_t unique;
114  MDB_dbi dbPri;
115  MDB_cursor * cursor;
116  MDB_val key;
117  MDB_val data;
118 
120 
121 /* defines the data used to remember our open database handle */
122 typedef struct {
123  MDB_env *env;
124  MDB_dbi dbi;
126 
127 
128 
129 /*
130  *
131  */
132 afw_lmdb_dbi_t * afw_lmdb_internal_dbi_handle(
133  MDB_env * env,
134  MDB_dbi dbi,
135  const afw_pool_t * pool,
136  afw_xctx_t * xctx);
137 
138 
147  const afw_object_t *properties,
148  const afw_pool_t *p, afw_xctx_t *xctx);
149 
158  afw_lmdb_adaptor_t * adaptor,
159  afw_xctx_t *xctx);
160 
170  afw_xctx_t *xctx);
171 
181  afw_xctx_t *xctx);
182 
192  afw_xctx_t *xctx);
193 
194 
195 afw_rc_t afw_lmdb_internal_cleanup_free_result(void *data);
196 
197 const afw_utf8_t * afw_lmdb_internal_get_object_id(
198  const afw_lmdb_adaptor_session_t *self,
199  afw_xctx_t *xctx);
200 
201 afw_rc_t afw_lmdb_internal_close_database(void *val);
202 afw_rc_t afw_lmdb_internal_close_cursor(void *val);
203 
204 void afw_lmdb_internal_close_transaction(
205  void *data, void *data2,
206  const afw_pool_t *p,
207  afw_xctx_t *xctx);
208 
209 MDB_dbi afw_lmdb_internal_open_database(
210  const afw_lmdb_adaptor_t * adaptor,
211  MDB_txn * txn,
212  const afw_utf8_t * database,
213  unsigned int flags,
214  const afw_pool_t * p,
215  afw_xctx_t * xctx);
216 
217 MDB_cursor * afw_lmdb_internal_open_cursor(
218  const afw_lmdb_adaptor_session_t *session,
219  MDB_dbi dbi,
220  afw_xctx_t *xctx);
221 
222 afw_lmdb_txn_t * afw_lmdb_internal_open_transaction(
223  const afw_lmdb_adaptor_session_t *session,
224  const afw_lmdb_adaptor_t *adaptor,
225  unsigned int flags,
226  afw_boolean_t exclusive,
227  afw_xctx_t *xctx);
228 
229 int afw_lmdb_internal_commit_transaction(
230  const afw_lmdb_adaptor_session_t *session,
231  const afw_lmdb_adaptor_t *adaptor,
232  afw_xctx_t *xctx);
233 
234 void afw_lmdb_internal_abort_transaction(
235  const afw_lmdb_adaptor_session_t *session,
236  const afw_lmdb_adaptor_t *adaptor,
237  afw_xctx_t *xctx);
238 
239 int afw_lmdb_internal_index_object(
240  const afw_lmdb_adaptor_session_t * session,
241  const afw_lmdb_adaptor_t * adaptor,
242  const afw_utf8_t * object_type_id,
243  const afw_object_t * object,
244  const afw_uuid_t *uuid,
245  afw_xctx_t *xctx);
246 
247 int afw_lmdb_internal_index_property(
248  const afw_lmdb_adaptor_t * adaptor,
249  MDB_txn *txn,
250  const afw_utf8_t *object_type_id,
251  const afw_utf8_t *property,
252  const afw_utf8_t *value,
253  const afw_uuid_t *uuid,
254  afw_xctx_t *xctx);
255 
256 int afw_lmdb_internal_delete_index(
257  const afw_lmdb_adaptor_session_t * session,
258  const afw_utf8_t *object_type_id,
259  const afw_utf8_t *object_id,
260  const afw_utf8_t *property,
261  const afw_value_t *value,
262  afw_xctx_t *xctx);
263 
264 afw_boolean_t afw_lmdb_internal_is_property_indexed(
265  const afw_lmdb_adaptor_t *adaptor,
266  const afw_utf8_t *object_type_id,
267  const afw_utf8_t *property_name,
268  afw_xctx_t *xctx);
269 
270 const afw_object_t * afw_lmdb_internal_create_object_from_entry(
271  const afw_lmdb_adaptor_session_t *self,
272  const afw_utf8_t *object_type_id,
273  const afw_utf8_t *object_id,
274  MDB_dbi dbi,
275  afw_xctx_t *xctx);
276 
277 const afw_value_t * afw_lmdb_internal_create_value_from_entry(
278  const afw_lmdb_adaptor_session_t *self,
279  const afw_utf8_t *object_type_id,
280  const afw_utf8_t *object_id,
281  MDB_dbi dbi,
282  afw_xctx_t *xctx);
283 
284 void afw_lmdb_internal_create_entry_from_object(
285  const afw_lmdb_adaptor_session_t *self,
286  const afw_utf8_t *object_type_id,
287  const afw_utf8_t *object_id,
288  const afw_object_t *object,
289  MDB_dbi dbi,
290  afw_xctx_t *xctx);
291 
292 void afw_lmdb_internal_replace_entry_from_object(
293  const afw_lmdb_adaptor_session_t *self,
294  const afw_utf8_t *object_type_id,
295  const afw_utf8_t *object_id,
296  const afw_object_t *object,
297  MDB_dbi dbi,
298  afw_xctx_t *xctx);
299 
300 afw_adaptor_impl_index_cursor_t * afw_lmdb_internal_cursor_create(
301  const afw_lmdb_adaptor_session_t *self,
302  const afw_utf8_t * database,
303  const afw_utf8_t * object_type_id,
304  const afw_utf8_t * value,
305  const afw_query_criteria_filter_op_id_t operator,
306  afw_boolean_t unique,
307  afw_xctx_t *xctx);
308 
309 const afw_object_t * afw_lmdb_internal_get_config(
310  afw_lmdb_adaptor_t * self,
311  MDB_txn *txn,
312  const afw_pool_t *p,
313  afw_xctx_t *xctx);
314 
315 void afw_lmdb_internal_save_config(
316  afw_lmdb_adaptor_t * self,
317  const afw_object_t * config,
318  MDB_txn *txn,
319  afw_xctx_t *xctx);
320 
321 void afw_lmdb_internal_set_key(
322  afw_memory_t * key,
323  const afw_utf8_t * object_type_id,
324  const afw_uuid_t * uuid,
325  const afw_pool_t * p,
326  afw_xctx_t *xctx);
327 
328 void afw_lmdb_internal_get_key(
329  afw_memory_t * key,
330  afw_utf8_t * object_type_id,
331  afw_uuid_t * uuid);
332 
333 afw_rc_t afw_lmdb_internal_delete_entry(
334  MDB_txn *txn,
335  MDB_dbi dbi,
336  const afw_memory_t * raw_key,
337  const afw_memory_t * raw_value,
338  afw_xctx_t *xctx);
339 
340 int afw_lmdb_internal_reader_check(
341  const afw_adaptor_t * instance,
342  int * deadReaders,
343  afw_xctx_t *xctx);
344 
345 int afw_lmdb_internal_reader_list(
346  const afw_adaptor_t * instance,
347  const afw_utf8_t ** list,
348  const afw_pool_t * pool,
349  afw_xctx_t *xctx);
350 
363 #define AFW_LMDB_BEGIN_TRANSACTION( \
364  adaptor, \
365  session, \
366  flags, \
367  exclusive, \
368  xctx) \
369 do { \
370  MDB_txn * this_txn = NULL; \
371  bool this_txnHandled = false; \
372  const afw_lmdb_adaptor_t * this_adaptor = adaptor; \
373  const afw_lmdb_adaptor_session_t * this_session = session; \
374  afw_xctx_t * this_xctx = xctx; \
375  int this_rc; \
376  AFW_TRY { \
377  if (session && session->transaction) { \
378  ((afw_lmdb_adaptor_session_t *)session)->currTxn = session->transaction->txn; \
379  } else { \
380  if (exclusive) { \
381  apr_thread_rwlock_wrlock(adaptor->dbLock); \
382  } else { \
383  apr_thread_rwlock_rdlock(adaptor->dbLock); \
384  } \
385  this_rc = mdb_txn_begin(adaptor->dbEnv, NULL, flags, &this_txn); \
386  if (this_rc) { \
387  apr_thread_rwlock_unlock(adaptor->dbLock); \
388  AFW_THROW_ERROR_RV_Z(general, lmdb, this_rc, \
389  "Unable to begin transaction.", this_xctx); \
390  } \
391  if (session) \
392  ((afw_lmdb_adaptor_session_t *)session)->currTxn = this_txn; \
393  } \
394  do {
395 
399 #define AFW_LMDB_GET_TRANSACTION() \
400  (this_session && this_session->currTxn) ? this_session->currTxn : this_txn
401 
405 #define AFW_LMDB_COMMIT_TRANSACTION() \
406  if (!(this_session && this_session->transaction)) { \
407  if (this_txn && !this_txnHandled) { \
408  this_rc = mdb_txn_commit(this_txn); \
409  this_txnHandled = true; \
410  if (this_rc) { \
411  AFW_THROW_ERROR_RV_Z(general, lmdb_internal, this_rc, \
412  "Unable to commit transaction.", this_xctx); \
413  } \
414  } \
415  }
416 
420 #define AFW_LMDB_ABORT_TRANSACTION() \
421  if (!(this_session && this_session->transaction)) { \
422  if (this_txn && !this_txnHandled) { \
423  mdb_txn_abort(this_txn); \
424  txnHandled = true; \
425  if (this_rc) { \
426  AFW_THROW_ERROR_RV_Z(general, lmdb_internal, this_rc, \
427  "Unable to abort transaction.", this_xctx); \
428  } \
429  } \
430  }
431 
435 #define AFW_LMDB_END_TRANSACTION() \
436  } while (0); \
437  } AFW_FINALLY { \
438  if (!(this_session && this_session->transaction)) { \
439  if (this_txn && !this_txnHandled) { \
440  mdb_txn_abort(this_txn); \
441  this_txnHandled = true; \
442  } \
443  apr_thread_rwlock_unlock(this_adaptor->dbLock); \
444  } \
445  AFW_MARK_UNHANDLED; \
446  } \
447  AFW_ENDTRY; \
448 } while(0)
449 
450 AFW_END_DECLARES
451 
452 #endif /* __AFW_LMDB_INTERNAL_H__ */
#define AFW_BEGIN_DECLARES
Adaptive Framework LMDB Adaptor.
#define AFW_LMDB_DECLARE_INTERNAL_CONST_DATA(type)
Declare an internal variable for /src/afw_lmdb/ source*.h files.
Adaptive Framework register generated (afw_lmdb) header.
afw_lmdb_transaction_t * afw_lmdb_transaction_create(afw_lmdb_adaptor_session_t *session, afw_xctx_t *xctx)
Internal create a LMDB adaptor transaction.
afw_lmdb_journal_t * afw_lmdb_journal_create(afw_lmdb_adaptor_session_t *session, afw_xctx_t *xctx)
Internal create a LMDB adaptor journal.
afw_lmdb_key_value_t * afw_lmdb_key_value_create(afw_lmdb_adaptor_session_t *session, afw_xctx_t *xctx)
Internal create a LMDB adaptor key/value.
const afw_adaptor_t * afw_lmdb_adaptor_create_cede_p(const afw_object_t *properties, const afw_pool_t *p, afw_xctx_t *xctx)
Internal create an LMDB adaptor.
afw_lmdb_adaptor_session_t * afw_lmdb_adaptor_session_create(afw_lmdb_adaptor_t *adaptor, afw_xctx_t *xctx)
Internal create a LMDB adaptor session.
Adaptive Framework Minimal Header.
Adaptive Framework UUID header.
_Bool afw_boolean_t
Definition: afw_common.h:373
afw_utf8_octet_t afw_utf8_z_t
NFC normalized UTF-8 null terminated string.
Definition: afw_common.h:523
int afw_rc_t
Definition: afw_common.h:663
afw_query_criteria_filter_op_id_t
Interface afw_adaptor_factory public struct.
Interface afw_adaptor_impl_index_cursor public struct.
Interface afw_adaptor_impl_index public struct.
Interface afw_adaptor_journal public struct.
Interface afw_adaptor_key_value public struct.
Interface afw_adaptor public struct.
Interface afw_adaptor_session public struct.
Interface afw_adaptor_transaction public struct.
Interface afw_content_type public struct.
Struct for memory pointer and size.
Definition: afw_common.h:505
Interface afw_object public struct.
Interface afw_pool public struct.
NFC normalized UTF-8 string.
Definition: afw_common.h:545
Interface afw_value public struct.
Interface afw_xctx public struct.