Swoole Table
内部结构还是比较复杂的,这里做一个记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| ┌───────────────────┐ │ GlobalMemory │──────────────────▶┌────────────────────────────────────────────┐ ┌───▶───────────────────────────────┐ └───────────────────┘ │ │ │ │ TableColumn │ │ │ │ │ │ │ │ │ ├───────────────────────────────┤ ┌───────────────────┐ │ │ │ │enum Type type - int, string...│ │ MemoryBlock │──────────────────▶├────────────────────────────────────────────┤ │ ├───────────────────────────────┤ ├───────────────────┤ │ │ │ │ uint32_t size │ │ uint32_t size │─────────────────▶ │ size of memory │ │ ├───────────────────────────────┤ ├───────────────────┤ │ │ │ │ std::string name │ │ char memory[0] │─────────┬────────▶├────────────────────────────────────────────┤ │ ├───────────────────────────────┤ └───────────────────┘ │ │ swoole::Table │ │ │ size_t index │ │ │ │ │ └───────────────────────────────┘ │ ├────────────────────────────────────────────┤ │ │ │ std::unordered_map *column_map │────┤ ┌───────────────────────────────┐ │ ├────────────────────────────────────────────┤ │ │ │ │ │ std::vector *column_list │────┘ │ memory_size = size * │ │ ├────────────────────────────────────────────┤ │ sizeof(TableRow *) │ │ │ size_t size - construct size │ │ │ │ ├────────────────────────────────────────────┤ │ memory_size += row_num * │ │ │ size_t memory_size │───────▶│(sizeof(TableRow) + item_size) │ │ ├────────────────────────────────────────────┤ │ │ │ │ size_t item_size - all column size of row │ │ │ │ ├────────────────────────────────────────────┤ │ │ │ │ sw_atomic_t row_num │ │ │ │ ├────────────────────────────────────────────┤ └───────────────────────────────┘ │ │ TableIterator *iterator │ │ ├────────────────────────────────────────────┤ │ │ Mutex *mutex │ │ ├────────────────────────────────────────────┤ │ │ void *memory - save the all rows │─────────▶───────────────────────────────┐ │ ├────────────────────────────────────────────┤ │ size * sizeof(TableRow *) │ │ │ TableRow **rows ├───┐ │ │ │ ├────────────────────────────────────────────┤ │ │ to foreach table │ │ │ │ │ ├───────────────────────────────┤ └─────────▶────────────────────────────────────────────┤ └────▶│ TableRow1 * │──┐ ┌─────────────────────────────────────────┐ │ │ ├───────────────────────────────┤ │ │ TableRow │ │ │ │ TableRow2 * │ │ │ │ │ │ ├───────────────────────────────┤ │ │ sw_atomic_t lock_ │ │ │ │ .... │ │ │ │ │ │ ├───────────────────────────────┤ │ │ uint8_t active - whether the row init │ │ │ │ row_num * (sizeof(TableRow) + │ │ │ │ │ │ │ item_size) │ │ │ uint8_t key_len │ │ │ │ │ │ │ │ │ │ ├───────────────────────────────┤ │ │ TableRow *next │ │ │ │ TableRow 1 │◀─┘ │ │ │ │ ├───────────────────────────────┤ │ char key[SW_TABLE_KEY_SIZE] │ │ │ │ TableRow 2 │ │ │ │ │ ├───────────────────────────────┤ │ char data[0] │ │ │ │ TableRow 3 │ │ │ │ │ ├───────────────────────────────┤ └─────────────────────────────────────────┘ │ │ │ TableRow ... │ │ │ └───────────────────────────────┘ │ │ └────────────────────────────────────────────┘
|