diff --git a/include/ircd/db/column.h b/include/ircd/db/column.h index 2630c7bde..a8ebd7356 100644 --- a/include/ircd/db/column.h +++ b/include/ircd/db/column.h @@ -64,6 +64,7 @@ namespace ircd::db void compact(column &, const std::pair &, const int &to_level = -1, const compactor & = {}); void compact(column &, const int &level = -1, const compactor & = {}); void sort(column &, const bool &blocking = false); + void drop(column &); // danger } /// Columns add the ability to run multiple LevelDB's in synchrony under the same diff --git a/ircd/db.cc b/ircd/db.cc index d2c26ef24..95c9a3c29 100644 --- a/ircd/db.cc +++ b/ircd/db.cc @@ -1331,14 +1331,32 @@ const noexcept void ircd::db::drop(database::column &c) { - const ctx::uninterruptible ui; if(!c.handle) return; + database &d(c); + const std::lock_guard lock{write_mutex}; + const ctx::uninterruptible::nothrow ui; + log::debug + { + log, "'%s':'%s' @%lu DROPPING COLUMN", + name(d), + name(c), + sequence(d) + }; + throw_on_error { c.d->d->DropColumnFamily(c.handle.get()) }; + + log::notice + { + log, "'%s':'%s' @%lu DROPPED COLUMN", + name(d), + name(c), + sequence(d) + }; } uint32_t @@ -7768,6 +7786,13 @@ ircd::db::files(const column &column) return ret; } +void +ircd::db::drop(column &column) +{ + database::column &c(column); + drop(c); +} + void ircd::db::sort(column &column, const bool &blocking) diff --git a/modules/console.cc b/modules/console.cc index da7f51e84..68d959884 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -2635,12 +2635,12 @@ try const auto dbname { - param.at(0) + param.at("dbname") }; const auto colname { - param.at(0) + param.at("column") }; auto &database @@ -2648,11 +2648,17 @@ try db::database::get(dbname) }; - throw error + db::column column { - "TODO: please implement." + database, colname }; + db::drop(column); + + out << "DROPPED COLUMN " << colname + << " FROM DATABASE " << dbname + << std::endl; + return true; } catch(const std::out_of_range &e)