lmdb.vapi 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. /**
  2. * LMDB - Lightning Memory-Mapped Database bindings for Vala
  3. *
  4. * This VAPI provides bindings for the LMDB library,
  5. * a high-performance key-value store with ACID transactions.
  6. */
  7. [CCode (cprefix = "mdb_", lower_case_cprefix = "mdb_", cheader_filename = "lmdb.h")]
  8. namespace Lmdb {
  9. /**
  10. * Environment flags for mdb_env_open()
  11. */
  12. [CCode (cname = "unsigned int", has_type_id = false)]
  13. [Flags]
  14. public enum EnvFlags {
  15. [CCode (cname = "0")]
  16. NONE,
  17. [CCode (cname = "MDB_FIXEDMAP")]
  18. FIXEDMAP,
  19. [CCode (cname = "MDB_NOSUBDIR")]
  20. NOSUBDIR,
  21. [CCode (cname = "MDB_NOSYNC")]
  22. NOSYNC,
  23. [CCode (cname = "MDB_RDONLY")]
  24. RDONLY,
  25. [CCode (cname = "MDB_NOMETASYNC")]
  26. NOMETASYNC,
  27. [CCode (cname = "MDB_WRITEMAP")]
  28. WRITEMAP,
  29. [CCode (cname = "MDB_MAPASYNC")]
  30. MAPASYNC,
  31. [CCode (cname = "MDB_NOTLS")]
  32. NOTLS,
  33. [CCode (cname = "MDB_NOLOCK")]
  34. NOLOCK,
  35. [CCode (cname = "MDB_NORDAHEAD")]
  36. NORDAHEAD,
  37. [CCode (cname = "MDB_NOMEMINIT")]
  38. NOMEMINIT
  39. }
  40. /**
  41. * Transaction flags for mdb_txn_begin()
  42. */
  43. [CCode (cname = "unsigned int", has_type_id = false)]
  44. [Flags]
  45. public enum TxnFlags {
  46. [CCode (cname = "0")]
  47. NONE,
  48. [CCode (cname = "MDB_RDONLY")]
  49. RDONLY
  50. }
  51. /**
  52. * Database flags for mdb_dbi_open()
  53. */
  54. [CCode (cname = "unsigned int", has_type_id = false)]
  55. [Flags]
  56. public enum DbFlags {
  57. [CCode (cname = "0")]
  58. NONE,
  59. [CCode (cname = "MDB_REVERSEKEY")]
  60. REVERSEKEY,
  61. [CCode (cname = "MDB_DUPSORT")]
  62. DUPSORT,
  63. [CCode (cname = "MDB_INTEGERKEY")]
  64. INTEGERKEY,
  65. [CCode (cname = "MDB_DUPFIXED")]
  66. DUPFIXED,
  67. [CCode (cname = "MDB_INTEGERDUP")]
  68. INTEGERDUP,
  69. [CCode (cname = "MDB_REVERSEDUP")]
  70. REVERSEDUP,
  71. [CCode (cname = "MDB_CREATE")]
  72. CREATE
  73. }
  74. /**
  75. * Write flags for mdb_put()
  76. */
  77. [CCode (cname = "unsigned int", has_type_id = false)]
  78. [Flags]
  79. public enum WriteFlags {
  80. [CCode (cname = "0")]
  81. NONE,
  82. [CCode (cname = "MDB_NOOVERWRITE")]
  83. NOOVERWRITE,
  84. [CCode (cname = "MDB_NODUPDATA")]
  85. NODUPDATA,
  86. [CCode (cname = "MDB_CURRENT")]
  87. CURRENT,
  88. [CCode (cname = "MDB_RESERVE")]
  89. RESERVE,
  90. [CCode (cname = "MDB_APPEND")]
  91. APPEND,
  92. [CCode (cname = "MDB_APPENDDUP")]
  93. APPENDDUP,
  94. [CCode (cname = "MDB_MULTIPLE")]
  95. MULTIPLE
  96. }
  97. /**
  98. * Cursor operation codes for mdb_cursor_get()
  99. */
  100. [CCode (cname = "MDB_cursor_op", has_type_id = false)]
  101. public enum CursorOp {
  102. [CCode (cname = "MDB_FIRST")]
  103. FIRST,
  104. [CCode (cname = "MDB_FIRST_DUP")]
  105. FIRST_DUP,
  106. [CCode (cname = "MDB_GET_BOTH")]
  107. GET_BOTH,
  108. [CCode (cname = "MDB_GET_BOTH_RANGE")]
  109. GET_BOTH_RANGE,
  110. [CCode (cname = "MDB_GET_CURRENT")]
  111. GET_CURRENT,
  112. [CCode (cname = "MDB_GET_MULTIPLE")]
  113. GET_MULTIPLE,
  114. [CCode (cname = "MDB_LAST")]
  115. LAST,
  116. [CCode (cname = "MDB_LAST_DUP")]
  117. LAST_DUP,
  118. [CCode (cname = "MDB_NEXT")]
  119. NEXT,
  120. [CCode (cname = "MDB_NEXT_DUP")]
  121. NEXT_DUP,
  122. [CCode (cname = "MDB_NEXT_MULTIPLE")]
  123. NEXT_MULTIPLE,
  124. [CCode (cname = "MDB_NEXT_NODUP")]
  125. NEXT_NODUP,
  126. [CCode (cname = "MDB_PREV")]
  127. PREV,
  128. [CCode (cname = "MDB_PREV_DUP")]
  129. PREV_DUP,
  130. [CCode (cname = "MDB_PREV_NODUP")]
  131. PREV_NODUP,
  132. [CCode (cname = "MDB_SET")]
  133. SET,
  134. [CCode (cname = "MDB_SET_KEY")]
  135. SET_KEY,
  136. [CCode (cname = "MDB_SET_RANGE")]
  137. SET_RANGE,
  138. [CCode (cname = "MDB_PREV_MULTIPLE")]
  139. PREV_MULTIPLE
  140. }
  141. /**
  142. * LMDB error codes
  143. */
  144. [CCode (cname = "int", has_type_id = false)]
  145. public enum ErrorCode {
  146. [CCode (cname = "MDB_SUCCESS")]
  147. SUCCESS,
  148. [CCode (cname = "MDB_KEYEXIST")]
  149. KEYEXIST,
  150. [CCode (cname = "MDB_NOTFOUND")]
  151. NOTFOUND,
  152. [CCode (cname = "MDB_PAGE_NOTFOUND")]
  153. PAGE_NOTFOUND,
  154. [CCode (cname = "MDB_CORRUPTED")]
  155. CORRUPTED,
  156. [CCode (cname = "MDB_PANIC")]
  157. PANIC,
  158. [CCode (cname = "MDB_VERSION_MISMATCH")]
  159. VERSION_MISMATCH,
  160. [CCode (cname = "MDB_INVALID")]
  161. INVALID,
  162. [CCode (cname = "MDB_MAP_FULL")]
  163. MAP_FULL,
  164. [CCode (cname = "MDB_DBS_FULL")]
  165. DBS_FULL,
  166. [CCode (cname = "MDB_READERS_FULL")]
  167. READERS_FULL,
  168. [CCode (cname = "MDB_TLS_FULL")]
  169. TLS_FULL,
  170. [CCode (cname = "MDB_TXN_FULL")]
  171. TXN_FULL,
  172. [CCode (cname = "MDB_CURSOR_FULL")]
  173. CURSOR_FULL,
  174. [CCode (cname = "MDB_PAGE_FULL")]
  175. PAGE_FULL,
  176. [CCode (cname = "MDB_MAP_RESIZED")]
  177. MAP_RESIZED,
  178. [CCode (cname = "MDB_INCOMPATIBLE")]
  179. INCOMPATIBLE,
  180. [CCode (cname = "MDB_BAD_RSLOT")]
  181. BAD_RSLOT,
  182. [CCode (cname = "MDB_BAD_TXN")]
  183. BAD_TXN,
  184. [CCode (cname = "MDB_BAD_VALSIZE")]
  185. BAD_VALSIZE,
  186. [CCode (cname = "MDB_BAD_DBI")]
  187. BAD_DBI,
  188. [CCode (cname = "MDB_LAST_ERRCODE")]
  189. LAST_ERRCODE
  190. }
  191. /**
  192. * Key/value structure
  193. */
  194. [CCode (cname = "MDB_val", has_type_id = false)]
  195. public struct Val {
  196. public size_t mv_size;
  197. public void* mv_data;
  198. /**
  199. * Creates a Val from a string.
  200. */
  201. public static Val from_string(string str) {
  202. Val val = Val();
  203. val.mv_size = str.length;
  204. val.mv_data = (void*) str;
  205. return val;
  206. }
  207. /**
  208. * Creates a Val from binary data.
  209. */
  210. public static Val from_bytes(uint8[] data) {
  211. Val val = Val();
  212. val.mv_size = data.length;
  213. val.mv_data = (void*) data;
  214. return val;
  215. }
  216. /**
  217. * Gets the value as a string.
  218. * Creates a new string with proper null termination.
  219. */
  220. public string as_string() {
  221. if (mv_data == null || mv_size == 0) {
  222. return "";
  223. }
  224. // Create a new string with proper length and null termination
  225. // We allocate mv_size + 1 bytes and copy the data
  226. uint8[] data = new uint8[mv_size + 1];
  227. GLib.Memory.copy(data, mv_data, mv_size);
  228. data[mv_size] = 0; // null terminator
  229. return (string) data;
  230. }
  231. /**
  232. * Gets the value as a uint8 array.
  233. */
  234. public uint8[] as_bytes() {
  235. uint8[] data = new uint8[mv_size];
  236. GLib.Memory.copy(data, mv_data, mv_size);
  237. return data;
  238. }
  239. }
  240. // Database handle - just an unsigned int in C (MDB_dbi)
  241. // We use uint directly since it's a typedef for unsigned int
  242. /**
  243. * Environment handle - opaque pointer
  244. */
  245. [Compact]
  246. [CCode (cname = "MDB_env", free_function = "mdb_env_close")]
  247. public class Env {
  248. /**
  249. * Creates a new LMDB environment.
  250. *
  251. * @return 0 on success, error code on failure
  252. */
  253. [CCode (cname = "mdb_env_create")]
  254. public static int create(out Env env);
  255. /**
  256. * Opens an environment.
  257. *
  258. * @param path Directory path for the database files
  259. * @param flags Environment flags
  260. * @param mode File mode for created files
  261. * @return 0 on success, error code on failure
  262. */
  263. [CCode (cname = "mdb_env_open")]
  264. public int open(string path, uint flags, int mode);
  265. /**
  266. * Sets the size of the memory map.
  267. *
  268. * @param size Size in bytes
  269. * @return 0 on success, error code on failure
  270. */
  271. [CCode (cname = "mdb_env_set_mapsize")]
  272. public int set_mapsize(size_t size);
  273. /**
  274. * Sets the maximum number of databases.
  275. *
  276. * @param dbs Maximum number of databases
  277. * @return 0 on success, error code on failure
  278. */
  279. [CCode (cname = "mdb_env_set_maxdbs")]
  280. public int set_maxdbs(uint32 dbs);
  281. /**
  282. * Sets the maximum number of readers.
  283. *
  284. * @param readers Maximum number of readers
  285. * @return 0 on success, error code on failure
  286. */
  287. [CCode (cname = "mdb_env_set_maxreaders")]
  288. public int set_maxreaders(uint32 readers);
  289. /**
  290. * Flushes data buffers to disk.
  291. *
  292. * @param force If true, force a synchronous flush
  293. * @return 0 on success, error code on failure
  294. */
  295. [CCode (cname = "mdb_env_sync")]
  296. public int sync(bool force);
  297. }
  298. /**
  299. * Transaction handle - opaque pointer
  300. */
  301. [Compact]
  302. [CCode (cname = "MDB_txn", free_function = "")]
  303. public class Txn {
  304. /**
  305. * Begins a new transaction.
  306. *
  307. * @param env Environment handle
  308. * @param parent Parent transaction (null for none)
  309. * @param flags Transaction flags
  310. * @param txn Output transaction handle
  311. * @return 0 on success, error code on failure
  312. */
  313. [CCode (cname = "mdb_txn_begin")]
  314. public static int begin(Env env, Txn? parent, uint flags, out Txn txn);
  315. /**
  316. * Commits the transaction.
  317. *
  318. * @return 0 on success, error code on failure
  319. */
  320. [CCode (cname = "mdb_txn_commit")]
  321. public int commit();
  322. /**
  323. * Aborts the transaction.
  324. */
  325. [CCode (cname = "mdb_txn_abort")]
  326. public void abort();
  327. /**
  328. * Gets the environment for this transaction.
  329. *
  330. * @return Environment handle
  331. */
  332. [CCode (cname = "mdb_txn_env")]
  333. public unowned Env env();
  334. /**
  335. * Opens a database in the transaction.
  336. *
  337. * @param name Database name (null for default)
  338. * @param flags Database flags
  339. * @param dbi Output database handle
  340. * @return 0 on success, error code on failure
  341. */
  342. [CCode (cname = "mdb_dbi_open")]
  343. public int dbi_open(string? name, uint flags, out uint dbi);
  344. /**
  345. * Gets a value from the database.
  346. *
  347. * @param dbi Database handle
  348. * @param key Key to look up
  349. * @param data Output value
  350. * @return 0 on success, MDB_NOTFOUND if key not found
  351. */
  352. [CCode (cname = "mdb_get")]
  353. public int @get(uint dbi, Val* key, Val* data);
  354. /**
  355. * Puts a key-value pair into the database.
  356. *
  357. * @param dbi Database handle
  358. * @param key Key
  359. * @param data Value
  360. * @param flags Write flags
  361. * @return 0 on success, error code on failure
  362. */
  363. [CCode (cname = "mdb_put")]
  364. public int @put(uint dbi, Val* key, Val* data, uint flags);
  365. /**
  366. * Deletes a key from the database.
  367. *
  368. * @param dbi Database handle
  369. * @param key Key to delete
  370. * @param data Optional data to match (null for any)
  371. * @return 0 on success, MDB_NOTFOUND if key not found
  372. */
  373. [CCode (cname = "mdb_del")]
  374. public int del(uint dbi, Val* key, Val* data);
  375. }
  376. /**
  377. * Cursor handle - opaque pointer
  378. */
  379. [Compact]
  380. [CCode (cname = "MDB_cursor", free_function = "mdb_cursor_close")]
  381. public class Cursor {
  382. /**
  383. * Creates a new cursor.
  384. *
  385. * @param txn Transaction handle
  386. * @param dbi Database handle
  387. * @param cursor Output cursor handle
  388. * @return 0 on success, error code on failure
  389. */
  390. [CCode (cname = "mdb_cursor_open")]
  391. public static int open(Txn txn, uint dbi, out Cursor cursor);
  392. /**
  393. * Gets a key/value pair from the cursor.
  394. *
  395. * @param key Output key
  396. * @param data Output value
  397. * @param op Cursor operation
  398. * @return 0 on success, MDB_NOTFOUND if no more items
  399. */
  400. [CCode (cname = "mdb_cursor_get")]
  401. public int @get(Val* key, Val* data, CursorOp op);
  402. /**
  403. * Puts a key/value pair through the cursor.
  404. *
  405. * @param key Key
  406. * @param data Value
  407. * @param flags Write flags
  408. * @return 0 on success, error code on failure
  409. */
  410. [CCode (cname = "mdb_cursor_put")]
  411. public int @put(Val* key, Val* data, uint flags);
  412. /**
  413. * Deletes the current key/value pair.
  414. *
  415. * @param flags Delete flags
  416. * @return 0 on success, error code on failure
  417. */
  418. [CCode (cname = "mdb_cursor_del")]
  419. public int del(uint flags);
  420. /**
  421. * Gets the count of duplicates for the current key.
  422. *
  423. * @param countp Output count
  424. * @return 0 on success, error code on failure
  425. */
  426. [CCode (cname = "mdb_cursor_count")]
  427. public int count(out size_t countp);
  428. }
  429. /**
  430. * Gets a string describing an error code.
  431. *
  432. * @param err Error code
  433. * @return Error description string
  434. */
  435. [CCode (cname = "mdb_strerror")]
  436. public unowned string strerror(int err);
  437. /**
  438. * Gets the version of the LMDB library.
  439. *
  440. * @param major Output major version
  441. * @param minor Output minor version
  442. * @param patch Output patch version
  443. * @return Version string
  444. */
  445. [CCode (cname = "mdb_version")]
  446. public unowned string version(out int major, out int minor, out int patch);
  447. }