database.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import sqlite3
  2. import os
  3. from datetime import datetime, timedelta
  4. from contextlib import contextmanager
  5. DATABASE_PATH = 'files.db'
  6. def init_database():
  7. """Inicializar la base de datos y crear las tablas necesarias"""
  8. with get_db_connection() as conn:
  9. cursor = conn.cursor()
  10. # Crear tabla de archivos
  11. cursor.execute('''
  12. CREATE TABLE IF NOT EXISTS files (
  13. id TEXT PRIMARY KEY,
  14. original_filename TEXT NOT NULL,
  15. stored_filename TEXT NOT NULL,
  16. file_size INTEGER NOT NULL,
  17. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  18. expires_at TIMESTAMP NOT NULL,
  19. download_count INTEGER DEFAULT 0,
  20. is_deleted BOOLEAN DEFAULT FALSE
  21. )
  22. ''')
  23. conn.commit()
  24. @contextmanager
  25. def get_db_connection():
  26. """Context manager para conexiones a la base de datos"""
  27. conn = sqlite3.connect(DATABASE_PATH)
  28. conn.row_factory = sqlite3.Row # Permite acceder a las columnas por nombre
  29. try:
  30. yield conn
  31. finally:
  32. conn.close()
  33. def save_file(file_id, original_filename, stored_filename, file_size, expires_hours=24):
  34. """Guardar información de un archivo en la base de datos"""
  35. expires_at = datetime.now() + timedelta(hours=expires_hours)
  36. with get_db_connection() as conn:
  37. cursor = conn.cursor()
  38. cursor.execute('''
  39. INSERT INTO files (id, original_filename, stored_filename, file_size, expires_at)
  40. VALUES (?, ?, ?, ?, ?)
  41. ''', (file_id, original_filename, stored_filename, file_size, expires_at.isoformat()))
  42. conn.commit()
  43. def get_file_by_id(file_id):
  44. """Obtener información de un archivo por su ID"""
  45. with get_db_connection() as conn:
  46. cursor = conn.cursor()
  47. cursor.execute('''
  48. SELECT * FROM files
  49. WHERE id = ? AND is_deleted = FALSE
  50. ''', (file_id,))
  51. return cursor.fetchone()
  52. def get_all_files():
  53. """Obtener todos los archivos no eliminados"""
  54. with get_db_connection() as conn:
  55. cursor = conn.cursor()
  56. cursor.execute('''
  57. SELECT * FROM files
  58. WHERE is_deleted = FALSE
  59. ORDER BY created_at DESC
  60. ''')
  61. return cursor.fetchall()
  62. def get_active_files():
  63. """Obtener solo archivos activos (no expirados y no eliminados)"""
  64. with get_db_connection() as conn:
  65. cursor = conn.cursor()
  66. cursor.execute('''
  67. SELECT * FROM files
  68. WHERE is_deleted = FALSE AND expires_at > ?
  69. ORDER BY created_at DESC
  70. ''', (datetime.now().isoformat(),))
  71. return cursor.fetchall()
  72. def delete_file(file_id):
  73. """Marcar un archivo como eliminado (soft delete)"""
  74. with get_db_connection() as conn:
  75. cursor = conn.cursor()
  76. cursor.execute('''
  77. UPDATE files
  78. SET is_deleted = TRUE
  79. WHERE id = ?
  80. ''', (file_id,))
  81. conn.commit()
  82. return cursor.rowcount > 0
  83. def hard_delete_file(file_id):
  84. """Eliminar completamente un archivo de la base de datos"""
  85. with get_db_connection() as conn:
  86. cursor = conn.cursor()
  87. cursor.execute('DELETE FROM files WHERE id = ?', (file_id,))
  88. conn.commit()
  89. return cursor.rowcount > 0
  90. def increment_download_count(file_id):
  91. """Incrementar el contador de descargas de un archivo"""
  92. with get_db_connection() as conn:
  93. cursor = conn.cursor()
  94. cursor.execute('''
  95. UPDATE files
  96. SET download_count = download_count + 1
  97. WHERE id = ?
  98. ''', (file_id,))
  99. conn.commit()
  100. def cleanup_expired_files():
  101. """Eliminar archivos expirados de la base de datos"""
  102. with get_db_connection() as conn:
  103. cursor = conn.cursor()
  104. cursor.execute('''
  105. UPDATE files
  106. SET is_deleted = TRUE
  107. WHERE expires_at <= ? AND is_deleted = FALSE
  108. ''', (datetime.now().isoformat(),))
  109. conn.commit()
  110. return cursor.rowcount
  111. def get_file_stats():
  112. """Obtener estadísticas de archivos"""
  113. with get_db_connection() as conn:
  114. cursor = conn.cursor()
  115. # Total de archivos
  116. cursor.execute('SELECT COUNT(*) FROM files WHERE is_deleted = FALSE')
  117. total_files = cursor.fetchone()[0]
  118. # Archivos activos
  119. cursor.execute('''
  120. SELECT COUNT(*) FROM files
  121. WHERE is_deleted = FALSE AND expires_at > ?
  122. ''', (datetime.now().isoformat(),))
  123. active_files = cursor.fetchone()[0]
  124. # Total de descargas
  125. cursor.execute('SELECT SUM(download_count) FROM files WHERE is_deleted = FALSE')
  126. total_downloads = cursor.fetchone()[0] or 0
  127. return {
  128. 'total_files': total_files,
  129. 'active_files': active_files,
  130. 'total_downloads': total_downloads
  131. }