diff --git a/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db b/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db new file mode 100644 index 0000000..0bc5734 Binary files /dev/null and b/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db differ diff --git a/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db-shm b/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db-shm new file mode 100644 index 0000000..fe9ac28 Binary files /dev/null and b/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db-shm differ diff --git a/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db-wal b/archive_db/2026-06-23_outputs_kis_data_collection/kis_data_collection/kis_data_collection.db-wal new file mode 100644 index 0000000..e69de29 diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke2.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke2.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke2.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke3.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke3.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke3.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke4.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke4.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke4.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke5.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke5.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke5.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke6.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke6.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke6.db differ diff --git a/archive_db/2026-06-23_outputs_snapshot_admin/smoke_snapshot_admin.db b/archive_db/2026-06-23_outputs_snapshot_admin/smoke_snapshot_admin.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_outputs_snapshot_admin/smoke_snapshot_admin.db differ diff --git a/archive_db/2026-06-23_temp_test_files/snapshot_admin_livecheck.db b/archive_db/2026-06-23_temp_test_files/snapshot_admin_livecheck.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_temp_test_files/snapshot_admin_livecheck.db differ diff --git a/archive_db/2026-06-23_temp_test_files/snapshot_admin_web_validation.db b/archive_db/2026-06-23_temp_test_files/snapshot_admin_web_validation.db new file mode 100644 index 0000000..4e86411 Binary files /dev/null and b/archive_db/2026-06-23_temp_test_files/snapshot_admin_web_validation.db differ diff --git a/archive_db/2026-06-23_temp_test_files/test_kis_data_collection.db b/archive_db/2026-06-23_temp_test_files/test_kis_data_collection.db new file mode 100644 index 0000000..ac70ef1 Binary files /dev/null and b/archive_db/2026-06-23_temp_test_files/test_kis_data_collection.db differ diff --git a/archive_db/manifest.json b/archive_db/manifest.json new file mode 100644 index 0000000..72dd40a --- /dev/null +++ b/archive_db/manifest.json @@ -0,0 +1,91 @@ +{ + "archive_date": "2026-06-23", + "created_at": "2026-06-23T00:30:32.227942", + "archived_count": 11, + "skipped_count": 0, + "error_count": 0, + "files": [ + { + "source": "outputs\\kis_data_collection", + "destination": "archive_db\\2026-06-23_outputs_kis_data_collection\\kis_data_collection", + "type": "directory", + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke2.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke2.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke3.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke3.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke4.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke4.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke5.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke5.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke6.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke6.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "outputs\\snapshot_admin\\smoke_snapshot_admin.db", + "destination": "archive_db\\2026-06-23_outputs_snapshot_admin\\smoke_snapshot_admin.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "Temp\\test_kis_data_collection.db", + "destination": "archive_db\\2026-06-23_temp_test_files\\test_kis_data_collection.db", + "type": "file", + "size_kb": 324.0, + "timestamp": "2026-06-23" + }, + { + "source": "Temp\\snapshot_admin_livecheck.db", + "destination": "archive_db\\2026-06-23_temp_test_files\\snapshot_admin_livecheck.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + }, + { + "source": "Temp\\snapshot_admin_web_validation.db", + "destination": "archive_db\\2026-06-23_temp_test_files\\snapshot_admin_web_validation.db", + "type": "file", + "size_kb": 4.0, + "timestamp": "2026-06-23" + } + ], + "notes": [ + "These files were archived due to database consolidation.", + "Single source of truth is now: src/quant_engine/", + "To restore: use archive_db/{date}_*/ directories", + "Canonical files: kis_data_collection.db, snapshot_admin.db" + ] +} \ No newline at end of file diff --git a/tools/archive_legacy_databases.py b/tools/archive_legacy_databases.py new file mode 100644 index 0000000..85a5a0b --- /dev/null +++ b/tools/archive_legacy_databases.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python3 +""" +데이터베이스 아카이빙 도구 + +레거시/테스트 DB 파일을 archive_db/로 이동하고 manifest 생성 +""" + +import shutil +import json +from pathlib import Path +from datetime import datetime +from typing import Dict, List + +class DatabaseArchiver: + """데이터베이스 아카이빙""" + + def __init__(self): + self.root = Path(".") + self.archive_root = self.root / "archive_db" + self.timestamp = datetime.now().strftime("%Y-%m-%d") + self.results = { + "timestamp": datetime.now().isoformat(), + "archived": [], + "skipped": [], + "errors": [] + } + + def create_archive_structure(self) -> None: + """아카이브 디렉토리 구조 생성""" + dirs = [ + self.archive_root / f"{self.timestamp}_outputs_kis_data_collection", + self.archive_root / f"{self.timestamp}_outputs_snapshot_admin", + self.archive_root / f"{self.timestamp}_temp_test_files", + ] + + for d in dirs: + d.mkdir(parents=True, exist_ok=True) + print(f"[OK] Created: {d.relative_to(self.root)}") + + def archive_outputs_kis_data_collection(self) -> None: + """outputs/kis_data_collection/ 아카이빙""" + src = self.root / "outputs" / "kis_data_collection" + if not src.exists(): + print(f"[SKIP] {src.relative_to(self.root)} not found") + self.results["skipped"].append(str(src.relative_to(self.root))) + return + + dest = self.archive_root / f"{self.timestamp}_outputs_kis_data_collection" / "kis_data_collection" + + try: + shutil.copytree(src, dest, dirs_exist_ok=True) + print(f"[OK] Archived: {src.relative_to(self.root)}") + self.results["archived"].append({ + "source": str(src.relative_to(self.root)), + "destination": str(dest.relative_to(self.root)), + "type": "directory", + "timestamp": self.timestamp + }) + except Exception as e: + print(f"[ERROR] Failed to archive {src}: {e}") + self.results["errors"].append(str(e)) + + def archive_outputs_snapshot_admin(self) -> None: + """outputs/snapshot_admin/ 의 smoke*.db 아카이빙""" + src_dir = self.root / "outputs" / "snapshot_admin" + if not src_dir.exists(): + print(f"[SKIP] {src_dir.relative_to(self.root)} not found") + self.results["skipped"].append(str(src_dir.relative_to(self.root))) + return + + dest_dir = self.archive_root / f"{self.timestamp}_outputs_snapshot_admin" + + # smoke*.db 파일들 찾기 + smoke_files = list(src_dir.glob("smoke*.db")) + if not smoke_files: + print(f"[SKIP] No smoke*.db files in {src_dir.relative_to(self.root)}") + return + + for src_file in smoke_files: + try: + dest_file = dest_dir / src_file.name + shutil.copy2(src_file, dest_file) + print(f"[OK] Archived: {src_file.relative_to(self.root)}") + self.results["archived"].append({ + "source": str(src_file.relative_to(self.root)), + "destination": str(dest_file.relative_to(self.root)), + "type": "file", + "size_kb": src_file.stat().st_size / 1024, + "timestamp": self.timestamp + }) + except Exception as e: + print(f"[ERROR] Failed to archive {src_file}: {e}") + self.results["errors"].append(str(e)) + + def archive_temp_files(self) -> None: + """Temp/ 의 테스트 DB 파일들 아카이빙""" + temp_dir = self.root / "Temp" + if not temp_dir.exists(): + print(f"[SKIP] {temp_dir.relative_to(self.root)} not found") + self.results["skipped"].append(str(temp_dir.relative_to(self.root))) + return + + dest_dir = self.archive_root / f"{self.timestamp}_temp_test_files" + + patterns = [ + "*_collection.db", + "*_admin*.db", + ] + + files_archived = 0 + for pattern in patterns: + for src_file in temp_dir.glob(pattern): + # snapshot_admin.db와 kis_data_collection.db 제외 (canonical 파일들) + if src_file.name in ["kis_data_collection.db", "snapshot_admin.db"]: + continue + + try: + dest_file = dest_dir / src_file.name + shutil.copy2(src_file, dest_file) + print(f"[OK] Archived: {src_file.relative_to(self.root)}") + self.results["archived"].append({ + "source": str(src_file.relative_to(self.root)), + "destination": str(dest_file.relative_to(self.root)), + "type": "file", + "size_kb": src_file.stat().st_size / 1024, + "timestamp": self.timestamp + }) + files_archived += 1 + except Exception as e: + print(f"[ERROR] Failed to archive {src_file}: {e}") + self.results["errors"].append(str(e)) + + if files_archived == 0: + print(f"[SKIP] No test DB files found in {temp_dir.relative_to(self.root)}") + + def create_manifest(self) -> None: + """manifest.json 생성""" + manifest = { + "archive_date": self.timestamp, + "created_at": datetime.now().isoformat(), + "archived_count": len(self.results["archived"]), + "skipped_count": len(self.results["skipped"]), + "error_count": len(self.results["errors"]), + "files": self.results["archived"], + "notes": [ + "These files were archived due to database consolidation.", + "Single source of truth is now: src/quant_engine/", + "To restore: use archive_db/{date}_*/ directories", + "Canonical files: kis_data_collection.db, snapshot_admin.db" + ] + } + + manifest_file = self.archive_root / "manifest.json" + with open(manifest_file, 'w', encoding='utf-8') as f: + json.dump(manifest, f, indent=2, ensure_ascii=False) + + print(f"\n[OK] Manifest created: {manifest_file.relative_to(self.root)}") + + def run(self) -> Dict: + """전체 실행""" + print("="*80) + print("Database Archiving Process") + print("="*80) + print(f"Archive date: {self.timestamp}\n") + + # 아카이브 디렉토리 구조 생성 + self.create_archive_structure() + + print("\n[Archiving files...]") + # 각 레거시 파일 아카이빙 + self.archive_outputs_kis_data_collection() + self.archive_outputs_snapshot_admin() + self.archive_temp_files() + + # manifest 생성 + self.create_manifest() + + # 요약 + print("\n" + "="*80) + print("Archive Summary") + print("="*80) + print(f"Archived: {len(self.results['archived'])} items") + print(f"Skipped: {len(self.results['skipped'])} items") + print(f"Errors: {len(self.results['errors'])} items") + print(f"\nArchive location: {self.archive_root.relative_to(self.root)}") + + if self.results['errors']: + print("\n[Errors encountered]") + for error in self.results['errors']: + print(f" - {error}") + + return self.results + +if __name__ == "__main__": + archiver = DatabaseArchiver() + results = archiver.run() + + print("\n" + "="*80) + print("[Next Steps]") + print("="*80) + print("1. Verify archive contents: git status") + print("2. Add archive to git: git add archive_db/") + print("3. Commit: git commit -m 'Archive legacy database files'") + print("4. Delete legacy files (after verification)") + print("5. Update code references to use src/quant_engine/")