0
0
Fork 0
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:
Jason Volk 2019-02-25 14:46:21 -08:00
parent 11766b3e04
commit 6f7fc0a837
3 changed files with 98 additions and 7 deletions

View file

@ -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 & = {});

View file

@ -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,

View file

@ -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)