From 17b5745a7d8f9946de51a0d30bf01f0e02b5e87c Mon Sep 17 00:00:00 2001
From: Dmitry Simonenko <pmwkaa@gmail.com>
Date: Thu, 3 Apr 2014 16:45:36 +0400
Subject: [PATCH] sophia-index: make DropIndex engine specific.

---
 src/box/alter.cc         |  6 +-----
 src/box/engine.h         |  4 ++++
 src/box/engine_memtx.cc  | 10 ++++++++++
 src/box/engine_memtx.h   |  1 +
 src/box/engine_sophia.cc |  6 ++++++
 src/box/engine_sophia.h  |  1 +
 test/box/sophia.result   |  2 +-
 test/box/sophia.test.lua |  2 +-
 8 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/box/alter.cc b/src/box/alter.cc
index f19e311d4c..aec77035a1 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -596,11 +596,7 @@ DropIndex::commit(struct alter_space *alter)
 	Index *pk = index_find(alter->old_space, 0);
 	if (pk == NULL)
 		return;
-	struct iterator *it = pk->position();
-	pk->initIterator(it, ITER_ALL, NULL, 0);
-	struct tuple *tuple;
-	while ((tuple = it->next(it)))
-		tuple_ref(tuple, -1);
+	alter->old_space->engine->factory->dropIndex(pk);
 }
 
 /** Change non-essential (no data change) properties of an index. */
diff --git a/src/box/engine.h b/src/box/engine.h
index e32203de8d..21c586c419 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -101,6 +101,10 @@ class EngineFactory: public Object {
 	 * space.
 	 */
 	virtual Index *createIndex(struct key_def*) = 0;
+	/*
+	 * Delete all tuples in the index on drop.
+	 */
+	virtual void dropIndex(Index*) = 0;
 	/**
 	 * Check a key definition for violation of
 	 * various limits.
diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc
index 4fe7c8d628..cb8fab1c7d 100644
--- a/src/box/engine_memtx.cc
+++ b/src/box/engine_memtx.cc
@@ -111,6 +111,16 @@ MemtxFactory::createIndex(struct key_def *key_def)
 	}
 }
 
+void
+MemtxFactory::dropIndex(Index *index)
+{
+	struct iterator *it = index->position();
+	index->initIterator(it, ITER_ALL, NULL, 0);
+	struct tuple *tuple;
+	while ((tuple = it->next(it)))
+		tuple_ref(tuple, -1);
+}
+
 void
 MemtxFactory::keydefCheck(struct key_def *key_def)
 {
diff --git a/src/box/engine_memtx.h b/src/box/engine_memtx.h
index 60f73a0593..e3ea0c0fa4 100644
--- a/src/box/engine_memtx.h
+++ b/src/box/engine_memtx.h
@@ -33,6 +33,7 @@ struct MemtxFactory: public EngineFactory {
 	MemtxFactory();
 	virtual Engine *open();
 	virtual Index *createIndex(struct key_def *key_def);
+	virtual void dropIndex(Index *index);
 	virtual void keydefCheck(struct key_def *key_def);
 	virtual void recoveryEvent(enum engine_recovery_event event);
 };
diff --git a/src/box/engine_sophia.cc b/src/box/engine_sophia.cc
index 1c28e62cab..3a06c76c05 100644
--- a/src/box/engine_sophia.cc
+++ b/src/box/engine_sophia.cc
@@ -134,6 +134,12 @@ SophiaFactory::createIndex(struct key_def *key_def)
 	}
 }
 
+void
+SophiaFactory::dropIndex(Index *index)
+{
+	(void)index;
+}
+
 void
 SophiaFactory::keydefCheck(struct key_def *key_def)
 {
diff --git a/src/box/engine_sophia.h b/src/box/engine_sophia.h
index 2432705e13..c4320ada45 100644
--- a/src/box/engine_sophia.h
+++ b/src/box/engine_sophia.h
@@ -34,6 +34,7 @@ struct SophiaFactory: public EngineFactory {
 	virtual void init();
 	virtual Engine *open();
 	virtual Index *createIndex(struct key_def *key_def);
+	virtual void dropIndex(Index *index);
 	virtual void keydefCheck(struct key_def *key_def);
 	virtual void txnFinish(struct txn *txn);
 	virtual void recoveryEvent(enum engine_recovery_event event);
diff --git a/test/box/sophia.result b/test/box/sophia.result
index e576f18229..7cae8cef6e 100644
--- a/test/box/sophia.result
+++ b/test/box/sophia.result
@@ -103,7 +103,7 @@ t
 space:drop()
 ---
 ...
-os.execute("rm -rf space0123")
+os.execute("rm -rf sophia")
 ---
 - 0
 ...
diff --git a/test/box/sophia.test.lua b/test/box/sophia.test.lua
index 7843558b3a..759fe750ab 100644
--- a/test/box/sophia.test.lua
+++ b/test/box/sophia.test.lua
@@ -24,4 +24,4 @@ for v=1, 10 do table.insert(t, space:get({v})) end
 t
 
 space:drop()
-os.execute("rm -rf space0123")
+os.execute("rm -rf sophia")
-- 
GitLab