Code date creation 新一代 C++ 图形化数据生成器 v8.0.0 · 幻想

技术内幕 · 14 / 16

本机数据库与配置迁移

7.1.0 把设置从注册表搬进 SQLite,并主动清理旧版残留。

16 个章节 37 段代码 21 张对照表 全部对着源码核对

7.0.0 把主题、编译器路径这类设置写在注册表里。7.1.0 改成了本机 SQLite —— 理由很实际:私信要存、消息要标已读、还要记录「有没有同步到云端」,这些用键值对表达会很别扭,而注册表也不适合放这类结构化数据。

库文件位置

TEXT2 行
%APPDATA%\CDCExceed\cdc_data.db        设置 · 账号 · 私信
%APPDATA%\CDCExceed\cdc_ai.cfg        AI 的 api_key / model / base_url(仅本机)

表结构

CPP17 行
static void InitDatabase() {
    wstring dbfile = GetAppDataPath() + L"\\cdc_data.db";
    if (sqlite3_open16(dbfile.c_str(), &g_db) != SQLITE_OK) { g_db = nullptr; return; }

    const char* sql =
        "CREATE TABLE IF NOT EXISTS users (user TEXT PRIMARY KEY, pass TEXT);"
        "CREATE TABLE IF NOT EXISTS messages ("
        "  id INTEGER PRIMARY KEY AUTOINCREMENT, `from` TEXT, `to` TEXT,"
        "  content TEXT, ts INTEGER, read INTEGER DEFAULT 0, synced INTEGER DEFAULT 0);"
        "CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT);";
    sqlite3_exec(g_db, sql, nullptr, nullptr, nullptr);

    // 兼容旧库:老版本的 messages 表没有 synced 列,就地补上
    if (!hasSynced)
        sqlite3_exec(g_db, "ALTER TABLE messages ADD COLUMN synced INTEGER DEFAULT 0",
                     nullptr, nullptr, nullptr);
}

synced 这一列是「同步到云端」的去重依据:只挑 synced = 0 的消息上传,成功后再置 1,重复同步不会把同一条私信发两遍。

键值读写

CPP22 行
static wstring DbGet(const char* key, const wchar_t* fallback = L"") {
    wstring val = fallback;
    sqlite3_stmt* st = nullptr;
    if (sqlite3_prepare_v2(g_db, "SELECT value FROM config WHERE key=?", -1, &st, nullptr) == SQLITE_OK) {
        sqlite3_bind_text(st, 1, key, -1, SQLITE_STATIC);
        if (sqlite3_step(st) == SQLITE_ROW) val = Utf8ToWstr((const char*)sqlite3_column_text(st, 0));
        sqlite3_finalize(st);
    }
    return val;
}

static void DbSet(const char* key, const wstring& val) {
    sqlite3_stmt* st = nullptr;
    if (sqlite3_prepare_v2(g_db,
            "INSERT INTO config(key,value) VALUES(?,?) "
            "ON CONFLICT(key) DO UPDATE SET value=excluded.value", -1, &st, nullptr) == SQLITE_OK) {
        sqlite3_bind_text(st, 1, key, -1, SQLITE_STATIC);
        sqlite3_bind_text16(st, 2, val.c_str(), -1, SQLITE_STATIC);
        sqlite3_step(st);
        sqlite3_finalize(st);
    }
}
  • 全部走预编译语句 —— 键与值都作为参数绑定,不存在拼接字符串的注入问题
  • ON CONFLICT ... DO UPDATE 一条语句完成「有则改、无则插」 —— 不需要先查后写,也就没有两次操作之间的竞态
  • 取不到值时返回调用方给的默认值 —— 首次运行、库文件被删都能正常启动,不会因为少一个键就崩

旧版残留的清理

CPP10 行
// 旧版曾写入 HKCU\Software\TestDataGenerator;当前版本改用 SQLite,
// 此处做一次性清理,避免脏数据一直留在用户机器上。
static void CleanLegacyRegistry() {
    HKEY hK;
    if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\TestDataGenerator",
                      0, KEY_READ | KEY_WRITE, &hK) == ERROR_SUCCESS) {
        RegCloseKey(hK);
        RegDeleteTreeW(HKEY_CURRENT_USER, L"Software\\TestDataGenerator");
    }
}

Code date creation(CDC)是作者 starryfast 独立开发的 C++ 图形化数据生成器,GitCode 组织「Code date creation编写」。生成器统一按 C++23 标准编译:随机模式按值域批量造点,自编译模式把你的 AC 代码直接跑成 .out,再一键打包成可提交的 zip —— 从造数据到交题,一个 exe 全包。v8.0.0「幻想」起内置了幻想增强引擎,提供 20 项数据校验与分析能力,全部在本机完成,不联网、不上传。

交流

ACGO 发布帖 B 站空间 272215275@qq.com QQ 272215275 MC gm.rainplay.cn:15415

© 2026 Code date creation编写 · 作者 starryfast · 本站与 cdc.mjhcsp.xyz 同源

市面上的盗版程序可能携带病毒,请仅从本页或官方代码仓获取安装包。