| 1 | efrain | 1 | //
 | 
        
           |  |  | 2 | //  AnswerDao.swift
 | 
        
           |  |  | 3 | //  twogetskills
 | 
        
           |  |  | 4 | //
 | 
        
           |  |  | 5 | //  Created by Efrain Yanez Recanatini on 2/21/22.
 | 
        
           |  |  | 6 | //
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | import UIKit
 | 
        
           |  |  | 9 | import SQLite3
 | 
        
           | 17 | efrain | 10 | import SwiftUI
 | 
        
           | 1 | efrain | 11 |   | 
        
           | 17 | efrain | 12 |   | 
        
           | 1 | efrain | 13 | class AnswerDao {
 | 
        
           | 17 | efrain | 14 |     private var database = Environment(\.database).wrappedValue
 | 
        
           | 1 | efrain | 15 |     private let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
 | 
        
           | 17 | efrain | 16 |   | 
        
           | 1 | efrain | 17 |   | 
        
           | 15 | efrain | 18 |     func insert(answer : AnswerModel) {
 | 
        
           | 17 | efrain | 19 |         let db = database.open()
 | 
        
           | 1 | efrain | 20 |         var query = "INSERT INTO " + Constants.TABLE_ANSWER + " ( "
 | 
        
           |  |  | 21 |         query = query + Constants.TABLE_ANSWER_FIELD_UUID + ", "
 | 
        
           |  |  | 22 |         query = query + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + ", "
 | 
        
           |  |  | 23 |         query = query + Constants.TABLE_ANSWER_FIELD_TEXT + ", "
 | 
        
           |  |  | 24 |         query = query + Constants.TABLE_ANSWER_FIELD_POINTS + ", "
 | 
        
           |  |  | 25 |         query = query + Constants.TABLE_ANSWER_FIELD_CORRECT + ", "
 | 
        
           |  |  | 26 |         query = query + Constants.TABLE_ANSWER_FIELD_ADDED_ON + ", "
 | 
        
           |  |  | 27 |         query = query + Constants.TABLE_ANSWER_FIELD_UPDATED_ON
 | 
        
           |  |  | 28 |         query = query +  ") VALUES (?, ?, ?, ?, ?, ?, ?);"
 | 
        
           |  |  | 29 |         var statement : OpaquePointer?
 | 
        
           |  |  | 30 |   | 
        
           |  |  | 31 |         if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK {
 | 
        
           |  |  | 32 |             sqlite3_bind_text(statement, 1, answer.uuid, -1 , SQLITE_TRANSIENT)
 | 
        
           |  |  | 33 |             sqlite3_bind_text(statement, 2, answer.questionUuid, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 34 |             sqlite3_bind_text(statement, 3, answer.text , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 35 |             sqlite3_bind_int(statement, 4, Int32(answer.points))
 | 
        
           |  |  | 36 |             sqlite3_bind_int(statement, 5, Int32(answer.correct))
 | 
        
           |  |  | 37 |             sqlite3_bind_text(statement, 6, answer.addedOn , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 38 |             sqlite3_bind_text(statement, 7, answer.updatedOn , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 39 |   | 
        
           |  |  | 40 |   | 
        
           |  |  | 41 |            if sqlite3_step(statement) != SQLITE_DONE {
 | 
        
           |  |  | 42 |                 print("No se pudo insertar un registro en la tabla: \(Constants.TABLE_ANSWER) ")
 | 
        
           | 15 | efrain | 43 |   | 
        
           | 1 | efrain | 44 |            }
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 |         } else {
 | 
        
           |  |  | 47 |             print("Fallo la preparación del insertar en la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           | 15 | efrain | 48 |   | 
        
           | 1 | efrain | 49 |         }
 | 
        
           |  |  | 50 |   | 
        
           |  |  | 51 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 52 |      }
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 |   | 
        
           |  |  | 55 |   | 
        
           |  |  | 56 |     func selectAllByQuestionUuid(questionUuid: String)-> [AnswerModel] {
 | 
        
           | 17 | efrain | 57 |         let db = database.open()
 | 
        
           | 1 | efrain | 58 |         var records = [AnswerModel]()
 | 
        
           |  |  | 59 |   | 
        
           |  |  | 60 |         var query = "SELECT " + Constants.TABLE_ANSWER_FIELD_UUID + " , "
 | 
        
           |  |  | 61 |         query = query + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + ", "
 | 
        
           |  |  | 62 |         query = query + Constants.TABLE_ANSWER_FIELD_TEXT + ", "
 | 
        
           |  |  | 63 |         query = query + Constants.TABLE_ANSWER_FIELD_POINTS + " , "
 | 
        
           |  |  | 64 |         query = query + Constants.TABLE_ANSWER_FIELD_CORRECT + " , "
 | 
        
           |  |  | 65 |         query = query + Constants.TABLE_ANSWER_FIELD_ADDED_ON + " , "
 | 
        
           |  |  | 66 |         query = query + Constants.TABLE_ANSWER_FIELD_UPDATED_ON
 | 
        
           |  |  | 67 |         query = query + " FROM " + Constants.TABLE_ANSWER
 | 
        
           |  |  | 68 |         query = query + " WHERE " + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + " = '\(questionUuid)' ;"
 | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 |         if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK{
 | 
        
           |  |  | 73 |             while sqlite3_step(statement) == SQLITE_ROW {
 | 
        
           |  |  | 74 |                 var model = AnswerModel()
 | 
        
           |  |  | 75 |                 model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
 | 
        
           |  |  | 76 |                 model.questionUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
 | 
        
           |  |  | 77 |                 model.text = String(describing: String(cString: sqlite3_column_text(statement, 2)))
 | 
        
           |  |  | 78 |                 model.points = Int(sqlite3_column_int(statement, 3))
 | 
        
           |  |  | 79 |                 model.correct = Int(sqlite3_column_int(statement, 4))
 | 
        
           |  |  | 80 |                 model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 5)))
 | 
        
           |  |  | 81 |                 model.updatedOn = String(describing: String(cString: sqlite3_column_text(statement, 6)))
 | 
        
           |  |  | 82 |   | 
        
           |  |  | 83 |                 records.append(model)
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 |             }
 | 
        
           |  |  | 86 |         } else {
 | 
        
           | 15 | efrain | 87 |   | 
        
           | 1 | efrain | 88 |         }
 | 
        
           |  |  | 89 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 90 |         return records
 | 
        
           |  |  | 91 |     }
 | 
        
           |  |  | 92 |   | 
        
           |  |  | 93 |     func selectByUuid(uuid : String) -> AnswerModel {
 | 
        
           | 17 | efrain | 94 |         let db = database.open()
 | 
        
           | 1 | efrain | 95 |         var model = AnswerModel()
 | 
        
           |  |  | 96 |         var query = "SELECT " + Constants.TABLE_ANSWER_FIELD_UUID + " , "
 | 
        
           |  |  | 97 |         query = query + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + ", "
 | 
        
           |  |  | 98 |         query = query + Constants.TABLE_ANSWER_FIELD_TEXT + ", "
 | 
        
           |  |  | 99 |         query = query + Constants.TABLE_ANSWER_FIELD_POINTS + " , "
 | 
        
           |  |  | 100 |         query = query + Constants.TABLE_ANSWER_FIELD_CORRECT + " , "
 | 
        
           |  |  | 101 |         query = query + Constants.TABLE_ANSWER_FIELD_ADDED_ON + " , "
 | 
        
           |  |  | 102 |         query = query + Constants.TABLE_ANSWER_FIELD_UPDATED_ON
 | 
        
           |  |  | 103 |         query = query + " FROM " + Constants.TABLE_ANSWER
 | 
        
           |  |  | 104 |         query = query + " WHERE " + Constants.TABLE_ANSWER_FIELD_UUID + " = '\(uuid)' ;"
 | 
        
           |  |  | 105 |   | 
        
           |  |  | 106 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 107 |         if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK{
 | 
        
           |  |  | 108 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 109 |                 model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
 | 
        
           |  |  | 110 |                 model.questionUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
 | 
        
           |  |  | 111 |                 model.text = String(describing: String(cString: sqlite3_column_text(statement, 2)))
 | 
        
           |  |  | 112 |                 model.points = Int(sqlite3_column_int(statement, 3))
 | 
        
           |  |  | 113 |                 model.correct = Int(sqlite3_column_int(statement, 4))
 | 
        
           |  |  | 114 |                 model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 5)))
 | 
        
           |  |  | 115 |                 model.updatedOn = String(describing: String(cString: sqlite3_column_text(statement, 6)))
 | 
        
           |  |  | 116 |   | 
        
           |  |  | 117 |             }
 | 
        
           |  |  | 118 |         } else {
 | 
        
           | 15 | efrain | 119 |   | 
        
           | 1 | efrain | 120 |         }
 | 
        
           |  |  | 121 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 122 |         return model
 | 
        
           |  |  | 123 |     }
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 |     func update( answerModel: AnswerModel) {
 | 
        
           | 17 | efrain | 126 |         let db = database.open()
 | 
        
           | 1 | efrain | 127 |         var query = "UPDATE" + Constants.TABLE_SYNC
 | 
        
           |  |  | 128 |         query = query + " SET " + Constants.TABLE_ANSWER_FIELD_TEXT + " =  ?, "
 | 
        
           |  |  | 129 |         query = query + Constants.TABLE_ANSWER_FIELD_POINTS + " = ?, "
 | 
        
           |  |  | 130 |         query = query + Constants.TABLE_ANSWER_FIELD_CORRECT + " = ?, "
 | 
        
           |  |  | 131 |         query = query + Constants.TABLE_ANSWER_FIELD_ADDED_ON + " = ?, "
 | 
        
           |  |  | 132 |         query = query + Constants.TABLE_ANSWER_FIELD_UPDATED_ON + " = ? "
 | 
        
           |  |  | 133 |         query = query + "  WHERE " + Constants.TABLE_ANSWER_FIELD_UUID + "  = ? "
 | 
        
           |  |  | 134 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 135 |         if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK{
 | 
        
           |  |  | 136 |   | 
        
           |  |  | 137 |             sqlite3_bind_text(statement, 0, answerModel.text , -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 138 |             sqlite3_bind_int(statement, 1, Int32(answerModel.points))
 | 
        
           |  |  | 139 |             sqlite3_bind_int(statement, 2, Int32(answerModel.correct))
 | 
        
           |  |  | 140 |             sqlite3_bind_text(statement, 3, answerModel.addedOn, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 141 |             sqlite3_bind_text(statement, 4, answerModel.updatedOn, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 142 |             sqlite3_bind_text(statement, 5, answerModel.uuid, -1, SQLITE_TRANSIENT)
 | 
        
           |  |  | 143 |   | 
        
           |  |  | 144 |             if sqlite3_step(statement) != SQLITE_DONE {
 | 
        
           |  |  | 145 |                 print("No se pudo actualizar un registro de la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           | 15 | efrain | 146 |   | 
        
           | 1 | efrain | 147 |             }
 | 
        
           |  |  | 148 |         } else {
 | 
        
           |  |  | 149 |             print("Fallo la preparación de actualizar un registro en la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           | 15 | efrain | 150 |   | 
        
           | 1 | efrain | 151 |         }
 | 
        
           |  |  | 152 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 153 |     }
 | 
        
           |  |  | 154 |   | 
        
           |  |  | 155 |   | 
        
           |  |  | 156 |     func remove(uuid : String) {
 | 
        
           | 17 | efrain | 157 |         let db = database.open()
 | 
        
           | 1 | efrain | 158 |         let query = "DELETE FROM " + Constants.TABLE_ANSWER +
 | 
        
           |  |  | 159 |             " WHERE " + Constants.TABLE_ANSWER_FIELD_UUID + " = '\(uuid)' ;"
 | 
        
           | 15 | efrain | 160 |   | 
        
           | 1 | efrain | 161 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 162 |         if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
 | 
        
           |  |  | 163 |             if (sqlite3_step(statement) != SQLITE_DONE) {
 | 
        
           |  |  | 164 |                 print("No se pudo borrar el registro con el uuid: \(uuid) de la tabla: \(Constants.TABLE_ANSWER) ")
 | 
        
           |  |  | 165 |   | 
        
           | 15 | efrain | 166 |   | 
        
           | 1 | efrain | 167 |             }
 | 
        
           |  |  | 168 |         } else {
 | 
        
           |  |  | 169 |             print("Fallo la preparación para borrar un registro de la tabla \(Constants.TABLE_ANSWER) ")
 | 
        
           |  |  | 170 |   | 
        
           | 15 | efrain | 171 |   | 
        
           | 1 | efrain | 172 |         }
 | 
        
           |  |  | 173 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 174 |     }
 | 
        
           |  |  | 175 |   | 
        
           |  |  | 176 |     func removeAll() {
 | 
        
           | 17 | efrain | 177 |         let db = database.open()
 | 
        
           | 1 | efrain | 178 |         let query = "DELETE FROM " + Constants.TABLE_ANSWER + ";"
 | 
        
           |  |  | 179 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 180 |         if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK{
 | 
        
           |  |  | 181 |             if sqlite3_step(statement) != SQLITE_DONE {
 | 
        
           |  |  | 182 |                 print("No se pudieron borrar todos los registros de la tabla: \(Constants.TABLE_ANSWER) ")
 | 
        
           |  |  | 183 |   | 
        
           | 15 | efrain | 184 |   | 
        
           | 1 | efrain | 185 |             }
 | 
        
           |  |  | 186 |         } else {
 | 
        
           |  |  | 187 |             print("Fallo la preparación para borrar todos los registros de la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           |  |  | 188 |   | 
        
           | 15 | efrain | 189 |   | 
        
           | 1 | efrain | 190 |         }
 | 
        
           |  |  | 191 |         sqlite3_finalize(statement)
 | 
        
           |  |  | 192 |     }
 | 
        
           |  |  | 193 |   | 
        
           |  |  | 194 | }
 |