import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent / 'tools'))
from HELIOSDB_SQLITE_CONVERTER import (
TransparentConverter,
SQLiteToHeliosDBConverter,
ConversionMode
)
def example_1_transparent_migration():
print("\n" + "="*70)
print("Example 1: Transparent Migration")
print("="*70)
db_path = Path("app_database.sqlite")
success, heliosdb_conn, messages = TransparentConverter.connect_with_auto_conversion(
db_path
)
if success:
print("\n✓ Database ready!")
print("\nConversion messages:")
for msg in messages:
print(f" {msg}")
else:
print("\n✗ Migration failed!")
for msg in messages:
print(f" ERROR: {msg}")
def example_2_monitored_migration():
print("\n" + "="*70)
print("Example 2: Monitored Migration with Progress")
print("="*70)
sqlite_path = Path("large_database.sqlite")
heliosdb_path = Path("large_database.heliosdb")
converter = SQLiteToHeliosDBConverter(
sqlite_path=sqlite_path,
heliosdb_path=heliosdb_path,
mode=ConversionMode.STREAMING,
verify_integrity=True
)
def update_progress_bar(progress):
pct = progress.progress_percentage()
eta = progress.estimated_time_remaining()
bar_width = 50
filled = int(bar_width * pct / 100)
bar = '█' * filled + '░' * (bar_width - filled)
if eta:
eta_str = f"ETA: {int(eta // 60)}m {int(eta % 60)}s"
else:
eta_str = "Calculating..."
print(f"\r{bar} {pct:5.1f}% | {progress.current_table:20} | {eta_str}", end='')
print("\nStarting migration...")
success = converter.convert(progress_callback=update_progress_bar)
print()
if success:
print("\n✓ Migration completed successfully!")
print(f" Tables: {converter.progress.converted_tables}")
print(f" Rows: {converter.progress.converted_rows:,}")
print(f" Time: {converter.progress.elapsed_time():.1f}s")
if converter.progress.warnings:
print(f"\n⚠ Warnings ({len(converter.progress.warnings)}):")
for warning in converter.progress.warnings:
print(f" - {warning}")
else:
print("\n✗ Migration failed!")
for error in converter.progress.errors:
print(f" ERROR: {error}")
def example_3_batch_migration():
print("\n" + "="*70)
print("Example 3: Batch Migration of Multiple Databases")
print("="*70)
databases = [
"tenant_001.sqlite",
"tenant_002.sqlite",
"tenant_003.sqlite",
]
results = []
for db_file in databases:
sqlite_path = Path(db_file)
heliosdb_path = Path(f"{sqlite_path.stem}.heliosdb")
print(f"\nMigrating {db_file}...")
converter = SQLiteToHeliosDBConverter(
sqlite_path=sqlite_path,
heliosdb_path=heliosdb_path,
mode=ConversionMode.STREAMING
)
success = converter.convert()
results.append({
'database': db_file,
'success': success,
'tables': converter.progress.converted_tables,
'rows': converter.progress.converted_rows,
'time': converter.progress.elapsed_time()
})
if success:
print(f" ✓ Completed in {converter.progress.elapsed_time():.1f}s")
else:
print(f" ✗ Failed: {converter.progress.errors}")
print("\n" + "="*70)
print("Migration Summary")
print("="*70)
successful = sum(1 for r in results if r['success'])
failed = len(results) - successful
print(f"\nTotal: {len(results)} databases")
print(f" ✓ Successful: {successful}")
print(f" ✗ Failed: {failed}")
print("\nDetails:")
for result in results:
status = "✓" if result['success'] else "✗"
print(f" {status} {result['database']:30} "
f"{result['tables']:2} tables, "
f"{result['rows']:6} rows, "
f"{result['time']:6.1f}s")
def example_4_production_migration():
print("\n" + "="*70)
print("Example 4: Production Migration with Verification")
print("="*70)
sqlite_path = Path("production.sqlite")
heliosdb_path = Path("production.heliosdb")
print("\n1. Pre-migration validation...")
from HELIOSDB_SQLITE_CONVERTER import SQLiteDetector
is_valid, error = SQLiteDetector.validate_sqlite_database(sqlite_path)
if not is_valid:
print(f" ✗ SQLite validation failed: {error}")
return
print(" ✓ SQLite database is valid")
info = SQLiteDetector.get_database_info(sqlite_path)
print(f" - Size: {info['file_size'] / (1024*1024):.1f} MB")
print(f" - Tables: {len(info['tables'])}")
print(f" - Total rows: {info['total_rows']:,}")
import shutil
free_space = shutil.disk_usage(sqlite_path.parent).free
required_space = info['file_size'] * 2.5
if free_space < required_space:
print(f" ✗ Insufficient disk space: {free_space / (1024**3):.1f} GB available, "
f"{required_space / (1024**3):.1f} GB required")
return
print(f" ✓ Sufficient disk space: {free_space / (1024**3):.1f} GB available")
print("\n2. Starting migration...")
converter = SQLiteToHeliosDBConverter(
sqlite_path=sqlite_path,
heliosdb_path=heliosdb_path,
mode=ConversionMode.STREAMING,
verify_integrity=True )
conversion_log = []
def log_progress(progress):
conversion_log.append({
'timestamp': progress.elapsed_time(),
'table': progress.current_table,
'rows': progress.converted_rows,
'percentage': progress.progress_percentage()
})
pct = progress.progress_percentage()
print(f" Progress: {pct:5.1f}% - {progress.current_table}")
success = converter.convert(progress_callback=log_progress)
if success:
print("\n3. Post-migration verification...")
print(" ✓ Row counts verified")
print(" ✓ Schema integrity verified")
from HELIOSDB_SQLITE_CONVERTER import HeliosDBFileFormat
if HeliosDBFileFormat.is_heliosdb_file(heliosdb_path):
print(" ✓ HeliosDB database created successfully")
print("\n4. Migration Summary:")
print(f" ✓ Status: SUCCESSFUL")
print(f" - Tables: {converter.progress.converted_tables}")
print(f" - Rows: {converter.progress.converted_rows:,}")
print(f" - Time: {converter.progress.elapsed_time():.1f}s")
print(f" - Average speed: {converter.progress.converted_rows / converter.progress.elapsed_time():.0f} rows/sec")
if converter.progress.warnings:
print(f"\n ⚠ Warnings ({len(converter.progress.warnings)}):")
for warning in converter.progress.warnings:
print(f" - {warning}")
print("\n5. Next steps:")
print(" 1. Test HeliosDB database with your application")
print(" 2. Run application smoke tests")
print(" 3. Compare query results with SQLite")
print(" 4. Archive original SQLite database")
print(" 5. Update connection strings to use HeliosDB")
else:
print("\n✗ Migration failed!")
print(f" Status: {converter.progress.status.value}")
print("\nErrors:")
for error in converter.progress.errors:
print(f" - {error}")
print("\nRollback:")
print(" - Partial HeliosDB database removed automatically")
print(" - Original SQLite database preserved")
print("\nRecommendations:")
print(" 1. Review error messages above")
print(" 2. Check SQLite database integrity")
print(" 3. Ensure sufficient disk space")
print(" 4. Try row-by-row mode for better error isolation")
def main():
print("="*70)
print("SQLite to HeliosDB Nano Migration Examples")
print("="*70)
print("\nThis script demonstrates various migration scenarios.")
print("Note: Examples use mock databases for demonstration.")
print("\n" + "="*70)
print("To run examples, uncomment the function calls in main()")
print("="*70)
if __name__ == '__main__':
main()