11 MDBX_env *env =
nullptr;
13 MDBX_dbi dbi_ticks, dbi_metadata;
15 MDBX_txn *txn =
nullptr;
16 MDBX_cursor *cursor =
nullptr;
20 std::vector<uint8_t> tick_data(16,
'D');
21 uint64_t tick_key = 0;
24 printf(
"MDBX limits:\n");
25#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul
26 const double scale_factor = 1099511627776.0;
27 const char *
const scale_unit =
"TiB";
29 const double scale_factor = 1073741824.0;
30 const char *
const scale_unit =
"GiB";
32 const size_t pagesize_min = mdbx_limits_pgsize_min();
33 const size_t pagesize_max = mdbx_limits_pgsize_max();
34 const size_t pagesize_default = mdbx_default_pagesize();
36 printf(
"\tPage size: a power of 2, minimum %zu, maximum %zu bytes,"
37 " default %zu bytes.\n",
38 pagesize_min, pagesize_max, pagesize_default);
39 printf(
"\tKey size: minimum %zu, maximum ≈¼ pagesize (%zu bytes for default"
40 " %zuK pagesize, %zu bytes for %zuK pagesize).\n",
41 (
size_t)0, mdbx_limits_keysize_max(-1, MDBX_DB_DEFAULTS), pagesize_default / 1024,
42 mdbx_limits_keysize_max(pagesize_max, MDBX_DB_DEFAULTS), pagesize_max / 1024);
43 printf(
"\tValue size: minimum %zu, maximum %zu (0x%08zX) bytes for maps,"
44 " ≈¼ pagesize for multimaps (%zu bytes for default %zuK pagesize,"
45 " %zu bytes for %zuK pagesize).\n",
46 (
size_t)0, mdbx_limits_valsize_max(pagesize_min, MDBX_DB_DEFAULTS),
47 mdbx_limits_valsize_max(pagesize_min, MDBX_DB_DEFAULTS), mdbx_limits_valsize_max(-1, MDBX_DUPSORT),
48 pagesize_default / 1024, mdbx_limits_valsize_max(pagesize_max, MDBX_DUPSORT), pagesize_max / 1024);
49 printf(
"\tWrite transaction size: up to %zu (0x%zX) pages (%f %s for default "
50 "%zuK pagesize, %f %s for %zuK pagesize).\n",
51 mdbx_limits_txnsize_max(pagesize_min) / pagesize_min, mdbx_limits_txnsize_max(pagesize_min) / pagesize_min,
52 mdbx_limits_txnsize_max(-1) / scale_factor, scale_unit, pagesize_default / 1024,
53 mdbx_limits_txnsize_max(pagesize_max) / scale_factor, scale_unit, pagesize_max / 1024);
54 printf(
"\tDatabase size: up to %zu pages (%f %s for default %zuK "
55 "pagesize, %f %s for %zuK pagesize).\n",
56 mdbx_limits_dbsize_max(pagesize_min) / pagesize_min, mdbx_limits_dbsize_max(-1) / scale_factor, scale_unit,
57 pagesize_default / 1024, mdbx_limits_dbsize_max(pagesize_max) / scale_factor, scale_unit, pagesize_max / 1024);
58 printf(
"\tMaximum sub-databases: %u.\n", MDBX_MAX_DBI);
62 rc = mdbx_env_create(&env);
63 if (rc != MDBX_SUCCESS) {
64 fprintf(stderr,
"mdbx_env_create: (%d) %s\n", rc, mdbx_strerror(rc));
69 rc = mdbx_env_set_geometry(env,
76 if (rc != MDBX_SUCCESS) {
77 fprintf(stderr,
"mdbx_env_set_geometry: (%d) %s\n", rc, mdbx_strerror(rc));
82 rc = mdbx_env_set_maxdbs(env, 10);
83 if (rc != MDBX_SUCCESS) {
84 fprintf(stderr,
"mdbx_env_set_maxdbs: (%d) %s\n", rc, mdbx_strerror(rc));
89 rc = mdbx_env_open(env,
"./example-db", MDBX_NOSUBDIR, 0664);
90 if (rc != MDBX_SUCCESS) {
91 fprintf(stderr,
"mdbx_env_open: (%d) %s\n", rc, mdbx_strerror(rc));
96 rc = mdbx_txn_begin(env,
nullptr, MDBX_TXN_READWRITE, &txn);
97 if (rc != MDBX_SUCCESS) {
98 fprintf(stderr,
"mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
103 rc = mdbx_dbi_open(txn,
"temp", MDBX_DB_DEFAULTS | MDBX_CREATE, &dbi);
104 if (rc != MDBX_SUCCESS) {
105 fprintf(stderr,
"mdbx_dbi_open: (%d) %s\n", rc, mdbx_strerror(rc));
110 sprintf(skey,
"key");
111 sprintf(sval,
"value");
112 key.iov_len =
sizeof(
"key");
114 data.iov_len =
sizeof(sval);
115 data.iov_base = sval;
116 rc = mdbx_put(txn, dbi, &key, &data, MDBX_UPSERT);
117 if (rc != MDBX_SUCCESS) {
118 fprintf(stderr,
"mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc));
123 rc = mdbx_txn_commit(txn);
124 if (rc != MDBX_SUCCESS) {
125 fprintf(stderr,
"mdbx_txn_commit: (%d) %s\n", rc, mdbx_strerror(rc));
131 rc = mdbx_txn_begin(env,
nullptr, MDBX_TXN_RDONLY, &txn);
132 if (rc != MDBX_SUCCESS) {
133 fprintf(stderr,
"mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
138 rc = mdbx_cursor_open(txn, dbi, &cursor);
139 if (rc != MDBX_SUCCESS) {
140 fprintf(stderr,
"mdbx_cursor_open: (%d) %s\n", rc, mdbx_strerror(rc));
145 while ((rc = mdbx_cursor_get(cursor, &key, &data, MDBX_NEXT)) == MDBX_SUCCESS) {
146 printf(
"key: %.*s, data: %.*s\n",
147 (
int)key.iov_len, (
char *)key.iov_base,
148 (
int)data.iov_len, (
char *)data.iov_base);
150 if (rc != MDBX_NOTFOUND) {
151 fprintf(stderr,
"mdbx_cursor_get: (%d) %s\n", rc, mdbx_strerror(rc));
154 if (cursor) mdbx_cursor_close(cursor);
157 rc = mdbx_txn_abort(txn);
158 if (rc != MDBX_SUCCESS) {
159 fprintf(stderr,
"mdbx_txn_abort: (%d) %s\n", rc, mdbx_strerror(rc));
168 rc = mdbx_txn_begin(env,
nullptr, MDBX_TXN_READWRITE, &txn);
169 if (rc != MDBX_SUCCESS) {
170 fprintf(stderr,
"mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
175 rc = mdbx_dbi_open(txn,
"ticks", MDBX_DB_DEFAULTS | MDBX_INTEGERKEY | MDBX_CREATE, &dbi_ticks);
176 if (rc != MDBX_SUCCESS) {
177 fprintf(stderr,
"mdbx_dbi_open (ticks): (%d) %s\n", rc, mdbx_strerror(rc));
182 MDBX_val mdbx_key, mdbx_data;
183 mdbx_key.iov_base = &tick_key;
184 mdbx_key.iov_len =
sizeof(tick_key);
186 mdbx_data.iov_base = tick_data.data();
187 mdbx_data.iov_len = tick_data.size();
189 rc = mdbx_put(txn, dbi_ticks, &mdbx_key, &mdbx_data, MDBX_UPSERT);
190 if (rc != MDBX_SUCCESS) {
191 fprintf(stderr,
"mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc));
196 mdbx_key.iov_base = &tick_key;
197 mdbx_key.iov_len =
sizeof(tick_key);
200 rc = mdbx_put(txn, dbi_ticks, &mdbx_key, &mdbx_data, MDBX_UPSERT);
201 if (rc != MDBX_SUCCESS) {
202 fprintf(stderr,
"mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc));
207 rc = mdbx_txn_commit(txn);
208 if (rc != MDBX_SUCCESS) {
209 fprintf(stderr,
"mdbx_txn_commit: (%d) %s\n", rc, mdbx_strerror(rc));
215 rc = mdbx_txn_begin(env,
nullptr, MDBX_TXN_RDONLY, &txn);
216 if (rc != MDBX_SUCCESS) {
217 fprintf(stderr,
"mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
222 rc = mdbx_cursor_open(txn, dbi_ticks, &cursor);
223 if (rc != MDBX_SUCCESS) {
224 fprintf(stderr,
"mdbx_cursor_open: (%d) %s\n", rc, mdbx_strerror(rc));
229 while ((rc = mdbx_cursor_get(cursor, &key, &data, MDBX_NEXT)) == MDBX_SUCCESS) {
230 printf(
"key: %.*s, data: %.*s\n",
231 (
int)key.iov_len, (
char *)key.iov_base,
232 (
int)data.iov_len, (
char *)data.iov_base);
234 if (rc != MDBX_NOTFOUND) {
235 fprintf(stderr,
"mdbx_cursor_get: (%d) %s\n", rc, mdbx_strerror(rc));
240 rc = mdbx_txn_abort(txn);
241 if (rc != MDBX_SUCCESS) {
242 fprintf(stderr,
"mdbx_txn_abort: (%d) %s\n", rc, mdbx_strerror(rc));
253 mdbx_cursor_close(cursor);
259 return (rc != MDBX_SUCCESS) ? EXIT_FAILURE : EXIT_SUCCESS;