From 1970f3f824bb69e6a085899b58590425e6cb13b5 Mon Sep 17 00:00:00 2001 From: qing <1776177662@qq.com> Date: Thu, 6 Aug 2026 17:40:07 +0000 Subject: [PATCH] =?UTF-8?q?feat(db2):=20C++20=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=20RPC=20=E6=9C=8D=E5=8A=A1=EF=BC=8C=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=20Python=20db=20=E6=A8=A1=E5=9D=97=20execute=20=E8=B7=AF?= =?UTF-8?q?=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 完整实现 execute 路由(select/insert/update/delete) - 相同 where 语法(eq/ne/gt/lt/ge/le/like/in)及响应格式 - 启动时从 confs 拉取 db.ini,支持环境变量和命令行覆盖 - per-thread SQLite 连接 + WAL/mmap/busy_timeout PRAGMA - PRAGMA table_info 驱动的列类型反射与缓存 - $now 哨兵值自动替换为 UTC 时间 - 内置 Logs 表自动建表 + 后台清理线程(retention_days + max_records) - 表名白名单校验防 SQL 注入 - gateway DbC::call_msg() 零改动可直接切换 --- db2/Makefile | 22 + db2/_run.sh | 4 + db2/_set.sh | 4 + db2/build/db2 | Bin 0 -> 347896 bytes db2/docker-entrypoint.sh | 48 +++ db2/src/db2.cpp | 850 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 928 insertions(+) create mode 100644 db2/Makefile create mode 100755 db2/_run.sh create mode 100755 db2/_set.sh create mode 100755 db2/build/db2 create mode 100755 db2/docker-entrypoint.sh create mode 100644 db2/src/db2.cpp diff --git a/db2/Makefile b/db2/Makefile new file mode 100644 index 0000000..1edd04d --- /dev/null +++ b/db2/Makefile @@ -0,0 +1,22 @@ +CPP = g++ +CPPFLAGS = -std=c++20 -O3 -Wall -Werror -pipe +INCS = -I ../libmsg/inc +LIBS = -L ../libmsg/build -lus_msg -lboost_json -lsqlite3 +RPATH = -Wl,-rpath,'$$ORIGIN/../../libmsg/build' + +BUILD = build +TARGET = $(BUILD)/db2 +SRC = src/db2.cpp + +all: $(TARGET) + +$(BUILD): + mkdir -p $(BUILD) + +$(TARGET): $(SRC) | $(BUILD) + $(CPP) $(CPPFLAGS) $(INCS) -o $@ $< $(LIBS) $(RPATH) + +clean: + rm -f $(TARGET) + +.PHONY: all clean diff --git a/db2/_run.sh b/db2/_run.sh new file mode 100755 index 0000000..4974bb4 --- /dev/null +++ b/db2/_run.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" +exec ./build/db2 "$@" diff --git a/db2/_set.sh b/db2/_set.sh new file mode 100755 index 0000000..d716258 --- /dev/null +++ b/db2/_set.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" +make diff --git a/db2/build/db2 b/db2/build/db2 new file mode 100755 index 0000000000000000000000000000000000000000..677e2681b653c768f8cb30aebf27e5f29d2822ea GIT binary patch literal 347896 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 +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace json = boost::json; +using namespace pmc::net; + +// ============================================================================ +// 全局常量 +// ============================================================================ + +static constexpr size_t kMaxMessage = 8192; +static constexpr size_t kMaxExtra = 4096; + +// ============================================================================ +// 工具:当前 UTC 时间 ISO 8601 +// ============================================================================ + +static std::string utc_now() { + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + char buf[32]; + std::strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", std::gmtime(&t)); + return buf; +} + +// ============================================================================ +// 工具:简单 INI 解析(白名单模式) +// ============================================================================ + +using IniMap = std::map>; + +static IniMap parse_ini(const std::string& text) { + IniMap result; + std::string section; + std::istringstream ss(text); + std::string line; + while (std::getline(ss, line)) { + // 去首尾空白 + auto b = line.find_first_not_of(" \t\r\n"); + if (b == std::string::npos) continue; + line = line.substr(b); + auto e = line.find_last_not_of(" \t\r\n"); + if (e != std::string::npos) line = line.substr(0, e + 1); + + if (line.empty() || line[0] == '#' || line[0] == ';') continue; + if (line.front() == '[' && line.back() == ']') { + section = line.substr(1, line.size() - 2); + continue; + } + auto eq = line.find('='); + if (eq == std::string::npos || section.empty()) continue; + std::string key = line.substr(0, eq); + std::string val = line.substr(eq + 1); + // 去 key/val 空白 + auto trim = [](std::string& s) { + auto bb = s.find_first_not_of(" \t"); + auto ee = s.find_last_not_of(" \t"); + s = (bb == std::string::npos) ? "" : s.substr(bb, ee - bb + 1); + }; + trim(key); trim(val); + result[section][key] = val; + } + return result; +} + +// ============================================================================ +// 配置 +// ============================================================================ + +struct Config { + std::string listen_host = "127.0.0.1"; + int listen_port = 8005; + int workers = 4; + std::string db_url = "sqlite:///database.db"; + + // 日志清理 + int retention_days = 30; + int max_records = 1000000; + int cleanup_interval = 3600; + + // confs 地址(引导配置,不从 confs 自身获取) + std::string confs_host = "127.0.0.1"; + int confs_port = 8010; +}; + +// 从 sqlite:///path 或 sqlite:////abs/path 提取文件路径 +static std::string db_url_to_path(const std::string& url) { + const std::string prefix = "sqlite:///"; + if (url.rfind(prefix, 0) == 0) { + return url.substr(prefix.size()); + } + return url; // 非 sqlite URL,原样返回(暂不支持其他后端) +} + +static Config load_config(int argc, char* argv[]) { + Config cfg; + + // 1. 从环境变量读取 confs 引导地址 + if (const char* h = std::getenv("CONFS_HOST")) cfg.confs_host = h; + if (const char* p = std::getenv("CONFS_PORT")) cfg.confs_port = std::stoi(p); + + // 2. 从 confs 服务拉取 db.ini(retry_on_refused=true,等待 confs 就绪) + std::string ini_text; + try { + RpcClient confs_client(cfg.confs_host, cfg.confs_port, "db2", + /*timeout=*/5.0, /*retry_on_refused=*/true); + json::value data = confs_client.call("get", {{"name", "db.ini"}}); + if (data.is_object() && data.as_object().contains("content")) { + ini_text = std::string(data.as_object().at("content").as_string()); + } + } catch (const std::exception& e) { + std::fprintf(stderr, "[db2] Failed to fetch db.ini from confs: %s\n", e.what()); + std::exit(1); + } + + // 3. 解析 INI(白名单字段) + IniMap ini = parse_ini(ini_text); + auto get = [&](const std::string& sec, const std::string& key, + const std::string& def = "") -> std::string { + auto si = ini.find(sec); + if (si == ini.end()) return def; + auto ki = si->second.find(key); + return (ki == si->second.end()) ? def : ki->second; + }; + + cfg.listen_host = get("server", "host", cfg.listen_host); + cfg.listen_port = std::stoi(get("server", "port", std::to_string(cfg.listen_port))); + cfg.workers = std::stoi(get("server", "workers",std::to_string(cfg.workers))); + cfg.db_url = get("database", "url", cfg.db_url); + cfg.retention_days = std::stoi(get("logs", "retention_days", std::to_string(cfg.retention_days))); + cfg.max_records = std::stoi(get("logs", "max_records", std::to_string(cfg.max_records))); + cfg.cleanup_interval = std::stoi(get("logs", "cleanup_interval", std::to_string(cfg.cleanup_interval))); + + // 4. 环境变量最高优先级覆盖(Docker 兼容) + if (const char* v = std::getenv("LISTEN_ADDR")) cfg.listen_host = v; + if (const char* v = std::getenv("LISTEN_PORT")) cfg.listen_port = std::stoi(v); + if (const char* v = std::getenv("WORKERS")) cfg.workers = std::stoi(v); + if (const char* v = std::getenv("DATABASE_URL")) cfg.db_url = v; + + // 5. 命令行参数(最高优先级) + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if ((arg == "--addr" || arg == "-a") && i + 1 < argc) cfg.listen_host = argv[++i]; + else if ((arg == "--port" || arg == "-p") && i + 1 < argc) cfg.listen_port = std::stoi(argv[++i]); + else if ((arg == "--workers" || arg == "-w") && i + 1 < argc) cfg.workers = std::stoi(argv[++i]); + } + + return cfg; +} + +// ============================================================================ +// SQLite 连接(per-thread) +// ============================================================================ + +class DbConn { +public: + explicit DbConn(const std::string& path) { + if (sqlite3_open(path.c_str(), &_db) != SQLITE_OK) { + std::string err = sqlite3_errmsg(_db); + sqlite3_close(_db); + _db = nullptr; + throw std::runtime_error("sqlite3_open failed: " + err); + } + _exec_pragma("PRAGMA journal_mode=WAL"); + _exec_pragma("PRAGMA synchronous=NORMAL"); + _exec_pragma("PRAGMA foreign_keys=ON"); + _exec_pragma("PRAGMA busy_timeout=5000"); + _exec_pragma("PRAGMA mmap_size=268435456"); + } + + ~DbConn() { + if (_db) { sqlite3_close(_db); _db = nullptr; } + } + + sqlite3* get() const { return _db; } + + // 执行无结果集 SQL(建表、PRAGMA 等) + void exec(const std::string& sql) { + char* errmsg = nullptr; + int rc = sqlite3_exec(_db, sql.c_str(), nullptr, nullptr, &errmsg); + if (rc != SQLITE_OK) { + std::string err = errmsg ? errmsg : "unknown"; + sqlite3_free(errmsg); + throw std::runtime_error("sqlite3_exec failed: " + err); + } + } + + DbConn(const DbConn&) = delete; + DbConn& operator=(const DbConn&) = delete; + +private: + sqlite3* _db = nullptr; + + void _exec_pragma(const std::string& sql) { + char* errmsg = nullptr; + sqlite3_exec(_db, sql.c_str(), nullptr, nullptr, &errmsg); + if (errmsg) sqlite3_free(errmsg); + } +}; + +// ============================================================================ +// 列元信息(来自 PRAGMA table_info) +// ============================================================================ + +struct ColInfo { + std::string name; + std::string type; // 原始类型字符串,大写,如 "DATETIME" "TEXT" "INTEGER" +}; + +// ============================================================================ +// DB2Server +// ============================================================================ + +class DB2Server { +public: + explicit DB2Server(const Config& cfg) + : _cfg(cfg), _db_path(db_url_to_path(cfg.db_url)) {} + + void start() { + // 用主线程连接初始化 schema + { + DbConn conn(_db_path); + _ensure_logs_table(conn); + } + + _log_internal("INFO", "db2", "db2 starting on " + + _cfg.listen_host + ":" + std::to_string(_cfg.listen_port) + + ", db=" + _db_path, "", ""); + + // 启动后台清理线程 + _cleanup_running = true; + _cleanup_thread = std::thread(&DB2Server::_cleanup_loop, this); + + // 启动 RPC 服务 + MsgServerConfig srv_cfg; + srv_cfg.workers = _cfg.workers; + + RpcServer rpc(_cfg.listen_host, _cfg.listen_port, srv_cfg, + [this](const std::string& route, const std::exception& e) { + std::fprintf(stderr, "[db2] handler error route=%s: %s\n", + route.c_str(), e.what()); + }); + + rpc.add_route("execute", [this](const json::object& req) -> json::value { + return _handle_execute(req); + }); + + rpc.start(); + + // rpc.start() 返回后停止清理线程 + _cleanup_running = false; + _cleanup_cv.notify_all(); + if (_cleanup_thread.joinable()) _cleanup_thread.join(); + } + +private: + const Config& _cfg; + std::string _db_path; + + // 表列信息缓存 + std::mutex _schema_mtx; + std::unordered_map> _schema_cache; + + // 后台清理线程 + std::atomic _cleanup_running{false}; + std::thread _cleanup_thread; + std::mutex _cleanup_mtx; + std::condition_variable _cleanup_cv; + + // ---- per-thread SQLite 连接 ----------------------------------------------- + + DbConn& _get_conn() { + thread_local std::unique_ptr conn; + if (!conn) conn = std::make_unique(_db_path); + return *conn; + } + + // ---- 列 schema 反射 -------------------------------------------------------- + + std::vector _get_schema(const std::string& table) { + { + std::lock_guard lk(_schema_mtx); + auto it = _schema_cache.find(table); + if (it != _schema_cache.end()) return it->second; + } + + // PRAGMA table_info 返回: cid, name, type, notnull, dflt_value, pk + DbConn& conn = _get_conn(); + std::string sql = "PRAGMA table_info(" + table + ")"; + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + throw std::runtime_error("PRAGMA table_info failed for: " + table); + } + + std::vector cols; + while (sqlite3_step(stmt) == SQLITE_ROW) { + ColInfo ci; + const char* name = reinterpret_cast(sqlite3_column_text(stmt, 1)); + const char* type = reinterpret_cast(sqlite3_column_text(stmt, 2)); + ci.name = name ? name : ""; + ci.type = type ? type : ""; + // 统一大写便于比较 + std::transform(ci.type.begin(), ci.type.end(), ci.type.begin(), ::toupper); + cols.push_back(ci); + } + sqlite3_finalize(stmt); + + if (cols.empty()) { + throw std::runtime_error("table not found: " + table); + } + + std::lock_guard lk(_schema_mtx); + _schema_cache[table] = cols; + return cols; + } + + // 判断列是否为日期时间类型 + static bool _is_datetime_col(const ColInfo& ci) { + // 按类型字符串 + if (ci.type.find("DATETIME") != std::string::npos) return true; + if (ci.type.find("DATE") != std::string::npos) return true; + if (ci.type.find("TIME") != std::string::npos) return true; + // 按列名约定 + std::string n = ci.name; + std::transform(n.begin(), n.end(), n.begin(), ::tolower); + return n.find("_at") != std::string::npos + || n.find("time") != std::string::npos + || n.find("date") != std::string::npos; + } + + // 将 JSON 值转换为 SQLite 绑定字符串($now 替换为 UTC 时间) + static std::string _coerce_value(const ColInfo& ci, const json::value& jv) { + if (jv.is_string()) { + std::string s(jv.as_string()); + if (_is_datetime_col(ci) && s == "$now") return utc_now(); + return s; + } + if (jv.is_int64()) return std::to_string(jv.as_int64()); + if (jv.is_uint64()) return std::to_string(jv.as_uint64()); + if (jv.is_double()) return std::to_string(jv.as_double()); + if (jv.is_bool()) return jv.as_bool() ? "1" : "0"; + if (jv.is_null()) return ""; // 绑定 NULL + return json::serialize(jv); + } + + // ---- WHERE 子句构建 -------------------------------------------------------- + + struct WhereClause { + std::string sql; // "col1 = ? AND col2 > ?" + std::vector params; // 绑定参数值(顺序对应 ?) + std::vector is_null; // 对应参数是否绑定 NULL + }; + + WhereClause _build_where(const json::object& where, + const std::vector& cols) { + WhereClause wc; + std::vector parts; + + // 建立列名 -> ColInfo 映射 + std::unordered_map col_map; + for (auto& c : cols) col_map[c.name] = c; + + for (auto& [key, val] : where) { + std::string col(key); + ColInfo ci; + auto it = col_map.find(col); + if (it != col_map.end()) ci = it->second; + else { ci.name = col; ci.type = "TEXT"; } + + if (val.is_object()) { + // {"op": value} 形式 + for (auto& [op_key, op_val] : val.as_object()) { + std::string op(op_key); + if (op == "eq") { + parts.push_back(col + " = ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(op_val.is_null()); + } else if (op == "ne") { + parts.push_back(col + " != ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(op_val.is_null()); + } else if (op == "gt") { + parts.push_back(col + " > ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(false); + } else if (op == "lt") { + parts.push_back(col + " < ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(false); + } else if (op == "ge") { + parts.push_back(col + " >= ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(false); + } else if (op == "le") { + parts.push_back(col + " <= ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(false); + } else if (op == "like") { + parts.push_back(col + " LIKE ?"); + wc.params.push_back(_coerce_value(ci, op_val)); + wc.is_null.push_back(false); + } else if (op == "in") { + if (!op_val.is_array() || op_val.as_array().empty()) continue; + std::string placeholders; + for (auto& item : op_val.as_array()) { + if (!placeholders.empty()) placeholders += ", "; + placeholders += "?"; + wc.params.push_back(_coerce_value(ci, item)); + wc.is_null.push_back(item.is_null()); + } + parts.push_back(col + " IN (" + placeholders + ")"); + } + } + } else { + // 直接等于 + parts.push_back(col + " = ?"); + wc.params.push_back(_coerce_value(ci, val)); + wc.is_null.push_back(val.is_null()); + } + } + + for (size_t i = 0; i < parts.size(); ++i) { + if (i > 0) wc.sql += " AND "; + wc.sql += parts[i]; + } + return wc; + } + + // ---- 参数绑定辅助 ---------------------------------------------------------- + + static void _bind_params(sqlite3_stmt* stmt, int start_idx, + const std::vector& params, + const std::vector& is_null) { + for (size_t i = 0; i < params.size(); ++i) { + int idx = start_idx + static_cast(i); + if (is_null[i]) { + sqlite3_bind_null(stmt, idx); + } else { + sqlite3_bind_text(stmt, idx, params[i].c_str(), -1, SQLITE_TRANSIENT); + } + } + } + + // ---- execute 路由 ---------------------------------------------------------- + + json::value _handle_execute(const json::object& req) { + // 提取公共字段 + std::string action = "select"; + if (auto it = req.find("action"); it != req.end() && it->value().is_string()) + action = std::string(it->value().as_string()); + + if (!req.contains("table") || !req.at("table").is_string()) + throw std::runtime_error("missing required field: table"); + std::string table(req.at("table").as_string()); + + // 验证表名(仅允许字母数字下划线,防止 SQL 注入) + for (char c : table) { + if (!std::isalnum(static_cast(c)) && c != '_') + throw std::runtime_error("invalid table name: " + table); + } + + std::vector cols = _get_schema(table); + + if (action == "select") return _do_select(req, table, cols); + if (action == "insert") return _do_insert(req, table, cols); + if (action == "update") return _do_update(req, table, cols); + if (action == "delete") return _do_delete(req, table, cols); + throw std::runtime_error("unknown action: " + action); + } + + // ---- SELECT ---------------------------------------------------------------- + + json::value _do_select(const json::object& req, + const std::string& table, + const std::vector& cols) { + DbConn& conn = _get_conn(); + + // columns + std::string col_expr = "*"; + if (auto it = req.find("columns"); + it != req.end() && it->value().is_array() && !it->value().as_array().empty()) { + col_expr.clear(); + for (auto& c : it->value().as_array()) { + if (!col_expr.empty()) col_expr += ", "; + col_expr += std::string(c.as_string()); + } + } + + std::string sql = "SELECT " + col_expr + " FROM " + table; + WhereClause wc; + + if (auto it = req.find("where"); it != req.end() && it->value().is_object()) + wc = _build_where(it->value().as_object(), cols); + if (!wc.sql.empty()) sql += " WHERE " + wc.sql; + + // order_by + if (auto it = req.find("order_by"); + it != req.end() && it->value().is_array()) { + std::string order; + for (auto& ob : it->value().as_array()) { + if (!ob.is_object()) continue; + auto& o = ob.as_object(); + if (!o.contains("column")) continue; + if (!order.empty()) order += ", "; + order += std::string(o.at("column").as_string()); + if (o.contains("desc") && o.at("desc").as_bool()) order += " DESC"; + } + if (!order.empty()) sql += " ORDER BY " + order; + } + + // limit / offset + if (auto it = req.find("limit"); it != req.end() && it->value().is_int64()) + sql += " LIMIT " + std::to_string(it->value().as_int64()); + if (auto it = req.find("offset"); it != req.end() && it->value().is_int64()) + sql += " OFFSET " + std::to_string(it->value().as_int64()); + + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + throw std::runtime_error(std::string("prepare failed: ") + sqlite3_errmsg(conn.get())); + } + _bind_params(stmt, 1, wc.params, wc.is_null); + + // 获取结果列名(可能是 * 展开后的实际列名) + int ncols = sqlite3_column_count(stmt); + std::vector result_cols; + result_cols.reserve(ncols); + for (int i = 0; i < ncols; ++i) { + const char* n = sqlite3_column_name(stmt, i); + result_cols.push_back(n ? n : ""); + } + + json::array rows; + while (sqlite3_step(stmt) == SQLITE_ROW) { + json::object row; + for (int i = 0; i < ncols; ++i) { + int ctype = sqlite3_column_type(stmt, i); + if (ctype == SQLITE_NULL) { + row[result_cols[i]] = nullptr; + } else if (ctype == SQLITE_INTEGER) { + row[result_cols[i]] = sqlite3_column_int64(stmt, i); + } else if (ctype == SQLITE_FLOAT) { + row[result_cols[i]] = sqlite3_column_double(stmt, i); + } else { + const unsigned char* txt = sqlite3_column_text(stmt, i); + row[result_cols[i]] = txt ? reinterpret_cast(txt) : ""; + } + } + rows.push_back(row); + } + sqlite3_finalize(stmt); + return rows; + } + + // ---- INSERT ---------------------------------------------------------------- + + json::value _do_insert(const json::object& req, + const std::string& table, + const std::vector& cols) { + if (!req.contains("values") || !req.at("values").is_object()) + throw std::runtime_error("insert requires 'values' object"); + + DbConn& conn = _get_conn(); + const json::object& vals = req.at("values").as_object(); + + // 建列名 -> ColInfo 映射 + std::unordered_map col_map; + for (auto& c : cols) col_map[c.name] = c; + + std::string col_list, ph_list; + std::vector params; + std::vector is_null; + + for (auto& [k, v] : vals) { + if (!col_list.empty()) { col_list += ", "; ph_list += ", "; } + col_list += std::string(k); + ph_list += "?"; + ColInfo ci; + auto it = col_map.find(std::string(k)); + if (it != col_map.end()) ci = it->second; + else { ci.name = std::string(k); ci.type = "TEXT"; } + params.push_back(_coerce_value(ci, v)); + is_null.push_back(v.is_null()); + } + + std::string sql = "INSERT INTO " + table + " (" + col_list + ") VALUES (" + ph_list + ")"; + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + throw std::runtime_error(std::string("prepare failed: ") + sqlite3_errmsg(conn.get())); + + _bind_params(stmt, 1, params, is_null); + int rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) + throw std::runtime_error(std::string("insert failed: ") + sqlite3_errmsg(conn.get())); + + sqlite3_int64 rowid = sqlite3_last_insert_rowid(conn.get()); + return json::array{json::object{{"lastrowid", rowid}}}; + } + + // ---- UPDATE ---------------------------------------------------------------- + + json::value _do_update(const json::object& req, + const std::string& table, + const std::vector& cols) { + if (!req.contains("values") || !req.at("values").is_object()) + throw std::runtime_error("update requires 'values' object"); + + DbConn& conn = _get_conn(); + const json::object& vals = req.at("values").as_object(); + + std::unordered_map col_map; + for (auto& c : cols) col_map[c.name] = c; + + std::string set_clause; + std::vector params; + std::vector is_null; + + for (auto& [k, v] : vals) { + if (!set_clause.empty()) set_clause += ", "; + set_clause += std::string(k) + " = ?"; + ColInfo ci; + auto it = col_map.find(std::string(k)); + if (it != col_map.end()) ci = it->second; + else { ci.name = std::string(k); ci.type = "TEXT"; } + params.push_back(_coerce_value(ci, v)); + is_null.push_back(v.is_null()); + } + + std::string sql = "UPDATE " + table + " SET " + set_clause; + WhereClause wc; + if (auto it = req.find("where"); it != req.end() && it->value().is_object()) + wc = _build_where(it->value().as_object(), cols); + if (!wc.sql.empty()) { + sql += " WHERE " + wc.sql; + params.insert(params.end(), wc.params.begin(), wc.params.end()); + is_null.insert(is_null.end(), wc.is_null.begin(), wc.is_null.end()); + } + + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + throw std::runtime_error(std::string("prepare failed: ") + sqlite3_errmsg(conn.get())); + + _bind_params(stmt, 1, params, is_null); + int rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) + throw std::runtime_error(std::string("update failed: ") + sqlite3_errmsg(conn.get())); + + int rowcount = sqlite3_changes(conn.get()); + return json::array{json::object{{"rowcount", rowcount}}}; + } + + // ---- DELETE ---------------------------------------------------------------- + + json::value _do_delete(const json::object& req, + const std::string& table, + const std::vector& cols) { + DbConn& conn = _get_conn(); + + std::string sql = "DELETE FROM " + table; + WhereClause wc; + if (auto it = req.find("where"); it != req.end() && it->value().is_object()) + wc = _build_where(it->value().as_object(), cols); + if (!wc.sql.empty()) sql += " WHERE " + wc.sql; + + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + throw std::runtime_error(std::string("prepare failed: ") + sqlite3_errmsg(conn.get())); + + _bind_params(stmt, 1, wc.params, wc.is_null); + int rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) + throw std::runtime_error(std::string("delete failed: ") + sqlite3_errmsg(conn.get())); + + int rowcount = sqlite3_changes(conn.get()); + return json::array{json::object{{"rowcount", rowcount}}}; + } + + // ---- Logs 表初始化 --------------------------------------------------------- + + void _ensure_logs_table(DbConn& conn) { + conn.exec(R"( + CREATE TABLE IF NOT EXISTS Logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + ts TEXT NOT NULL, + service TEXT NOT NULL, + level TEXT NOT NULL, + message TEXT NOT NULL, + trace_id TEXT, + extra TEXT + ) + )"); + conn.exec("CREATE INDEX IF NOT EXISTS idx_logs_service_ts ON Logs(service, ts)"); + conn.exec("CREATE INDEX IF NOT EXISTS idx_logs_level_ts ON Logs(level, ts)"); + conn.exec("CREATE INDEX IF NOT EXISTS idx_logs_ts ON Logs(ts)"); + conn.exec("CREATE INDEX IF NOT EXISTS idx_logs_trace ON Logs(trace_id)"); + } + + // ---- 内部日志直写(绕过 RPC,防递归) -------------------------------------- + + void _log_internal(const std::string& level, const std::string& service, + std::string message, const std::string& trace_id, + const std::string& extra) { + if (message.size() > kMaxMessage) message.resize(kMaxMessage); + std::string ex = extra; + if (ex.size() > kMaxExtra) ex.resize(kMaxExtra); + + try { + DbConn& conn = _get_conn(); + std::string sql = + "INSERT INTO Logs (ts, service, level, message, trace_id, extra) " + "VALUES (?, ?, ?, ?, ?, ?)"; + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(conn.get(), sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) + return; + + std::string ts = utc_now(); + sqlite3_bind_text(stmt, 1, ts.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 2, service.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 3, level.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 4, message.c_str(), -1, SQLITE_TRANSIENT); + if (trace_id.empty()) sqlite3_bind_null(stmt, 5); + else sqlite3_bind_text(stmt, 5, trace_id.c_str(), -1, SQLITE_TRANSIENT); + if (ex.empty()) sqlite3_bind_null(stmt, 6); + else sqlite3_bind_text(stmt, 6, ex.c_str(), -1, SQLITE_TRANSIENT); + + sqlite3_step(stmt); + sqlite3_finalize(stmt); + } catch (...) {} + } + + // ---- 后台日志清理线程 ------------------------------------------------------- + + void _cleanup_loop() { + while (_cleanup_running) { + std::unique_lock lk(_cleanup_mtx); + _cleanup_cv.wait_for(lk, + std::chrono::seconds(_cfg.cleanup_interval), + [this] { return !_cleanup_running.load(); }); + if (!_cleanup_running) break; + _do_cleanup(); + } + } + + void _do_cleanup() { + try { + DbConn& conn = _get_conn(); + + // 1. 删除超过 retention_days 的记录 + std::string cutoff_sql = + "DELETE FROM Logs WHERE ts < datetime('now', '-" + + std::to_string(_cfg.retention_days) + " days')"; + conn.exec(cutoff_sql); + int expired = sqlite3_changes(conn.get()); + + // 2. 若总条数超过 max_records,删除最旧的超出部分 + int trimmed = 0; + { + sqlite3_stmt* stmt = nullptr; + std::string cnt_sql = "SELECT COUNT(*) FROM Logs"; + if (sqlite3_prepare_v2(conn.get(), cnt_sql.c_str(), -1, &stmt, nullptr) == SQLITE_OK) { + if (sqlite3_step(stmt) == SQLITE_ROW) { + int total = sqlite3_column_int(stmt, 0); + if (total > _cfg.max_records) { + int to_delete = total - _cfg.max_records; + sqlite3_finalize(stmt); + std::string trim_sql = + "DELETE FROM Logs WHERE id IN " + "(SELECT id FROM Logs ORDER BY id ASC LIMIT " + + std::to_string(to_delete) + ")"; + conn.exec(trim_sql); + trimmed = sqlite3_changes(conn.get()); + } else { + sqlite3_finalize(stmt); + } + } else { + sqlite3_finalize(stmt); + } + } + } + + if (expired > 0 || trimmed > 0) { + _log_internal("INFO", "db2", + "cleanup: expired=" + std::to_string(expired) + + " trimmed=" + std::to_string(trimmed), "", ""); + } + } catch (const std::exception& e) { + std::fprintf(stderr, "[db2] cleanup error: %s\n", e.what()); + } + } +}; + +// ============================================================================ +// main +// ============================================================================ + +int main(int argc, char* argv[]) { + try { + Config cfg = load_config(argc, argv); + + std::printf("[db2] listen=%s:%d workers=%d db=%s\n", + cfg.listen_host.c_str(), cfg.listen_port, + cfg.workers, cfg.db_url.c_str()); + std::fflush(stdout); + + DB2Server server(cfg); + server.start(); + } catch (const std::exception& e) { + std::fprintf(stderr, "[db2] fatal: %s\n", e.what()); + return 1; + } + return 0; +}