| 1 | efrain | 1 | //
 | 
        
           |  |  | 2 | //  QuizDao.swift
 | 
        
           |  |  | 3 | //  twogetskills
 | 
        
           |  |  | 4 | //
 | 
        
           |  |  | 5 | //  Created by Efrain Yanez Recanatini on 2/21/22.
 | 
        
           |  |  | 6 | //
 | 
        
           |  |  | 7 |   | 
        
           | 17 | efrain | 8 | import SwiftUI
 | 
        
           | 1 | efrain | 9 | import SQLite3
 | 
        
           |  |  | 10 |   | 
        
           |  |  | 11 | class QuizDao {
 | 
        
           | 17 | efrain | 12 |     private var database = Environment(\.database).wrappedValue
 | 
        
           | 1 | efrain | 13 |     private let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
 | 
        
           | 17 | efrain | 14 |   | 
        
           | 1 | efrain | 15 |     func selectByUuid(uuid: String)-> QuizModel {
 | 
        
           | 17 | efrain | 16 |         let db = database.open()
 | 
        
           | 1 | efrain | 17 |         var model = QuizModel()
 | 
        
           |  |  | 18 |         var query = "SELECT " + Constants.TABLE_QUIZ_FIELD_UUID + ", "
 | 
        
           |  |  | 19 |         query = query + Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + ", "
 | 
        
           |  |  | 20 |         query = query + Constants.TABLE_QUIZ_FIELD_NAME + ", "
 | 
        
           |  |  | 21 |         query = query + Constants.TABLE_QUIZ_FIELD_TEXT + ", "
 | 
        
           |  |  | 22 |         query = query + Constants.TABLE_QUIZ_FIELD_FAILED + ", "
 | 
        
           |  |  | 23 |         query = query + Constants.TABLE_QUIZ_FIELD_POINTS + ", "
 | 
        
           |  |  | 24 |         query = query + Constants.TABLE_QUIZ_FIELD_MINIMUM_POINTS_REQUIRED + ", "
 | 
        
           |  |  | 25 |         query = query + Constants.TABLE_QUIZ_FIELD_ADDED_ON + ", "
 | 
        
           |  |  | 26 |         query = query + Constants.TABLE_QUIZ_FIELD_UPDATED_ON + ", "
 | 
        
           |  |  | 27 |         query = query + Constants.TABLE_QUIZ_FIELD_MAX_TIME
 | 
        
           |  |  | 28 |         query = query + " FROM " + Constants.TABLE_QUIZ
 | 
        
           |  |  | 29 |         query = query + " WHERE " + Constants.TABLE_QUIZ_FIELD_UUID + " = '\(uuid)' LIMIT 1;"
 | 
        
           |  |  | 30 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 31 |   | 
        
           |  |  | 32 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 33 |             if(sqlite3_step(statement) == SQLITE_ROW) {
 | 
        
           |  |  | 34 |                 model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
 | 
        
           |  |  | 35 |                 model.companyUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
 | 
        
           |  |  | 36 |                 model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
 | 
        
           |  |  | 37 |                 model.text = String(describing: String(cString: sqlite3_column_text(statement, 3)))
 | 
        
           |  |  | 38 |                 model.failed = String(describing: String(cString: sqlite3_column_text(statement, 4)))
 | 
        
           |  |  | 39 |                 model.points = Int(sqlite3_column_int(statement, 5))
 | 
        
           |  |  | 40 |                 model.minimumPointsRequired = Int(sqlite3_column_int(statement, 6))
 | 
        
           |  |  | 41 |                 model.maxTime = Int(sqlite3_column_int(statement, 7))
 | 
        
           |  |  | 42 |                 model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))
 | 
        
           |  |  | 43 |                 model.updatedOn = String(describing: String(cString: sqlite3_column_text(statement, 9)))
 | 
        
           |  |  | 44 |   | 
        
           |  |  | 45 |             }
 | 
        
           |  |  | 46 |         } else {
 | 
        
           | 15 | efrain | 47 |   | 
        
           | 1 | efrain | 48 |         }
 | 
        
           |  |  | 49 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 50 |         return model
 | 
        
           |  |  | 51 |     }
 | 
        
           |  |  | 52 |   | 
        
           |  |  | 53 |     func insert(quiz: QuizModel) {
 | 
        
           | 17 | efrain | 54 |         let db = database.open()
 | 
        
           | 1 | efrain | 55 |         var query = "INSERT INTO " + Constants.TABLE_QUIZ
 | 
        
           |  |  | 56 |         query = query + " ( " + Constants.TABLE_QUIZ_FIELD_UUID + ", "
 | 
        
           |  |  | 57 |         query = query + Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + ", "
 | 
        
           |  |  | 58 |         query = query + Constants.TABLE_QUIZ_FIELD_NAME + ", "
 | 
        
           |  |  | 59 |         query = query + Constants.TABLE_QUIZ_FIELD_TEXT + ", "
 | 
        
           |  |  | 60 |         query = query + Constants.TABLE_QUIZ_FIELD_FAILED + ", "
 | 
        
           |  |  | 61 |         query = query + Constants.TABLE_QUIZ_FIELD_POINTS + ", "
 | 
        
           |  |  | 62 |         query = query + Constants.TABLE_QUIZ_FIELD_MINIMUM_POINTS_REQUIRED + ", "
 | 
        
           |  |  | 63 |         query = query + Constants.TABLE_QUIZ_FIELD_MAX_TIME + ", "
 | 
        
           |  |  | 64 |         query = query + Constants.TABLE_QUIZ_FIELD_ADDED_ON + ", "
 | 
        
           |  |  | 65 |         query = query + Constants.TABLE_QUIZ_FIELD_UPDATED_ON
 | 
        
           |  |  | 66 |         query = query + " ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
 | 
        
           |  |  | 67 |         var statement : OpaquePointer?
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 |             sqlite3_bind_text(statement, 1, quiz.uuid, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 73 |             sqlite3_bind_text(statement, 2, quiz.companyUuid, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 74 |             sqlite3_bind_text(statement, 3, quiz.name , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 75 |             sqlite3_bind_text(statement, 4, quiz.text , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 76 |             sqlite3_bind_text(statement, 5, quiz.failed , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 77 |             sqlite3_bind_int(statement, 6, Int32(quiz.points))
 | 
        
           |  |  | 78 |             sqlite3_bind_int(statement, 7, Int32(quiz.minimumPointsRequired))
 | 
        
           |  |  | 79 |             sqlite3_bind_int(statement, 8, Int32(quiz.maxTime))
 | 
        
           |  |  | 80 |             sqlite3_bind_text(statement, 9, quiz.addedOn , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 81 |             sqlite3_bind_text(statement, 10, quiz.updatedOn , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 82 |   | 
        
           |  |  | 83 |             if (sqlite3_step(statement) != SQLITE_DONE) {
 | 
        
           |  |  | 84 |                 print("No se pudo insertar un registro en la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           | 15 | efrain | 85 |   | 
        
           | 1 | efrain | 86 |             }
 | 
        
           |  |  | 87 |   | 
        
           |  |  | 88 |         } else {
 | 
        
           |  |  | 89 |             print("Fallo la preparación para insertar un registro en la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           | 15 | efrain | 90 |   | 
        
           | 1 | efrain | 91 |         }
 | 
        
           |  |  | 92 |   | 
        
           |  |  | 93 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 94 |     }
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 |     func update(quiz : QuizModel) {
 | 
        
           | 17 | efrain | 97 |         let db = database.open()
 | 
        
           | 1 | efrain | 98 |         var query = "UPDATE " + Constants.TABLE_QUIZ
 | 
        
           |  |  | 99 |         query = query + " SET " + Constants.TABLE_QUIZ_FIELD_NAME + " = '\(quiz.name)', "
 | 
        
           |  |  | 100 |         query = query + Constants.TABLE_QUIZ_FIELD_TEXT + " = '\(quiz.text)', "
 | 
        
           |  |  | 101 |         query = query + Constants.TABLE_QUIZ_FIELD_FAILED + " = '\(quiz.failed)', "
 | 
        
           |  |  | 102 |         query = query + Constants.TABLE_QUIZ_FIELD_POINTS + " = '\(quiz.points)', "
 | 
        
           |  |  | 103 |         query = query + Constants.TABLE_QUIZ_FIELD_MINIMUM_POINTS_REQUIRED + " = '\(quiz.minimumPointsRequired)', "
 | 
        
           |  |  | 104 |         query = query + Constants.TABLE_QUIZ_FIELD_MAX_TIME + " = '\(quiz.maxTime)', "
 | 
        
           |  |  | 105 |         query = query + Constants.TABLE_QUIZ_FIELD_ADDED_ON + " = '\(quiz.addedOn)', "
 | 
        
           |  |  | 106 |         query = query + Constants.TABLE_QUIZ_FIELD_UPDATED_ON + " = '\(quiz.updatedOn)' "
 | 
        
           |  |  | 107 |         query = query + " WHERE " + Constants.TABLE_COMPANY_FIELD_UUID + " = '\(quiz.uuid)';"
 | 
        
           |  |  | 108 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 109 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 110 |             if (sqlite3_step(statement) != SQLITE_DONE) {
 | 
        
           |  |  | 111 |                 print("No se pudo actualizar un registro de la tabla: \(Constants.TABLE_QUIZ) ")
 | 
        
           | 15 | efrain | 112 |   | 
        
           | 1 | efrain | 113 |             }
 | 
        
           |  |  | 114 |         } else {
 | 
        
           |  |  | 115 |             print("Fallo la preparación para actualizar un registro de la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           | 15 | efrain | 116 |   | 
        
           | 1 | efrain | 117 |         }
 | 
        
           |  |  | 118 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 119 |     }
 | 
        
           |  |  | 120 |   | 
        
           |  |  | 121 |     func remove(uuid: String) {
 | 
        
           | 17 | efrain | 122 |         let db = database.open()
 | 
        
           | 1 | efrain | 123 |         let query = "DELETE FROM " + Constants.TABLE_QUIZ +
 | 
        
           |  |  | 124 |             " WHERE " + Constants.TABLE_QUIZ_FIELD_UUID + " = '\(uuid)' ;"
 | 
        
           |  |  | 125 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 126 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 127 |             if (sqlite3_step(statement) != SQLITE_DONE) {
 | 
        
           |  |  | 128 |                 print("No se pudo borrar el registro con el uuid: \(uuid)  de la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           | 15 | efrain | 129 |   | 
        
           | 1 | efrain | 130 |             }
 | 
        
           |  |  | 131 |         } else {
 | 
        
           |  |  | 132 |             print("Fallo la preparación para borrar el registro con el uuid: \(uuid) de la tabla \(Constants.TABLE_QUIZ) ")
 | 
        
           | 15 | efrain | 133 |   | 
        
           | 1 | efrain | 134 |         }
 | 
        
           |  |  | 135 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 136 |     }
 | 
        
           |  |  | 137 |   | 
        
           |  |  | 138 |     func removeAll() {
 | 
        
           | 17 | efrain | 139 |         let db = database.open()
 | 
        
           | 1 | efrain | 140 |         let query = "DELETE FROM " + Constants.TABLE_QUIZ + ";"
 | 
        
           |  |  | 141 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 142 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 143 |             if (sqlite3_step(statement) != SQLITE_DONE) {
 | 
        
           |  |  | 144 |                 print("No se pudo borrar todos los registros de la tabla: \(Constants.TABLE_QUIZ) ")
 | 
        
           | 15 | efrain | 145 |   | 
        
           | 1 | efrain | 146 |             }
 | 
        
           |  |  | 147 |         } else {
 | 
        
           |  |  | 148 |             print("Fallo la preparación de borrar todos los registros de la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           | 15 | efrain | 149 |   | 
        
           | 1 | efrain | 150 |         }
 | 
        
           |  |  | 151 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 152 |     }
 | 
        
           |  |  | 153 |   | 
        
           |  |  | 154 | }
 |