kopyl

Untitled

Jul 31st, 2025
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 7.40 KB | None | 0 0
  1. import Foundation
  2. import SQLite3
  3.  
  4. enum SleepRecordTypes: Int {
  5.     case wentToSleep = 0
  6.     case confusionalArousal = 1
  7.     case wokeUp = 2
  8.     case note = 3
  9. }
  10.  
  11. class DatabaseManager {
  12.     static let shared = DatabaseManager()
  13.     private var db: OpaquePointer?
  14.     private let dbName = "SleepJournal.sqlite"
  15.    
  16.     private init() {
  17.         openDatabase()
  18.         createTableIfNeeded()
  19.     }
  20.    
  21.     private func getDocumentsDirectory() -> URL {
  22.         FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
  23.     }
  24.    
  25.     private func openDatabase() {
  26.         let fileURL = getDocumentsDirectory().appendingPathComponent(dbName)
  27.        
  28.         if sqlite3_open(fileURL.path, &db) == SQLITE_OK {
  29.             print("Successfully opened connection to database at \(fileURL.path)")
  30.         } else {
  31.             print("Unable to open database")
  32.         }
  33.     }
  34.    
  35.     private func createTableIfNeeded() {
  36.         let createTableString = """
  37.            CREATE TABLE IF NOT EXISTS records (
  38.                record_id TEXT PRIMARY KEY,
  39.                record_type INTEGER CHECK (record_type IN (0, 1, 2, 3)),
  40.                time_user_entered TIME,
  41.                created_at DATETIME,
  42.                updated_at DATETIME,
  43.                remote_id TEXT,
  44.                note TEXT,
  45.                is_note_only BOOLEAN
  46.            );
  47.        """
  48.        
  49.         var createTableStatement: OpaquePointer?
  50.         if sqlite3_prepare_v2(db, createTableString, -1, &createTableStatement, nil) == SQLITE_OK {
  51.             if sqlite3_step(createTableStatement) == SQLITE_DONE {
  52.                 print("Records table created successfully")
  53.             } else {
  54.                 print("Records table could not be created")
  55.             }
  56.         } else {
  57.             print("CREATE TABLE statement could not be prepared")
  58.         }
  59.         sqlite3_finalize(createTableStatement)
  60.     }
  61.    
  62.     func addSleepRecord(type: SleepRecordTypes, datetimeUserEntered: Date, note: String? = nil, isNoteOnly: Bool = false) {
  63.         let insertString = """
  64.            INSERT INTO records (record_id, record_type, time_user_entered, created_at, updated_at, remote_id, note, is_note_only)
  65.            VALUES (?, ?, ?, ?, ?, ?, ?, ?);
  66.        """
  67.        
  68.         var insertStatement: OpaquePointer?
  69.         if sqlite3_prepare_v2(db, insertString, -1, &insertStatement, nil) == SQLITE_OK {
  70.             let recordId = UUID().uuidString
  71.             let currentDate = Date()
  72.             let dateFormatter = DateFormatter()
  73.             dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
  74.            
  75.             sqlite3_bind_text(insertStatement, 1, recordId, -1, nil)
  76.             sqlite3_bind_int(insertStatement, 2, Int32(type.rawValue))
  77.             sqlite3_bind_text(insertStatement, 3, dateFormatter.string(from: datetimeUserEntered), -1, nil)
  78.             sqlite3_bind_text(insertStatement, 4, dateFormatter.string(from: currentDate), -1, nil)
  79.             sqlite3_bind_text(insertStatement, 5, dateFormatter.string(from: currentDate), -1, nil)
  80.             sqlite3_bind_null(insertStatement, 6)
  81.            
  82.             if let note = note {
  83.                 sqlite3_bind_text(insertStatement, 7, note, -1, nil)
  84.             } else {
  85.                 sqlite3_bind_null(insertStatement, 7)
  86.             }
  87.            
  88.             sqlite3_bind_int(insertStatement, 8, isNoteOnly ? 1 : 0)
  89.            
  90.             if sqlite3_step(insertStatement) == SQLITE_DONE {
  91.                 print("Successfully inserted record")
  92.             } else {
  93.                 print("Could not insert record")
  94.             }
  95.         } else {
  96.             print("INSERT statement could not be prepared")
  97.         }
  98.         sqlite3_finalize(insertStatement)
  99.     }
  100.    
  101.     func deleteSleepRecord(record_id: UUID) -> Bool {
  102.         let deleteString = "DELETE FROM records WHERE record_id = ?;"
  103.        
  104.         var deleteStatement: OpaquePointer?
  105.         if sqlite3_prepare_v2(db, deleteString, -1, &deleteStatement, nil) == SQLITE_OK {
  106.             sqlite3_bind_text(deleteStatement, 1, record_id.uuidString, -1, nil)
  107.            
  108.             if sqlite3_step(deleteStatement) == SQLITE_DONE {
  109.                 sqlite3_finalize(deleteStatement)
  110.                 return true
  111.             }
  112.         }
  113.         sqlite3_finalize(deleteStatement)
  114.         return false
  115.     }
  116.    
  117.     func updateSleepRecord(record_id: UUID, record_type: SleepRecordTypes? = nil, time_user_entered: Date? = nil, remote_id: UUID? = nil, note: String? = nil) {
  118.         var updateFields: [String] = ["updated_at = ?"]
  119.         var paramIndex = 2
  120.        
  121.         if record_type != nil {
  122.             updateFields.append("record_type = ?")
  123.         }
  124.         if time_user_entered != nil {
  125.             updateFields.append("time_user_entered = ?")
  126.         }
  127.         if remote_id != nil {
  128.             updateFields.append("remote_id = ?")
  129.         }
  130.         if note != nil {
  131.             updateFields.append("note = ?")
  132.         }
  133.        
  134.         let updateString = "UPDATE records SET \(updateFields.joined(separator: ", ")) WHERE record_id = ?;"
  135.        
  136.         var updateStatement: OpaquePointer?
  137.         if sqlite3_prepare_v2(db, updateString, -1, &updateStatement, nil) == SQLITE_OK {
  138.             let dateFormatter = DateFormatter()
  139.             dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
  140.            
  141.             sqlite3_bind_text(updateStatement, 1, dateFormatter.string(from: Date()), -1, nil)
  142.            
  143.             if let recordType = record_type {
  144.                 sqlite3_bind_int(updateStatement, Int32(paramIndex), Int32(recordType.rawValue))
  145.                 paramIndex += 1
  146.             }
  147.            
  148.             if let timeUserEntered = time_user_entered {
  149.                 sqlite3_bind_text(updateStatement, Int32(paramIndex), dateFormatter.string(from: timeUserEntered), -1, nil)
  150.                 paramIndex += 1
  151.             }
  152.            
  153.             if let remoteId = remote_id {
  154.                 sqlite3_bind_text(updateStatement, Int32(paramIndex), remoteId.uuidString, -1, nil)
  155.                 paramIndex += 1
  156.             }
  157.            
  158.             if let note = note {
  159.                 sqlite3_bind_text(updateStatement, Int32(paramIndex), note, -1, nil)
  160.                 paramIndex += 1
  161.             }
  162.            
  163.             sqlite3_bind_text(updateStatement, Int32(paramIndex), record_id.uuidString, -1, nil)
  164.            
  165.             if sqlite3_step(updateStatement) == SQLITE_DONE {
  166.                 print("Successfully updated record")
  167.             } else {
  168.                 print("Could not update record")
  169.             }
  170.         } else {
  171.             print("UPDATE statement could not be prepared")
  172.         }
  173.         sqlite3_finalize(updateStatement)
  174.     }
  175.    
  176.     func wipeDatabase() {
  177.         let dropTableString = "DROP TABLE IF EXISTS records;"
  178.        
  179.         var dropTableStatement: OpaquePointer?
  180.         if sqlite3_prepare_v2(db, dropTableString, -1, &dropTableStatement, nil) == SQLITE_OK {
  181.             if sqlite3_step(dropTableStatement) == SQLITE_DONE {
  182.                 print("Successfully wiped database")
  183.                 createTableIfNeeded()
  184.             } else {
  185.                 print("Could not wipe database")
  186.             }
  187.         } else {
  188.             print("DROP TABLE statement could not be prepared")
  189.         }
  190.         sqlite3_finalize(dropTableStatement)
  191.     }
  192.    
  193.     deinit {
  194.         sqlite3_close(db)
  195.     }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment