Skip to content

linux-devops/db

 
 

Repository files navigation

A New DBM in Pure C

PS:目测比较屌,学学

Demo

db_t db;
db_option_t option;

option.table  = 256;	/* table number,keep this small if data not too much */
option.bucket = 256;    /* initialize bucket number in per table,will incrase when key add */
option.rdonly = 0;
if (db_open(&db, /* data file */ "foo.db", /* index file */ "foo.db", &option) != DB_OK) {
        fprintf(stderr, "open db failed\n");
        return 0;
}

if (db_put(&db, "hi", strlen(...), "hello,world", strlen(...)) != DB_OK) {
        fprintf(stderr, "NOT OK\n");
}

if ((len = db_get(&db, "hi", strlen(...), val, sizeof(val))) == 0) {
        fprintf(stderr, "NOT FOUND\n");
}

db_close(&db);

Limited

In 32 bit platform database file size is limited 4GiB*

Key/Value length is 32 bit unsigned int

*Depends Your Operation System,Mostly can't get 4GiB map

Design

            +----------+
            |          |
            |  header  |
            |          |
            +----------+
            | table[0] |---------+
            +----------+         |
            | table[1] |------------+
            +----------+         |  |
            | table[2] |         |  |
            +----------+         |  |
            |    .     |         |  |
            |    .     |         |  |
            |    .     |         |  |
            +----------+         |  |
            | table[N] |         |  |
            +----------+         |  |
      +-----| bucket[0]|<--------|  |
      |     +----------+            |
      |     | bucket[1]|            |
      |     +----------+            |
   +--------| bucket[2]|            |
   |  |     +----------+            |
   |  |     |    .     |            |
   |  |     |    .     |<-----------+
   |  |     |    .     |
   |  |     +----------+
   |  |     | bucket[N]|
   |  |     +----------+
   |  +---->|   klen   |
   |        +----------+
   |        |   vlen   |
   |        +----------+
   |        |    .     |
   |        |   klen   |
   |        |  bytes   |
   |        |    .     |
   |        +----------+
   |        |    .     |
   |        |   vlen   |
   |        |  bytes   |
   |        |    .     |
   |        +----------+
   +------->|   klen   |
            +----------+
            |   vlen   |
            +----------+
            |    .     |
            |   klen   |
            |  bytes   |
            |    .     |
            +----------+
            |    .     |
            |   vlen   |
            |  bytes   |
            |    .     |
            +----------+
            |    .     |
            |    .     |
            |    .     |
            +----------+

Goal

Keep it simple, stupid

Next Release will has Dynamic Hash Implementation* And Mmap Maybe not required.

*Litwin, Witold (1980), "Linear hashing: A new tool for file and table addressing"

FAQ

Q: Do you use mmap? What if I don't want use mmap? A: Yes.Just use others,there is a lot of key/value database you can choose.

Q: I tried this library,It's waste to much disk space and memory! A: I'll write compaction function later,will reduce disk space in high update application,you can use db-export and db-import to a new database file.The future compaction function will do same thing.Memory is control by the kernel,Sorry.

Q: Compression? A: Maybe.

Q: Encryption? A: Maybe.

Q: I use this in my Web Server,I have a problem! A: Please contact the author.

Q: I use this in my Mobile Phone,I have a problem! A: Please contact the author.

Q: I want do X,Will be OK? A: Just try.If don't,Please contact the author.

Q: I have a problem! A: Please contact the author.

License

Public Domain License

Releases

No releases published

Packages

No packages published

Languages

  • C 95.3%
  • Makefile 2.8%
  • Python 1.9%