mirror of
https://github.com/matrix-construct/construct
synced 2024-06-02 18:18:56 +02:00
ircd::db: Add interface to query size of key in column.
This commit is contained in:
parent
11766b3e04
commit
6f7fc0a837
|
@ -44,6 +44,10 @@ namespace ircd::db
|
|||
bool cached(column &, const string_view &key, const gopts & = {});
|
||||
void prefetch(column &, const string_view &key, const gopts & = {});
|
||||
|
||||
// [GET] Query space usage
|
||||
size_t bytes(column &, const std::pair<string_view, string_view> &range, const gopts & = {});
|
||||
size_t bytes_value(column &, const string_view &key, const gopts & = {});
|
||||
|
||||
// [GET] Convenience functions to copy data into your buffer.
|
||||
string_view read(column &, const string_view &key, const mutable_buffer &, const gopts & = {});
|
||||
std::string read(column &, const string_view &key, const gopts & = {});
|
||||
|
|
32
ircd/db.cc
32
ircd/db.cc
|
@ -5520,6 +5520,38 @@ ircd::db::write(column &column,
|
|||
};
|
||||
}
|
||||
|
||||
size_t
|
||||
ircd::db::bytes_value(column &column,
|
||||
const string_view &key,
|
||||
const gopts &gopts)
|
||||
{
|
||||
size_t ret{0};
|
||||
column(key, std::nothrow, gopts, [&ret]
|
||||
(const string_view &value)
|
||||
{
|
||||
ret = value.size();
|
||||
});
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t
|
||||
ircd::db::bytes(column &column,
|
||||
const std::pair<string_view, string_view> &key,
|
||||
const gopts &gopts)
|
||||
{
|
||||
database &d(column);
|
||||
database::column &c(column);
|
||||
const rocksdb::Range range[1]
|
||||
{
|
||||
{ slice(key.first), slice(key.second) }
|
||||
};
|
||||
|
||||
uint64_t ret[1] {0};
|
||||
d.d->GetApproximateSizes(c, range, 1, ret);
|
||||
return ret[0];
|
||||
}
|
||||
|
||||
void
|
||||
ircd::db::prefetch(column &column,
|
||||
const string_view &key,
|
||||
|
|
|
@ -3159,7 +3159,7 @@ try
|
|||
{
|
||||
const params param{line, " ",
|
||||
{
|
||||
"dbname", "column"
|
||||
"dbname", "column", "key"
|
||||
}};
|
||||
|
||||
auto &database
|
||||
|
@ -3167,7 +3167,7 @@ try
|
|||
db::database::get(param.at(0))
|
||||
};
|
||||
|
||||
if(!param[1] || param[1] == "*")
|
||||
if(!param["column"] || param["column"] == "*")
|
||||
{
|
||||
const auto bytes
|
||||
{
|
||||
|
@ -3178,6 +3178,61 @@ try
|
|||
return true;
|
||||
}
|
||||
|
||||
if(param["key"])
|
||||
{
|
||||
db::column column
|
||||
{
|
||||
database, param["column"]
|
||||
};
|
||||
|
||||
const bool is_integer_key
|
||||
{
|
||||
try_lex_cast<ulong>(param["key"])
|
||||
};
|
||||
|
||||
const uint64_t integer_key[2]
|
||||
{
|
||||
is_integer_key?
|
||||
lex_cast<ulong>(param["key"]):
|
||||
0UL,
|
||||
|
||||
integer_key[0] + 1
|
||||
};
|
||||
|
||||
const string_view key[2]
|
||||
{
|
||||
is_integer_key?
|
||||
byte_view<string_view>{integer_key[0]}:
|
||||
param["key"],
|
||||
|
||||
is_integer_key?
|
||||
byte_view<string_view>{integer_key[1]}:
|
||||
param["key"]
|
||||
};
|
||||
|
||||
const auto value
|
||||
{
|
||||
db::bytes_value(column, key[0])
|
||||
};
|
||||
|
||||
const auto value_compressed
|
||||
{
|
||||
db::bytes(column, {key[0], key[1]})
|
||||
};
|
||||
|
||||
out << param["column"]
|
||||
<< (is_integer_key? "[(binary)" : "[") << param["key"] << "] "
|
||||
<< ": " << value << " (uncompressed value)"
|
||||
<< std::endl;
|
||||
|
||||
out << param["column"]
|
||||
<< (is_integer_key? "[(binary)" : "[") << param["key"] << "] "
|
||||
<< ": " << value_compressed
|
||||
<< std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto query{[&out, &database]
|
||||
(const string_view &colname)
|
||||
{
|
||||
|
@ -3196,15 +3251,15 @@ try
|
|||
<< std::endl;
|
||||
}};
|
||||
|
||||
if(param[1] != "**")
|
||||
if(param["column"] == "**")
|
||||
{
|
||||
query(param.at(1));
|
||||
for(const auto &column : database.columns)
|
||||
query(name(*column));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
for(const auto &column : database.columns)
|
||||
query(name(*column));
|
||||
|
||||
query(param["column"]);
|
||||
return true;
|
||||
}
|
||||
catch(const std::out_of_range &e)
|
||||
|
|
Loading…
Reference in a new issue