feat: main.cpp intenta HTTP API primero, fallback a SQLite
Nuevo flujo: por defecto conecta a sqlite_api en localhost:8484. Si la API no responde, cae a SQLite directo. Flag --api para URL custom. Launcher PowerShell actualizado con --api. app.md refleja la nueva arquitectura dual HTTP/SQLite y dir_path del proyecto. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,22 +2,41 @@
|
||||
#include "imgui.h"
|
||||
#include "core/fullscreen_window.h"
|
||||
#include "data.h"
|
||||
#include "data_http.h"
|
||||
#include "views.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
static RegistryData g_data;
|
||||
static std::string g_db_path;
|
||||
static std::string g_api_url;
|
||||
static bool g_loaded = false;
|
||||
static bool g_using_http = false;
|
||||
|
||||
static void reload_data() {
|
||||
g_data = RegistryData{};
|
||||
g_loaded = load_registry_data(g_db_path.c_str(), g_data);
|
||||
if (!g_loaded) {
|
||||
fprintf(stderr, "Failed to load registry data from: %s\n", g_db_path.c_str());
|
||||
|
||||
// Try HTTP API first
|
||||
if (!g_api_url.empty()) {
|
||||
g_loaded = load_registry_data_http(g_api_url, g_data);
|
||||
if (g_loaded) {
|
||||
g_using_http = true;
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "HTTP API failed, falling back to SQLite\n");
|
||||
}
|
||||
|
||||
// Fallback to direct SQLite
|
||||
g_using_http = false;
|
||||
if (!g_db_path.empty()) {
|
||||
g_loaded = load_registry_data(g_db_path.c_str(), g_data);
|
||||
if (!g_loaded) {
|
||||
fprintf(stderr, "Failed to load registry data from: %s\n", g_db_path.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +49,17 @@ static void render() {
|
||||
if (!g_loaded) {
|
||||
fullscreen_window_begin("##error");
|
||||
ImGui::TextColored(ImVec4(1, 0.3f, 0.3f, 1),
|
||||
"Could not open registry.db");
|
||||
"Could not load registry data");
|
||||
ImGui::Spacing();
|
||||
ImGui::Text("Tried: %s", g_db_path.c_str());
|
||||
if (!g_api_url.empty())
|
||||
ImGui::Text("API: %s (unreachable)", g_api_url.c_str());
|
||||
if (!g_db_path.empty())
|
||||
ImGui::Text("DB: %s", g_db_path.c_str());
|
||||
ImGui::Spacing();
|
||||
ImGui::TextWrapped("Usage: registry_dashboard <path1> [path2] [path3] ...");
|
||||
ImGui::TextWrapped(
|
||||
"Usage: registry_dashboard [--api URL] [db_path ...]\n"
|
||||
" --api URL Connect to sqlite_api (default: http://127.0.0.1:8484)\n"
|
||||
" db_path Direct SQLite path(s) as fallback");
|
||||
ImGui::Spacing();
|
||||
if (ImGui::Button("Retry")) {
|
||||
reload_data();
|
||||
@@ -47,26 +72,46 @@ static void render() {
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "Usage: registry_dashboard <db_path> [fallback_path ...]\n");
|
||||
fprintf(stderr, " Tries each path in order until one opens successfully.\n");
|
||||
return 1;
|
||||
// Parse --api flag
|
||||
std::vector<std::string> db_candidates;
|
||||
bool api_explicit = false;
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "--api") == 0 && i + 1 < argc) {
|
||||
g_api_url = argv[++i];
|
||||
api_explicit = true;
|
||||
} else if (strncmp(argv[i], "--api=", 6) == 0) {
|
||||
g_api_url = argv[i] + 6;
|
||||
api_explicit = true;
|
||||
} else {
|
||||
db_candidates.push_back(argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Try each argument in order
|
||||
for (int i = 1; i < argc; i++) {
|
||||
std::string candidate = argv[i];
|
||||
// Default: try localhost API if no --api given
|
||||
if (!api_explicit) {
|
||||
g_api_url = "http://127.0.0.1:8484";
|
||||
}
|
||||
|
||||
// Resolve SQLite fallback path
|
||||
for (auto& candidate : db_candidates) {
|
||||
if (std::ifstream(candidate).good()) {
|
||||
g_db_path = candidate;
|
||||
fprintf(stdout, "Using: %s\n", g_db_path.c_str());
|
||||
fprintf(stdout, "SQLite fallback: %s\n", g_db_path.c_str());
|
||||
break;
|
||||
}
|
||||
fprintf(stderr, "Not found: %s\n", candidate.c_str());
|
||||
}
|
||||
|
||||
if (g_db_path.empty()) {
|
||||
// None found, use last arg so error screen shows something useful
|
||||
g_db_path = argv[argc - 1];
|
||||
if (g_api_url.empty() && g_db_path.empty() && db_candidates.empty()) {
|
||||
fprintf(stderr, "Usage: registry_dashboard [--api URL] [db_path ...]\n");
|
||||
fprintf(stderr, " --api URL Connect to sqlite_api (default: http://127.0.0.1:8484)\n");
|
||||
fprintf(stderr, " db_path Direct SQLite path(s) as fallback\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (g_db_path.empty() && !db_candidates.empty()) {
|
||||
g_db_path = db_candidates.back();
|
||||
}
|
||||
|
||||
reload_data();
|
||||
|
||||
Reference in New Issue
Block a user