Skip to content

Commit

Permalink
add -loglevel and -database
Browse files Browse the repository at this point in the history
  • Loading branch information
mattn committed Jan 25, 2024
1 parent 1db4f65 commit f7a91cb
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 55 deletions.
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@
[submodule "deps/gabime-spdlog"]
path = deps/gabime-spdlog
url = https://github.com/gabime/spdlog
[submodule "deps/taywee-args"]
path = deps/taywee-args
url = https://github.com/taywee/args
[submodule "deps/p-ranav-argparse"]
path = deps/p-ranav-argparse
url = https://github.com/p-ranav/argparse
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ include_directories(
${PROJECT_SOURCE_DIR}/deps/libuv-libuv/include
${PROJECT_SOURCE_DIR}/deps/bitcoin-core-libsecp256k1/include
${PROJECT_SOURCE_DIR}/deps/gabime-spdlog/include
${PROJECT_SOURCE_DIR}/deps/p-ranav-argparse/include
)

add_executable(cagliostr main.cxx records.cxx deps/matheus28-ws28/src/Server.cpp deps/matheus28-ws28/src/Client.cpp deps/matheus28-ws28/src/base64.cpp)
Expand Down
7 changes: 4 additions & 3 deletions cagliostr.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,10 @@ typedef struct subscriber_t {

extern sqlite3 *conn;

bool insert_record(event_t &);
bool send_records(ws28::Client *, std::string &, std::vector<filter_t> &, bool);
void relay_send(ws28::Client *, nlohmann::json &);
void storage_init(const std::string&);
bool insert_record(const event_t &);
bool send_records(ws28::Client *, const std::string &, const std::vector<filter_t> &, bool);
void relay_send(ws28::Client *, const nlohmann::json &);
bool delete_record_by_id(const std::string &);
bool delete_record_by_kind_and_pubkey(int, const std::string &);
bool delete_record_by_kind_and_pubkey_and_dtag(int, const std::string &, const std::vector<std::string>&);
Expand Down
2 changes: 2 additions & 0 deletions compile_flags.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@ deps/bitcoin-core-libsecp256k1/include
deps/libuv-libuv/include
-I
deps/gabime-spdlog/include
-I
deps/p-ranav-argparse/include
1 change: 1 addition & 0 deletions deps/p-ranav-argparse
Submodule p-ranav-argparse added at 69dabd
89 changes: 40 additions & 49 deletions main.cxx
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#include "cagliostr.hxx"
#include "spdlog/common.h"
#include "spdlog/spdlog.h"
#include <argparse/argparse.hpp>

// global variables
std::vector<subscriber_t> subscribers;
Expand All @@ -24,7 +27,7 @@ static inline std::vector<uint8_t> hex2bytes(const std::string &hex) {
return bytes;
}

void inline relay_send(ws28::Client *client, nlohmann::json &data) {
void relay_send(ws28::Client *client, const nlohmann::json &data) {
auto s = data.dump();
spdlog::debug("{} << {}", client->GetIP(), s);
client->Send(s.data(), s.size(), 1);
Expand Down Expand Up @@ -277,7 +280,7 @@ static void do_relay_event(ws28::Client *client, nlohmann::json &data) {
}
} else if (30000 <= ev.kind && ev.kind < 40000) {
std::string d;
for (const auto & tag : ev.tags) {
for (const auto &tag : ev.tags) {
if (tag.size() >= 2 && tag[0] == "d") {
delete_record_by_kind_and_pubkey_and_dtag(ev.kind, ev.pubkey, tag);
}
Expand Down Expand Up @@ -451,51 +454,6 @@ static void data_callback(ws28::Client *client, char *data, size_t len,
}
}

static void sqlite3_trace_callback(void * /*user_data*/,
const char *statement) {
spdlog::debug("{}", statement);
}

static void storage_init() {
spdlog::debug("initialize storage");

const char *dsn = getenv("DATABASE_URL");
if (dsn == nullptr) {
dsn = "./cagliostr.sqlite";
}
auto ret = sqlite3_open_v2(dsn, &conn,
SQLITE_OPEN_URI | SQLITE_OPEN_READWRITE |
SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX,
nullptr);
if (ret != SQLITE_OK) {
spdlog::error("{}", sqlite3_errmsg(conn));
exit(-1);
}
sqlite3_trace(conn, sqlite3_trace_callback, nullptr);

const auto sql = R"(
CREATE TABLE IF NOT EXISTS event (
id text NOT NULL,
pubkey text NOT NULL,
created_at integer NOT NULL,
kind integer NOT NULL,
tags jsonb NOT NULL,
content text NOT NULL,
sig text NOT NULL);
CREATE UNIQUE INDEX IF NOT EXISTS ididx ON event(id);
CREATE INDEX IF NOT EXISTS pubkeyprefix ON event(pubkey);
CREATE INDEX IF NOT EXISTS timeidx ON event(created_at DESC);
CREATE INDEX IF NOT EXISTS kindidx ON event(kind);
CREATE INDEX IF NOT EXISTS kindtimeidx ON event(kind,created_at DESC);
PRAGMA journal_mode = WAL;
)";
ret = sqlite3_exec(conn, sql, nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
spdlog::error("{}", sqlite3_errmsg(conn));
exit(-1);
}
}

static void signal_handler(uv_signal_t *req, int /*signum*/) {
uv_signal_stop(req);
spdlog::warn("!! SIGINT");
Expand All @@ -512,10 +470,43 @@ static void signal_handler(uv_signal_t *req, int /*signum*/) {
sqlite3_close_v2(conn);
}

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[]) {
using commandtype = std::function<void(
const std::string &, std::vector<std::string>::const_iterator,
std::vector<std::string>::const_iterator)>;

static std::string dsn() {
const char *dsn = getenv("DATABASE_URL");
if (dsn == nullptr) {
dsn = "./cagliostr.sqlite";
}
return dsn;
}

int main(int argc, char *argv[]) {
argparse::ArgumentParser program("cagliostr", VERSION);
try {
program.add_argument("-database")
.default_value(dsn())
.help("connection string")
.metavar("DATABASE")
.nargs(1);
program.add_argument("-loglevel")
.default_value("info")
.help("log level")
.metavar("LEVEL")
.nargs(1);
program.parse_args(argc, argv);
} catch (const std::exception &err) {
std::cerr << err.what() << std::endl;
std::cerr << program;
return 1;
}

spdlog::cfg::load_env_levels();

storage_init();
spdlog::set_level(
spdlog::level::from_str(program.get<std::string>("-loglevel")));
storage_init(program.get<std::string>("-database"));

loop = uv_default_loop();
auto server = ws28::Server{loop, nullptr};
Expand Down
47 changes: 44 additions & 3 deletions records.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ static std::string join(const std::vector<std::string> &v,
return s;
}

bool insert_record(event_t &ev) {
bool insert_record(const event_t &ev) {
const auto sql =
R"(INSERT INTO event (id, pubkey, created_at, kind, tags, content, sig) VALUES ($1, $2, $3, $4, $5, $6, $7))";
sqlite3_stmt *stmt = nullptr;
Expand Down Expand Up @@ -52,8 +52,8 @@ bool insert_record(event_t &ev) {
return true;
}

bool send_records(ws28::Client *client, std::string &sub,
std::vector<filter_t> &filters, bool do_count) {
bool send_records(ws28::Client *client, const std::string &sub,
const std::vector<filter_t> &filters, bool do_count) {
auto count = 0;
for (const auto &filter : filters) {
std::string sql;
Expand Down Expand Up @@ -295,3 +295,44 @@ bool delete_record_by_kind_and_pubkey_and_dtag(
sqlite3_finalize(stmt);
return true;
}

static void sqlite3_trace_callback(void * /*user_data*/,
const char *statement) {
spdlog::debug("{}", statement);
}

void storage_init(const std::string &dsn) {
spdlog::debug("initialize storage");

auto ret = sqlite3_open_v2(dsn.c_str(), &conn,
SQLITE_OPEN_URI | SQLITE_OPEN_READWRITE |
SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX,
nullptr);
if (ret != SQLITE_OK) {
spdlog::error("{}", sqlite3_errmsg(conn));
exit(-1);
}
sqlite3_trace(conn, sqlite3_trace_callback, nullptr);

const auto sql = R"(
CREATE TABLE IF NOT EXISTS event (
id text NOT NULL,
pubkey text NOT NULL,
created_at integer NOT NULL,
kind integer NOT NULL,
tags jsonb NOT NULL,
content text NOT NULL,
sig text NOT NULL);
CREATE UNIQUE INDEX IF NOT EXISTS ididx ON event(id);
CREATE INDEX IF NOT EXISTS pubkeyprefix ON event(pubkey);
CREATE INDEX IF NOT EXISTS timeidx ON event(created_at DESC);
CREATE INDEX IF NOT EXISTS kindidx ON event(kind);
CREATE INDEX IF NOT EXISTS kindtimeidx ON event(kind,created_at DESC);
PRAGMA journal_mode = WAL;
)";
ret = sqlite3_exec(conn, sql, nullptr, nullptr, nullptr);
if (ret != SQLITE_OK) {
spdlog::error("{}", sqlite3_errmsg(conn));
exit(-1);
}
}

0 comments on commit f7a91cb

Please sign in to comment.