From 2f7f62bdce168d225ddb1adc43a2a9bfebd89562 Mon Sep 17 00:00:00 2001 From: "Maarten L. Hekkelman" Date: Thu, 18 Dec 2025 14:58:22 +0100 Subject: [PATCH] Implemented drop table --- src/cql.cpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/cql.cpp b/src/cql.cpp index 4da871f..77a999a 100644 --- a/src/cql.cpp +++ b/src/cql.cpp @@ -145,6 +145,7 @@ struct connection_impl static int Create(sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlite3_vtab **ppVtab, char **pzErr); static int Connect(sqlite3 *db, void *pAux, int argc, const char *const *argv, sqlite3_vtab **ppVtab, char **pzErr); + static int Destroy(sqlite3_vtab *pVtab); static int Disconnect(sqlite3_vtab *pVtab); static int Open(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor); static int Close(sqlite3_vtab_cursor *cur); @@ -174,13 +175,13 @@ struct virtual_table { sqlite3_vtab base; category &m_cat; + datablock &m_db; std::stack m_rollback_buffer; }; struct virtual_cursor { sqlite3_vtab_cursor base; - category &m_cat; std::unique_ptr> m_result; conditional_iterator_proxy::iterator m_cur; @@ -192,7 +193,7 @@ sqlite3_module connection_impl::s_module{ /* xConnect */ Connect, /* xBestIndex */ BestIndex, /* xDisconnect */ Disconnect, - /* xDestroy */ Disconnect, + /* xDestroy */ Destroy, /* xOpen */ Open, /* xClose */ Close, /* xFilter */ Filter, @@ -298,7 +299,7 @@ int connection_impl::Connect(sqlite3 *db, int argc, const char *const *argv, sql items.emplace_back(std::format("'{}'", item)); } - auto vtab = std::make_unique(sqlite3_vtab{}, *cat); + auto vtab = std::make_unique(sqlite3_vtab{}, *cat, m_db); auto createStmt = std::format("CREATE TABLE {} ({})", cat->name(), join(items, ", ")); @@ -309,6 +310,19 @@ int connection_impl::Connect(sqlite3 *db, int argc, const char *const *argv, sql return rc; } +/* +** This method is used to drop tables. +*/ +int connection_impl::Destroy(sqlite3_vtab *pVtab) +{ + virtual_table *p = reinterpret_cast(pVtab); + + auto &db = p->m_db; + db.remove(p->m_cat); + delete p; + return SQLITE_OK; +} + /* ** This method is the destructor for connection_impl objects. */ @@ -324,9 +338,7 @@ int connection_impl::Disconnect(sqlite3_vtab *pVtab) */ int connection_impl::Open(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor) { - virtual_table *p = reinterpret_cast(pVtab); - - auto cursor = std::make_unique(sqlite3_vtab_cursor{}, p->m_cat); + auto cursor = std::make_unique(sqlite3_vtab_cursor{}); *ppCursor = reinterpret_cast(cursor.release()); return SQLITE_OK; } @@ -362,14 +374,16 @@ int connection_impl::Column( ) { auto pCur = reinterpret_cast(cur); + auto pVTab = reinterpret_cast(cur->pVtab); auto rh = *pCur->m_cur; auto item = rh[i]; + auto &cat = pVTab->m_cat; if (item.is_null() or item.is_unknown()) sqlite3_result_null(ctx); - else if (auto cv = pCur->m_cat.get_cat_validator(); cv != nullptr) + else if (auto cv = cat.get_cat_validator(); cv != nullptr) { - if (auto iv = cv->get_validator_for_item(pCur->m_cat.get_item_name(i)); + if (auto iv = cv->get_validator_for_item(cat.get_item_name(i)); iv != nullptr and iv->m_type->m_primitive_type == DDL_PrimitiveType::Numb) { if (iequals(iv->m_type->m_name, "int")) @@ -413,7 +427,8 @@ int connection_impl::Rowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) int connection_impl::Eof(sqlite3_vtab_cursor *cur) { auto pCur = reinterpret_cast(cur); - return pCur->m_cur == pCur->m_cat.end(); + auto pVTab = reinterpret_cast(cur->pVtab); + return pCur->m_cur == pVTab->m_cat.end(); } /* @@ -425,6 +440,8 @@ int connection_impl::Eof(sqlite3_vtab_cursor *cur) int connection_impl::Filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv) { auto pCur = reinterpret_cast(pVtabCursor); + auto pVTab = reinterpret_cast(pCur->base.pVtab); + auto &cat = pVTab->m_cat; pCur->m_result.reset(); @@ -493,7 +510,7 @@ int connection_impl::Filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const } } - pCur->m_result = std::make_unique>(pCur->m_cat.find(std::move(cond))); + pCur->m_result = std::make_unique>(cat.find(std::move(cond))); pCur->m_cur = pCur->m_result->begin(); } } @@ -506,7 +523,7 @@ int connection_impl::Filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const if (not pCur->m_result) { condition cond = all(); - pCur->m_result = std::make_unique>(pCur->m_cat.find(std::move(cond))); + pCur->m_result = std::make_unique>(cat.find(std::move(cond))); pCur->m_cur = pCur->m_result->begin(); }