SQLBackups.gd 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. extends Node
  2. class_name SQLBackups
  3. #
  4. var thread : Thread = Thread.new()
  5. var isRunning : bool = false
  6. var stopRequested : bool = false
  7. #
  8. func CreateDailyBackup() -> String:
  9. var date : Dictionary = Time.get_datetime_dict_from_system()
  10. var frequencyDir : String = SQLCommons.BackupFrequency.keys()[SQLCommons.BackupFrequency.DAILY]
  11. var backupFile : String = SQLCommons.GetBackupPath() + "%s/%d-%02d-%02d_%02d-%02d-%02d" % [frequencyDir, date.year, date.month, date.day, date.hour, date.minute, date.second] + Path.DBExt
  12. if Launcher.SQL.db.backup_to(backupFile):
  13. Util.PrintInfo("SQL", "Backup created: " + backupFile)
  14. return backupFile
  15. else:
  16. Util.PrintLog("SQL", "Backup failed: " + backupFile)
  17. return ""
  18. func CopyBackup(backupFilePath : String, backupFrequency : SQLCommons.BackupFrequency) -> String:
  19. var frequencyDir : String = SQLCommons.BackupFrequency.keys()[backupFrequency]
  20. var newFile : String = SQLCommons.GetBackupPath() + "%s/%s" % [frequencyDir, backupFilePath.get_file()]
  21. var errorCode : Error = DirAccess.copy_absolute(backupFilePath, newFile)
  22. if (errorCode == Error.OK):
  23. Util.PrintInfo("SQL", "Backup created: " + newFile)
  24. return newFile
  25. else:
  26. Util.PrintLog("SQL", "Backup failed for file %s with code %d" % [newFile, errorCode])
  27. return ""
  28. func PruneBackups() -> void:
  29. for backupFrequency in SQLCommons.BackupFrequency.values():
  30. var backupFrequencyDir = SQLCommons.BackupFrequency.keys()[backupFrequency]
  31. var dir : DirAccess = DirAccess.open(SQLCommons.GetBackupPath() + "/" + backupFrequencyDir)
  32. if not dir:
  33. return
  34. var dirFiles : PackedStringArray = dir.get_files()
  35. var backupFiles : Array[String] = []
  36. for file in dirFiles:
  37. if file.get_extension() == "db":
  38. backupFiles.append(file)
  39. backupFiles.sort() # Oldest backups first
  40. while backupFiles.size() > SQLCommons.BackupLimits[backupFrequency]:
  41. var prunedFile : String = backupFiles.pop_front()
  42. var err : Error = dir.remove(prunedFile)
  43. if err == OK:
  44. Util.PrintInfo("SQL", "Backup removed: " + prunedFile)
  45. else:
  46. Util.PrintLog("SQL", "Backup removal failed: %s [%d]" % [prunedFile, err])
  47. #
  48. func Run():
  49. Thread.set_thread_safety_checks_enabled(false)
  50. var lastDailyBackupTimestamp : int = SQLCommons.Timestamp()
  51. var lastWeeklyBackupTimestamp : int = SQLCommons.Timestamp()
  52. var lastMonthlyBackupTimestamp : int = SQLCommons.Timestamp()
  53. var lastPlayerUpdateTimestamp : int = SQLCommons.Timestamp()
  54. var lastStopCheckTimestamp : int = SQLCommons.Timestamp()
  55. while isRunning:
  56. var timestamp : int = SQLCommons.Timestamp()
  57. if timestamp - lastDailyBackupTimestamp >= SQLCommons.DailyBackupIntervalSec:
  58. var backupFilePath: String = CreateDailyBackup()
  59. lastDailyBackupTimestamp = timestamp
  60. if timestamp - lastWeeklyBackupTimestamp >= SQLCommons.WeeklyBackupIntervalSec \
  61. and !backupFilePath.is_empty():
  62. backupFilePath = CopyBackup(backupFilePath, SQLCommons.BackupFrequency.WEEKLY)
  63. lastWeeklyBackupTimestamp = timestamp
  64. if timestamp - lastMonthlyBackupTimestamp >= SQLCommons.MonthlyBackupIntervalSec \
  65. and !backupFilePath.is_empty():
  66. CopyBackup(backupFilePath, SQLCommons.BackupFrequency.MONTHLY)
  67. lastMonthlyBackupTimestamp = timestamp
  68. PruneBackups()
  69. if timestamp - lastPlayerUpdateTimestamp >= SQLCommons.BackupPlayersSec:
  70. if Launcher.World:
  71. Launcher.World.BackupPlayers()
  72. lastPlayerUpdateTimestamp = timestamp
  73. if timestamp - lastStopCheckTimestamp >= SQLCommons.BackupCheckIntervalSec:
  74. if stopRequested:
  75. isRunning = false
  76. break
  77. lastStopCheckTimestamp = timestamp
  78. OS.delay_msec(100)
  79. func Start():
  80. if not isRunning:
  81. isRunning = true
  82. thread.start(Run, Thread.PRIORITY_LOW)
  83. func Stop():
  84. if isRunning and not stopRequested:
  85. stopRequested = true
  86. thread.wait_to_finish()
  87. #
  88. func _init():
  89. var backupPath : String = SQLCommons.GetBackupPath()
  90. if not DirAccess.dir_exists_absolute(backupPath):
  91. DirAccess.make_dir_absolute(backupPath)
  92. for backupFrequency in SQLCommons.BackupFrequency.values():
  93. var frequencyDir : String = SQLCommons.GetBackupPath() + SQLCommons.BackupFrequency.keys()[backupFrequency] + "/"
  94. if not DirAccess.dir_exists_absolute(frequencyDir):
  95. DirAccess.make_dir_absolute(frequencyDir)
  96. Start()