DatabaseHelper.swift 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import Foundation
  2. public class DatabaseHelper {
  3. /// The application group identifier defines a group of apps or extensions that have access to a shared container.
  4. /// The ID is created in the apple developer portal and can be changed there.
  5. static let applicationGroupIdentifier = "group.chat.delta.ios"
  6. public var sharedDbFile: String {
  7. guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: DatabaseHelper.applicationGroupIdentifier) else {
  8. return ""
  9. }
  10. let storeURL = fileContainer.appendingPathComponent("messenger.db")
  11. return storeURL.path
  12. }
  13. var localDbFile: String {
  14. return localDocumentsDir.appendingPathComponent("messenger.db").path
  15. }
  16. var sharedDbBlobsDir: String {
  17. guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: DatabaseHelper.applicationGroupIdentifier) else {
  18. return ""
  19. }
  20. return fileContainer.appendingPathComponent("messenger.db-blobs").path
  21. }
  22. var localDbBlobsDir: String {
  23. return localDocumentsDir.appendingPathComponent("messenger.db-blobs").path
  24. }
  25. var localDocumentsDir: URL {
  26. let paths = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)
  27. return URL(fileURLWithPath: paths[0], isDirectory: true)
  28. }
  29. public var currentDatabaseLocation: String {
  30. let filemanager = FileManager.default
  31. if filemanager.fileExists(atPath: localDbFile) {
  32. return localDbFile
  33. }
  34. return sharedDbFile
  35. }
  36. var currentBlobsDirLocation: String {
  37. let filemanager = FileManager.default
  38. if filemanager.fileExists(atPath: localDbBlobsDir) {
  39. return localDbBlobsDir
  40. }
  41. return sharedDbBlobsDir
  42. }
  43. public init() {
  44. }
  45. func clearDbBlobsDir(at path: String) {
  46. let fileManager = FileManager.default
  47. do {
  48. if fileManager.fileExists(atPath: path) {
  49. let filePaths = try fileManager.contentsOfDirectory(atPath: path)
  50. for filePath in filePaths {
  51. let completePath = URL(fileURLWithPath: path).appendingPathComponent(filePath)
  52. try fileManager.removeItem(atPath: completePath.path)
  53. }
  54. try fileManager.removeItem(atPath: path)
  55. }
  56. } catch {
  57. DcContext.shared.logger?.error("Could not clean shared blobs dir, it might be it didn't exist")
  58. }
  59. }
  60. func clearDb(at path: String) {
  61. let filemanager = FileManager.default
  62. if filemanager.fileExists(atPath: path) {
  63. do {
  64. try filemanager.removeItem(atPath: path)
  65. } catch {
  66. DcContext.shared.logger?.error("Failed to delete db: \(error)")
  67. }
  68. }
  69. }
  70. public func clearAccountData() {
  71. clearDb(at: currentDatabaseLocation)
  72. clearDbBlobsDir(at: currentBlobsDirLocation)
  73. }
  74. func moveBlobsFolder() {
  75. let filemanager = FileManager.default
  76. if filemanager.fileExists(atPath: localDbBlobsDir) {
  77. do {
  78. clearDbBlobsDir(at: sharedDbBlobsDir)
  79. try filemanager.moveItem(at: URL(fileURLWithPath: localDbBlobsDir), to: URL(fileURLWithPath: sharedDbBlobsDir))
  80. } catch let error {
  81. DcContext.shared.logger?.error("Could not move db blobs directory to shared space: \(error.localizedDescription)")
  82. }
  83. }
  84. }
  85. public func updateDatabaseLocation() -> String? {
  86. let filemanager = FileManager.default
  87. if filemanager.fileExists(atPath: localDbFile) {
  88. do {
  89. clearDb(at: sharedDbFile)
  90. try filemanager.moveItem(at: URL(fileURLWithPath: localDbFile), to: URL(fileURLWithPath: sharedDbFile))
  91. moveBlobsFolder()
  92. } catch let error {
  93. DcContext.shared.logger?.error("Could not update DB location. Share extension will probably not work. \n\(error.localizedDescription)")
  94. return localDbFile
  95. }
  96. }
  97. return sharedDbFile
  98. }
  99. }