| 451 | } |
| 452 | |
| 453 | Value encode(KeyValueRef kv) { |
| 454 | int keyCode = kv.key.size() * 2 + 12; |
| 455 | int valCode = kv.value.size() * 2 + 12; |
| 456 | int header_size = sqlite3VarintLen(keyCode) + sqlite3VarintLen(valCode); |
| 457 | int hh = sqlite3VarintLen(header_size); |
| 458 | header_size += hh; |
| 459 | if (hh < sqlite3VarintLen(header_size)) |
| 460 | header_size++; |
| 461 | int size = header_size + kv.key.size() + kv.value.size(); |
| 462 | |
| 463 | Value v; |
| 464 | uint8_t* d = new (v.arena()) uint8_t[size]; |
| 465 | ((ValueRef&)v) = KeyRef(d, size); |
| 466 | d += sqlite3PutVarint(d, header_size); |
| 467 | d += sqlite3PutVarint(d, keyCode); |
| 468 | d += sqlite3PutVarint(d, valCode); |
| 469 | memcpy(d, kv.key.begin(), kv.key.size()); |
| 470 | d += kv.key.size(); |
| 471 | memcpy(d, kv.value.begin(), kv.value.size()); |
| 472 | d += kv.value.size(); |
| 473 | ASSERT(d == v.begin() + size); |
| 474 | return v; |
| 475 | } |
| 476 | |
| 477 | // Fragments are encoded as (key, index, value) tuples |
| 478 | // An index of 0 indicates an unfragmented KV pair. |