susumu.yata
null+****@clear*****
Mon Feb 18 17:35:54 JST 2013
susumu.yata 2013-02-18 17:35:54 +0900 (Mon, 18 Feb 2013) New Revision: 8d5bf2d2d6c87f0f7ef88dd30bbc968647dfac2e https://github.com/groonga/grnxx/commit/8d5bf2d2d6c87f0f7ef88dd30bbc968647dfac2e Log: Add grnxx::Map::unlink(). Modified files: lib/map.cpp lib/map.hpp lib/map/da/basic_trie.cpp lib/map/da/basic_trie.hpp lib/map/da/trie.cpp lib/map/da/trie.hpp lib/map/double_array.cpp lib/map/double_array.hpp Modified: lib/map.cpp (+27 -0) =================================================================== --- lib/map.cpp 2013-02-18 14:50:54 +0900 (b7ef7ea) +++ lib/map.cpp 2013-02-18 17:35:54 +0900 (8ccc714) @@ -72,4 +72,31 @@ Map *Map::open(io::Pool pool, uint32_t block_id) { return nullptr; } +void Map::unlink(io::Pool pool, uint32_t block_id) { + // Get the address to the header. + auto block_info = pool.get_block_info(block_id); + auto block_address = pool.get_block_address(*block_info); + auto header = static_cast<MapHeader *>(block_address); + + // Check the type. + MapType type = header->type; + + // Call the appropriate function. + switch (type) { + case MAP_UNKNOWN: { + break; + } + case MAP_DOUBLE_ARRAY: { + map::DoubleArray::unlink(pool, block_id); + return; + } + // TODO: Other map types will be supported in future. +// case ???: { +// return map::???::unlink(pool, block_id); +// } + } + + // TODO: Unknown type error! +} + } // namespace grnxx Modified: lib/map.hpp (+2 -0) =================================================================== --- lib/map.hpp 2013-02-18 14:50:54 +0900 (a326071) +++ lib/map.hpp 2013-02-18 17:35:54 +0900 (596a902) @@ -50,6 +50,8 @@ class Map { static Map *create(const MapOptions &options, io::Pool pool); static Map *open(io::Pool pool, uint32_t block_id); + static void unlink(io::Pool pool, uint32_t block_id); + virtual uint32_t block_id() const = 0; virtual bool search(int64_t key_id, Slice *key = nullptr) = 0; Modified: lib/map/da/basic_trie.cpp (+10 -0) =================================================================== --- lib/map/da/basic_trie.cpp 2013-02-18 14:50:54 +0900 (46aa092) +++ lib/map/da/basic_trie.cpp 2013-02-18 17:35:54 +0900 (d7e9014) @@ -74,6 +74,16 @@ Trie *Trie::open(io::Pool pool, uint32_t block_id) { return trie.release(); } +void Trie::unlink(io::Pool pool, uint32_t block_id) { + std::unique_ptr<Trie> trie(Trie::open(pool, block_id)); + + pool.free_block(trie->header_->nodes_block_id); + pool.free_block(trie->header_->chunks_block_id); + pool.free_block(trie->header_->entries_block_id); + pool.free_block(trie->header_->keys_block_id); + pool.free_block(*trie->block_info_); +} + Trie *Trie::defrag(const TrieOptions &options) { std::unique_ptr<Trie> trie(new (std::nothrow) Trie); if (!trie) { Modified: lib/map/da/basic_trie.hpp (+2 -0) =================================================================== --- lib/map/da/basic_trie.hpp 2013-02-18 14:50:54 +0900 (0554b7b) +++ lib/map/da/basic_trie.hpp 2013-02-18 17:35:54 +0900 (ea6a3bc) @@ -416,6 +416,8 @@ class Trie : public da::Trie { static Trie *create(const TrieOptions &options, io::Pool pool); static Trie *open(io::Pool pool, uint32_t block_id); + static void unlink(io::Pool pool, uint32_t block_id); + Trie *defrag(const TrieOptions &options); uint32_t block_id() const; Modified: lib/map/da/trie.cpp (+4 -0) =================================================================== --- lib/map/da/trie.cpp 2013-02-18 14:50:54 +0900 (401a3bf) +++ lib/map/da/trie.cpp 2013-02-18 17:35:54 +0900 (58dc441) @@ -21,6 +21,10 @@ Trie *Trie::open(io::Pool pool, uint32_t block_id) { return basic::Trie::open(pool, block_id); } +void Trie::unlink(io::Pool pool, uint32_t block_id) { + return basic::Trie::unlink(pool, block_id); +} + } // namespace da } // namespace map } // namespace grnxx Modified: lib/map/da/trie.hpp (+2 -0) =================================================================== --- lib/map/da/trie.hpp 2013-02-18 14:50:54 +0900 (2e1ba77) +++ lib/map/da/trie.hpp 2013-02-18 17:35:54 +0900 (9798805) @@ -56,6 +56,8 @@ class Trie { static Trie *create(const TrieOptions &options, io::Pool pool); static Trie *open(io::Pool pool, uint32_t block_id); + static void unlink(io::Pool pool, uint32_t block_id); + virtual Trie *defrag(const TrieOptions &options) = 0; virtual uint32_t block_id() const = 0; Modified: lib/map/double_array.cpp (+12 -0) =================================================================== --- lib/map/double_array.cpp 2013-02-18 14:50:54 +0900 (bb4e98c) +++ lib/map/double_array.cpp 2013-02-18 17:35:54 +0900 (882c466) @@ -53,6 +53,18 @@ DoubleArray *DoubleArray::open(io::Pool pool, uint32_t block_id) { return da.release(); } +void DoubleArray::unlink(io::Pool pool, uint32_t block_id) { + std::unique_ptr<DoubleArray> da(DoubleArray::open(pool, block_id)); + + if (da->header_->front_block_id != io::BLOCK_INVALID_ID) { + da::Trie::unlink(pool, da->header_->front_block_id); + } + if (da->header_->back_block_id != io::BLOCK_INVALID_ID) { + da::Trie::unlink(pool, da->header_->back_block_id); + } + pool.free_block(block_id); +} + uint32_t DoubleArray::block_id() const { return block_info_->id(); } Modified: lib/map/double_array.hpp (+2 -0) =================================================================== --- lib/map/double_array.hpp 2013-02-18 14:50:54 +0900 (631a93d) +++ lib/map/double_array.hpp 2013-02-18 17:35:54 +0900 (49038b8) @@ -39,6 +39,8 @@ class DoubleArray : public Map { static DoubleArray *create(const MapOptions &options, io::Pool pool); static DoubleArray *open(io::Pool pool, uint32_t block_id); + static void unlink(io::Pool pool, uint32_t block_id); + uint32_t block_id() const; bool search(int64_t key_id, Slice *key = nullptr); -------------- next part -------------- HTML����������������������������... Download