[Groonga-commit] groonga/grnxx [master] Add grnxx::Map::unlink().

Zurück zum Archiv-Index

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 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index