| 1 | efrain | 1 | //
 | 
        
           |  |  | 2 | //  Database.swift
 | 
        
           |  |  | 3 | //  twogetskills
 | 
        
           |  |  | 4 | //
 | 
        
           |  |  | 5 | //  Created by Efrain Yanez Recanatini on 2/21/22.
 | 
        
           |  |  | 6 | //
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | import Foundation
 | 
        
           |  |  | 9 | import SQLite3
 | 
        
           |  |  | 10 |   | 
        
           | 17 | efrain | 11 | class Database : ObservableObject {
 | 
        
           | 1 | efrain | 12 |   | 
        
           | 15 | efrain | 13 |   | 
        
           | 17 | efrain | 14 |   | 
        
           |  |  | 15 |     @Published var db : OpaquePointer? = nil
 | 
        
           | 1 | efrain | 16 |   | 
        
           | 17 | efrain | 17 |   | 
        
           | 1 | efrain | 18 |     static let sharedInstance: Database = {
 | 
        
           |  |  | 19 |            let instance = Database()
 | 
        
           |  |  | 20 |   | 
        
           |  |  | 21 |            return instance
 | 
        
           |  |  | 22 |     }()
 | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 |     public func createTables()
 | 
        
           |  |  | 26 |     {
 | 
        
           | 15 | efrain | 27 |         if(self.db != nil) {
 | 
        
           | 1 | efrain | 28 |             self.createTableApp()
 | 
        
           |  |  | 29 |             self.createTableSync()
 | 
        
           |  |  | 30 |             self.createTableProgress()
 | 
        
           |  |  | 31 |             self.createTableUserLog()
 | 
        
           |  |  | 32 |             self.createTableCompany()
 | 
        
           |  |  | 33 |             self.createTableTopic()
 | 
        
           |  |  | 34 |             self.createTableCapsule()
 | 
        
           |  |  | 35 |             self.createTableSlide()
 | 
        
           |  |  | 36 |             self.createTableQuiz()
 | 
        
           |  |  | 37 |             self.createTableQuestion()
 | 
        
           |  |  | 38 |             self.createTableAnswer()
 | 
        
           |  |  | 39 |             self.createTableUserExtended()
 | 
        
           |  |  | 40 |             self.createTableUserNotification()
 | 
        
           |  |  | 41 |         }
 | 
        
           |  |  | 42 |     }
 | 
        
           |  |  | 43 |   | 
        
           |  |  | 44 |     public func open() -> OpaquePointer? {
 | 
        
           | 15 | efrain | 45 |         if self.db == nil {
 | 
        
           | 17 | efrain | 46 |   | 
        
           | 1 | efrain | 47 |             let filePath = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
 | 
        
           | 17 | efrain | 48 |                 .appendingPathComponent(Config.DATABASE_FILENAME)
 | 
        
           | 1 | efrain | 49 |   | 
        
           | 15 | efrain | 50 |             if sqlite3_open(filePath.path, &self.db) == SQLITE_OK {
 | 
        
           |  |  | 51 |   | 
        
           | 17 | efrain | 52 |                 self.createTables();
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 |                 print("Se abrio la conexión con la db : \(filePath.absoluteString) ")
 | 
        
           |  |  | 55 |                 return self.db
 | 
        
           |  |  | 56 |   | 
        
           | 15 | efrain | 57 |             } else {
 | 
        
           | 17 | efrain | 58 |                 print("No se pudo abrir la db : \(filePath.absoluteString) ")
 | 
        
           | 1 | efrain | 59 |                 return nil
 | 
        
           |  |  | 60 |             }
 | 
        
           | 17 | efrain | 61 |         } else {
 | 
        
           |  |  | 62 |             return self.db
 | 
        
           | 1 | efrain | 63 |         }
 | 
        
           | 15 | efrain | 64 |   | 
        
           | 17 | efrain | 65 |   | 
        
           | 1 | efrain | 66 |   | 
        
           |  |  | 67 |     }
 | 
        
           |  |  | 68 |   | 
        
           | 15 | efrain | 69 |     public func close() -> Void
 | 
        
           |  |  | 70 |     {
 | 
        
           |  |  | 71 |         if self.db == nil {
 | 
        
           |  |  | 72 |             print("No se pudo cerrar la conexión, no es un recurso valida")
 | 
        
           |  |  | 73 |             return
 | 
        
           |  |  | 74 |         }
 | 
        
           |  |  | 75 |   | 
        
           |  |  | 76 |   | 
        
           |  |  | 77 |         if sqlite3_close(db) == SQLITE_OK {
 | 
        
           |  |  | 78 |             print("Se cerro la conexión de la base de datos")
 | 
        
           |  |  | 79 |             self.db = nil
 | 
        
           |  |  | 80 |         } else {
 | 
        
           |  |  | 81 |             print("No se pudo cerrar la conexión de la base de datos")
 | 
        
           |  |  | 82 |         }
 | 
        
           |  |  | 83 |     }
 | 
        
           | 1 | efrain | 84 |   | 
        
           |  |  | 85 |   | 
        
           | 15 | efrain | 86 |   | 
        
           | 17 | efrain | 87 |     private func executeMultiQuery(queries: [String]) -> Void {
 | 
        
           |  |  | 88 |   | 
        
           | 1 | efrain | 89 |   | 
        
           | 17 | efrain | 90 |         for query  in queries {
 | 
        
           | 1 | efrain | 91 |             var statement : OpaquePointer? = nil
 | 
        
           |  |  | 92 |   | 
        
           | 15 | efrain | 93 |             if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 17 | efrain | 94 |                 if sqlite3_step(statement) != SQLITE_DONE {
 | 
        
           | 1 | efrain | 95 |                     print("Fallo la consulta: \(query) ")
 | 
        
           |  |  | 96 |                 }
 | 
        
           |  |  | 97 |             } else {
 | 
        
           |  |  | 98 |                 print("Fallo la preparación: \(query) ")
 | 
        
           |  |  | 99 |             }
 | 
        
           |  |  | 100 |         }
 | 
        
           |  |  | 101 |     }
 | 
        
           |  |  | 102 |   | 
        
           |  |  | 103 |   | 
        
           | 15 | efrain | 104 |     private func createTableApp() -> Void
 | 
        
           | 1 | efrain | 105 |     {
 | 
        
           |  |  | 106 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_APP + " ("
 | 
        
           |  |  | 107 |         sql = sql + Constants.TABLE_APP_FIELD_ID + " INTEGER NOT NULL, "
 | 
        
           |  |  | 108 |         sql = sql + Constants.TABLE_APP_FIELD_DEVICE_UUID + " TEXT, "
 | 
        
           |  |  | 109 |         sql = sql + Constants.TABLE_APP_FIELD_DEVICE_AES + " TEXT, "
 | 
        
           |  |  | 110 |         sql = sql + Constants.TABLE_APP_FIELD_DEVICE_PASSWORD + " TEXT, "
 | 
        
           |  |  | 111 |         sql = sql + Constants.TABLE_APP_FIELD_USER_UUID + " TEXT, "
 | 
        
           |  |  | 112 |         sql = sql + Constants.TABLE_APP_FIELD_USER_FIRSTNAME + " TEXT, "
 | 
        
           |  |  | 113 |         sql = sql + Constants.TABLE_APP_FIELD_USER_LASTNAME + " TEXT, "
 | 
        
           |  |  | 114 |         sql = sql + Constants.TABLE_APP_FIELD_USER_EMAIL + " TEXT, "
 | 
        
           |  |  | 115 |         sql = sql + Constants.TABLE_APP_FIELD_USER_IMAGE + " TEXT, "
 | 
        
           |  |  | 116 |         sql = sql + Constants.TABLE_APP_FIELD_FCM_TOKEN + " TEXT, "
 | 
        
           |  |  | 117 |         sql = sql + Constants.TABLE_APP_FIELD_TOPIC_UUID_ACTIVE + " TEXT, "
 | 
        
           |  |  | 118 |         sql = sql + Constants.TABLE_APP_FIELD_CAPSULE_UUID_ACTIVE + " TEXT, "
 | 
        
           |  |  | 119 |         sql = sql + Constants.TABLE_APP_FIELD_CAPSULE_UUID_OLD + " TEXT, "
 | 
        
           |  |  | 120 |         sql = sql + Constants.TABLE_APP_FIELD_SLIDE_UUID_ACTIVE + " TEXT, "
 | 
        
           |  |  | 121 |         sql = sql + Constants.TABLE_APP_FIELD_COMPANY_UUID_ACTIVE + " TEXT, "
 | 
        
           |  |  | 122 |         sql = sql + Constants.TABLE_APP_FIELD_MAX_DATE_CHANGES + " TEXT, "
 | 
        
           |  |  | 123 |         sql = sql + Constants.TABLE_APP_FIELD_LAST_CHECK_CHANGES + " TEXT, "
 | 
        
           |  |  | 124 |         sql = sql + Constants.TABLE_APP_FIELD_URL_EXTERNAL_DOWNLOADED + " TEXT, "
 | 
        
           |  |  | 125 |         sql = sql + Constants.TABLE_APP_FIELD_REFRESH_CONTENT_MESSAGE + " INTEGER, "
 | 
        
           |  |  | 126 |         sql = sql + Constants.TABLE_APP_FIELD_REFRESH_CONTENT_MESSAGE_SHOW_PENDING + " INTEGER, "
 | 
        
           |  |  | 127 |         sql = sql + Constants.TABLE_APP_FIELD_REFRESH_CONTENT_ACTION_REQUIRED + " INTEGER, "
 | 
        
           |  |  | 128 |         sql = sql + Constants.TABLE_APP_FIELD_SIGNOUT_ACTION_REQUIRED + " INTEGER, "
 | 
        
           |  |  | 129 |         sql = sql + " PRIMARY KEY(`" +  Constants.TABLE_APP_FIELD_ID + "`) "
 | 
        
           |  |  | 130 |         sql = sql + ");"
 | 
        
           |  |  | 131 |   | 
        
           |  |  | 132 |   | 
        
           |  |  | 133 |   | 
        
           |  |  | 134 |   | 
        
           |  |  | 135 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 136 |   | 
        
           | 15 | efrain | 137 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 138 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 139 |   | 
        
           |  |  | 140 |                 let queries = [
 | 
        
           | 14 | efrain | 141 |                     "CREATE INDEX IF NOT EXISTS `idx_app_id` ON `" +  Constants.TABLE_APP + "` (`" +  Constants.TABLE_APP_FIELD_ID + "` );",
 | 
        
           | 1 | efrain | 142 |   | 
        
           | 14 | efrain | 143 |                     "CREATE INDEX IF NOT EXISTS `idx_app_user_uuid` ON `" +  Constants.TABLE_APP + "` (`" +  Constants.TABLE_APP_FIELD_USER_UUID + "` );",
 | 
        
           | 1 | efrain | 144 |   | 
        
           | 14 | efrain | 145 |                     "CREATE INDEX IF NOT EXISTS `idx_app_device_uuid` ON `" +  Constants.TABLE_APP + "` (`" +  Constants.TABLE_APP_FIELD_DEVICE_UUID + "` );"
 | 
        
           | 1 | efrain | 146 |                 ]
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 |   | 
        
           |  |  | 151 |             } else {
 | 
        
           |  |  | 152 |                 print("No se pudo crear la tabla: \(Constants.TABLE_APP)")
 | 
        
           |  |  | 153 |   | 
        
           | 15 | efrain | 154 |   | 
        
           | 1 | efrain | 155 |             }
 | 
        
           |  |  | 156 |         } else {
 | 
        
           |  |  | 157 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_APP)")
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 |   | 
        
           | 15 | efrain | 160 |   | 
        
           | 1 | efrain | 161 |         }
 | 
        
           |  |  | 162 |     }
 | 
        
           |  |  | 163 |   | 
        
           | 15 | efrain | 164 |     private func createTableUserNotification() -> Void
 | 
        
           | 1 | efrain | 165 |     {
 | 
        
           |  |  | 166 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_USER_NOTIFICATION + "("
 | 
        
           |  |  | 167 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " INTEGER NOT NULL, "
 | 
        
           |  |  | 168 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " TEXT,"
 | 
        
           |  |  | 169 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + " TEXT,"
 | 
        
           |  |  | 170 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + " TEXT,"
 | 
        
           |  |  | 171 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " TEXT, "
 | 
        
           |  |  | 172 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " INTEGER, "
 | 
        
           |  |  | 173 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " TEXT, "
 | 
        
           |  |  | 174 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " TEXT, "
 | 
        
           |  |  | 175 |         sql = sql + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON + " TEXT, "
 | 
        
           |  |  | 176 |         sql = sql + " PRIMARY KEY(`" +  Constants.TABLE_USER_NOTIFICATION_FIELD_ID + "`) "
 | 
        
           |  |  | 177 |         sql = sql + ");"
 | 
        
           |  |  | 178 |   | 
        
           |  |  | 179 |   | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 182 |   | 
        
           | 15 | efrain | 183 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 184 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 185 |   | 
        
           |  |  | 186 |                 let queries = [
 | 
        
           | 14 | efrain | 187 |                     "CREATE INDEX IF NOT EXISTS `idx_user_unotification_id` ON `" +  Constants.TABLE_USER_NOTIFICATION + "` (`" +  Constants.TABLE_USER_NOTIFICATION_FIELD_ID + "` );",
 | 
        
           | 1 | efrain | 188 |   | 
        
           | 14 | efrain | 189 |                     "CREATE INDEX IF NOT EXISTS `idx_user_notification_user_uuid` ON `" +  Constants.TABLE_USER_NOTIFICATION + "` (`" +  Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + "` );"
 | 
        
           | 1 | efrain | 190 |                 ]
 | 
        
           |  |  | 191 |   | 
        
           |  |  | 192 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 193 |   | 
        
           |  |  | 194 |             } else {
 | 
        
           |  |  | 195 |                 print("No se pudo crear la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
 | 
        
           |  |  | 196 |   | 
        
           | 15 | efrain | 197 |   | 
        
           | 1 | efrain | 198 |             }
 | 
        
           |  |  | 199 |         } else {
 | 
        
           |  |  | 200 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
 | 
        
           |  |  | 201 |   | 
        
           | 15 | efrain | 202 |   | 
        
           | 1 | efrain | 203 |         }
 | 
        
           |  |  | 204 |     }
 | 
        
           |  |  | 205 |   | 
        
           | 15 | efrain | 206 |     private func createTableUserExtended() -> Void
 | 
        
           | 1 | efrain | 207 |     {
 | 
        
           |  |  | 208 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_USER_EXTENDED + "("
 | 
        
           |  |  | 209 |         sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 210 |         sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_COMPANY_UUID + " TEXT,"
 | 
        
           |  |  | 211 |         sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_LABEL + " TEXT,"
 | 
        
           |  |  | 212 |         sql = sql + Constants.TABLE_USER_EXTENDED_FIELD_VALUE + " TEXT"
 | 
        
           |  |  | 213 |         sql = sql + ");"
 | 
        
           |  |  | 214 |   | 
        
           |  |  | 215 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 216 |   | 
        
           | 15 | efrain | 217 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 218 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 219 |   | 
        
           |  |  | 220 |                 let queries = [
 | 
        
           | 14 | efrain | 221 |                     "CREATE INDEX IF NOT EXISTS  `idx_user_extended_company_uuid` ON `" +  Constants.TABLE_USER_EXTENDED + "` (`" +  Constants.TABLE_USER_EXTENDED_FIELD_COMPANY_UUID + "` );"
 | 
        
           | 1 | efrain | 222 |                 ]
 | 
        
           |  |  | 223 |   | 
        
           |  |  | 224 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 225 |   | 
        
           |  |  | 226 |             } else {
 | 
        
           |  |  | 227 |                 print("No se pudo crear la tabla: \(Constants.TABLE_USER_EXTENDED)")
 | 
        
           |  |  | 228 |   | 
        
           | 15 | efrain | 229 |   | 
        
           | 1 | efrain | 230 |             }
 | 
        
           |  |  | 231 |         } else {
 | 
        
           |  |  | 232 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_USER_EXTENDED)")
 | 
        
           |  |  | 233 |   | 
        
           |  |  | 234 |   | 
        
           | 15 | efrain | 235 |   | 
        
           | 1 | efrain | 236 |         }
 | 
        
           |  |  | 237 |     }
 | 
        
           |  |  | 238 |   | 
        
           | 15 | efrain | 239 |     private func createTableSync() -> Void {
 | 
        
           | 1 | efrain | 240 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_SYNC + "("
 | 
        
           |  |  | 241 |         sql = sql + Constants.TABLE_SYNC_FIELD_ID +  " INTEGER PRIMARY KEY, "
 | 
        
           |  |  | 242 |         sql = sql + Constants.TABLE_SYNC_FIELD_TYPE + " INTEGER,"
 | 
        
           |  |  | 243 |         sql = sql + Constants.TABLE_SYNC_FIELD_DATA + " TEXT"
 | 
        
           |  |  | 244 |         sql = sql + ");"
 | 
        
           |  |  | 245 |   | 
        
           |  |  | 246 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 247 |   | 
        
           | 15 | efrain | 248 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 249 |             if sqlite3_step(statement) != SQLITE_DONE {
 | 
        
           |  |  | 250 |                 print("No se pudo crear la tabla: \(Constants.TABLE_SYNC)")
 | 
        
           |  |  | 251 |   | 
        
           | 15 | efrain | 252 |   | 
        
           | 1 | efrain | 253 |             }
 | 
        
           |  |  | 254 |         } else {
 | 
        
           |  |  | 255 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_SYNC)")
 | 
        
           |  |  | 256 |   | 
        
           |  |  | 257 |   | 
        
           | 15 | efrain | 258 |   | 
        
           | 1 | efrain | 259 |         }
 | 
        
           |  |  | 260 |     }
 | 
        
           |  |  | 261 |   | 
        
           | 15 | efrain | 262 |     private func createTableCompany() -> Void  {
 | 
        
           | 1 | efrain | 263 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_COMPANY + "("
 | 
        
           |  |  | 264 |         sql = sql + Constants.TABLE_COMPANY_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 265 |         sql = sql + Constants.TABLE_COMPANY_FIELD_NAME + " TEXT, "
 | 
        
           |  |  | 266 |         sql = sql + Constants.TABLE_COMPANY_FIELD_IMAGE + " TEXT "
 | 
        
           |  |  | 267 |         sql = sql + ");"
 | 
        
           |  |  | 268 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 269 |   | 
        
           | 15 | efrain | 270 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 271 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 272 |   | 
        
           |  |  | 273 |                 let queries = [
 | 
        
           | 14 | efrain | 274 |                     "CREATE INDEX IF NOT EXISTS `idx_company_company_uuid` ON `" +  Constants.TABLE_COMPANY + "` (`" +  Constants.TABLE_COMPANY_FIELD_UUID + "` );"
 | 
        
           | 1 | efrain | 275 |                 ]
 | 
        
           |  |  | 276 |   | 
        
           |  |  | 277 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 278 |   | 
        
           |  |  | 279 |             } else {
 | 
        
           |  |  | 280 |                 print("No se pudo crear la tabla: \(Constants.TABLE_COMPANY)");
 | 
        
           |  |  | 281 |   | 
        
           | 15 | efrain | 282 |   | 
        
           | 1 | efrain | 283 |             }
 | 
        
           |  |  | 284 |         } else {
 | 
        
           |  |  | 285 |             print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_COMPANY)")
 | 
        
           |  |  | 286 |   | 
        
           |  |  | 287 |   | 
        
           | 15 | efrain | 288 |   | 
        
           | 1 | efrain | 289 |         }
 | 
        
           |  |  | 290 |     }
 | 
        
           |  |  | 291 |   | 
        
           | 15 | efrain | 292 |     private func createTableTopic() -> Void  {
 | 
        
           | 1 | efrain | 293 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_TOPIC + "("
 | 
        
           |  |  | 294 |         sql = sql + Constants.TABLE_TOPIC_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 295 |         sql = sql + Constants.TABLE_TOPIC_FIELD_COMPANY_UUID + " TEXT,"
 | 
        
           |  |  | 296 |         sql = sql + Constants.TABLE_TOPIC_FIELD_NAME + " TEXT,"
 | 
        
           |  |  | 297 |         sql = sql + Constants.TABLE_TOPIC_FIELD_DESCRIPTION + " TEXT,"
 | 
        
           |  |  | 298 |         sql = sql + Constants.TABLE_TOPIC_FIELD_IMAGE + " TEXT,"
 | 
        
           |  |  | 299 |         sql = sql + Constants.TABLE_TOPIC_FIELD_POSITION + " INTEGER, "
 | 
        
           |  |  | 300 |         sql = sql + Constants.TABLE_TOPIC_FIELD_ADDED_ON + " TEXT,"
 | 
        
           |  |  | 301 |         sql = sql + Constants.TABLE_TOPIC_FIELD_UPDATED_ON + " TEXT "
 | 
        
           |  |  | 302 |         sql = sql + ");"
 | 
        
           |  |  | 303 |   | 
        
           |  |  | 304 |   | 
        
           |  |  | 305 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 306 |   | 
        
           | 15 | efrain | 307 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 308 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 309 |   | 
        
           |  |  | 310 |                 let queries = [
 | 
        
           | 14 | efrain | 311 |                     "CREATE INDEX IF NOT EXISTS  `idx_topics_company_uuid` ON `" +  Constants.TABLE_TOPIC + "` (`" +  Constants.TABLE_TOPIC_FIELD_COMPANY_UUID + "` );"
 | 
        
           | 1 | efrain | 312 |                 ]
 | 
        
           |  |  | 313 |   | 
        
           |  |  | 314 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 315 |   | 
        
           |  |  | 316 |             } else {
 | 
        
           |  |  | 317 |                 print("No se pudo crear la tabla: \(Constants.TABLE_TOPIC)")
 | 
        
           |  |  | 318 |   | 
        
           | 15 | efrain | 319 |   | 
        
           | 1 | efrain | 320 |            }
 | 
        
           |  |  | 321 |         } else {
 | 
        
           |  |  | 322 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_TOPIC)")
 | 
        
           |  |  | 323 |   | 
        
           |  |  | 324 |   | 
        
           | 15 | efrain | 325 |   | 
        
           | 1 | efrain | 326 |         }
 | 
        
           |  |  | 327 |     }
 | 
        
           |  |  | 328 |   | 
        
           |  |  | 329 |   | 
        
           | 15 | efrain | 330 |     private func createTableCapsule() -> Void  {
 | 
        
           | 1 | efrain | 331 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_CAPSULE + "("
 | 
        
           |  |  | 332 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 333 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " TEXT,"
 | 
        
           |  |  | 334 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_NAME + " TEXT,"
 | 
        
           |  |  | 335 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " TEXT,"
 | 
        
           |  |  | 336 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_IMAGE + " TEXT,"
 | 
        
           |  |  | 337 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_POSITION + " INTEGER, "
 | 
        
           |  |  | 338 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " TEXT, "
 | 
        
           |  |  | 339 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " TEXT, "
 | 
        
           |  |  | 340 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " INTEGER, "
 | 
        
           |  |  | 341 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " INTEGER, "
 | 
        
           |  |  | 342 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " TEXT, "
 | 
        
           |  |  | 343 |         sql = sql + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON  + " TEXT "
 | 
        
           |  |  | 344 |         sql = sql + ");"
 | 
        
           |  |  | 345 |   | 
        
           |  |  | 346 |   | 
        
           |  |  | 347 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 348 |   | 
        
           | 15 | efrain | 349 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 350 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 351 |   | 
        
           |  |  | 352 |                 let queries = [
 | 
        
           | 14 | efrain | 353 |                     "CREATE INDEX IF NOT EXISTS `idx_capsules_topic_uuid` ON `" +  Constants.TABLE_CAPSULE + "` (`" +  Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + "` );"
 | 
        
           | 1 | efrain | 354 |   | 
        
           |  |  | 355 |                 ]
 | 
        
           |  |  | 356 |   | 
        
           |  |  | 357 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 358 |   | 
        
           |  |  | 359 |             } else {
 | 
        
           |  |  | 360 |                 print("No se pudo crear la tabla: \(Constants.TABLE_CAPSULE)")
 | 
        
           |  |  | 361 |   | 
        
           | 15 | efrain | 362 |   | 
        
           | 1 | efrain | 363 |            }
 | 
        
           |  |  | 364 |         } else {
 | 
        
           |  |  | 365 |             print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_CAPSULE)")
 | 
        
           |  |  | 366 |   | 
        
           | 15 | efrain | 367 |   | 
        
           | 1 | efrain | 368 |         }
 | 
        
           |  |  | 369 |     }
 | 
        
           |  |  | 370 |   | 
        
           | 15 | efrain | 371 |     private func createTableSlide() -> Void {
 | 
        
           | 1 | efrain | 372 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_SLIDE + " ("
 | 
        
           |  |  | 373 |         sql = sql + Constants.TABLE_SLIDE_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 374 |         sql = sql + Constants.TABLE_SLIDE_FIELD_TOPIC_UUID + " TEXT,"
 | 
        
           |  |  | 375 |         sql = sql + Constants.TABLE_SLIDE_FIELD_CAPSULE_UUID + " TEXT,"
 | 
        
           |  |  | 376 |         sql = sql + Constants.TABLE_SLIDE_FIELD_QUIZ_UUID + " TEXT,"
 | 
        
           |  |  | 377 |         sql = sql + Constants.TABLE_SLIDE_FIELD_NAME + " TEXT,"
 | 
        
           |  |  | 378 |         sql = sql + Constants.TABLE_SLIDE_FIELD_DESCRIPTION + " TEXT,"
 | 
        
           |  |  | 379 |         sql = sql + Constants.TABLE_SLIDE_FIELD_TYPE + " TEXT,"
 | 
        
           |  |  | 380 |         sql = sql + Constants.TABLE_SLIDE_FIELD_FILE + " TEXT,"
 | 
        
           |  |  | 381 |         sql = sql + Constants.TABLE_SLIDE_FIELD_BACKGROUND + " TEXT,"
 | 
        
           |  |  | 382 |         sql = sql + Constants.TABLE_SLIDE_FIELD_POSITION + " INTEGER, "
 | 
        
           |  |  | 383 |         sql = sql + Constants.TABLE_SLIDE_FIELD_ADDED_ON + " TEXT,"
 | 
        
           |  |  | 384 |         sql = sql + Constants.TABLE_SLIDE_FIELD_UPDATED_ON + " TEXT);"
 | 
        
           |  |  | 385 |   | 
        
           |  |  | 386 |   | 
        
           |  |  | 387 |   | 
        
           |  |  | 388 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 389 |   | 
        
           | 15 | efrain | 390 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 391 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 392 |   | 
        
           |  |  | 393 |                 let queries = [
 | 
        
           | 14 | efrain | 394 |                     "CREATE INDEX IF NOT EXISTS `idx_slides_quiz_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_QUIZ_UUID + "` );",
 | 
        
           | 1 | efrain | 395 |   | 
        
           | 14 | efrain | 396 |                     "CREATE INDEX IF NOT EXISTS  `idx_slides_capsule_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_CAPSULE_UUID + "` );",
 | 
        
           | 1 | efrain | 397 |   | 
        
           | 14 | efrain | 398 |                     "CREATE INDEX IF NOT EXISTS  `idx_slides_topic_uuid` ON `" +  Constants.TABLE_SLIDE + "` (`" +  Constants.TABLE_SLIDE_FIELD_TOPIC_UUID + "` );"
 | 
        
           | 1 | efrain | 399 |   | 
        
           |  |  | 400 |                 ]
 | 
        
           |  |  | 401 |   | 
        
           |  |  | 402 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 403 |   | 
        
           |  |  | 404 |             } else {
 | 
        
           |  |  | 405 |                 print("No se pudo crear la tabla: \(Constants.TABLE_SLIDE)")
 | 
        
           |  |  | 406 |   | 
        
           | 15 | efrain | 407 |   | 
        
           | 1 | efrain | 408 |            }
 | 
        
           |  |  | 409 |         } else {
 | 
        
           |  |  | 410 |             print("Fallo la preparación para crear la tabla: \(Constants.TABLE_SLIDE)")
 | 
        
           |  |  | 411 |   | 
        
           | 15 | efrain | 412 |   | 
        
           | 1 | efrain | 413 |         }
 | 
        
           |  |  | 414 |     }
 | 
        
           |  |  | 415 |   | 
        
           |  |  | 416 |   | 
        
           | 15 | efrain | 417 |     private func createTableProgress() -> Void  {
 | 
        
           | 1 | efrain | 418 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_PROGRESS + " ("
 | 
        
           |  |  | 419 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_ID + " INTEGER PRIMARY KEY, "
 | 
        
           |  |  | 420 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " TEXT,"
 | 
        
           |  |  | 421 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_COMPANY_UUID + " TEXT,"
 | 
        
           |  |  | 422 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_TOPIC_UUID + " TEXT,"
 | 
        
           |  |  | 423 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID + " TEXT,"
 | 
        
           |  |  | 424 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_SLIDE_UUID + " TEXT,"
 | 
        
           |  |  | 425 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_PROGRESS + " REAL,"
 | 
        
           |  |  | 426 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_TOTAL_SLIDES + " INTEGER,"
 | 
        
           |  |  | 427 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_VIEW_SLIDES + " INTEGER,"
 | 
        
           |  |  | 428 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_TYPE + " TEXT,"
 | 
        
           |  |  | 429 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_RETURNING  + " INTEGER,"
 | 
        
           |  |  | 430 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_RETURNING_AFTER_COMPLETED  + " INTEGER,"
 | 
        
           |  |  | 431 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_COMPLETED  + " INTEGER,"
 | 
        
           |  |  | 432 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_ADDED_ON  + " TEXT,"
 | 
        
           |  |  | 433 |         sql = sql + Constants.TABLE_PROGRESS_FIELD_UPDATED_ON  + " TEXT);"
 | 
        
           |  |  | 434 |   | 
        
           |  |  | 435 |   | 
        
           |  |  | 436 |         print("sql : \(sql)")
 | 
        
           |  |  | 437 |   | 
        
           |  |  | 438 |   | 
        
           |  |  | 439 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 440 |   | 
        
           | 15 | efrain | 441 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 442 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 443 |   | 
        
           |  |  | 444 |                 let queries = [
 | 
        
           | 14 | efrain | 445 |                     "CREATE INDEX IF NOT EXISTS `idx_progress_topic_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_TOPIC_UUID + "` );",
 | 
        
           | 1 | efrain | 446 |   | 
        
           | 14 | efrain | 447 |                     "CREATE INDEX IF NOT EXISTS  `idx_progress_capsule_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID + "` );",
 | 
        
           | 1 | efrain | 448 |   | 
        
           | 14 | efrain | 449 |                     "CREATE INDEX IF NOT EXISTS  `idx_progress_slide_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_SLIDE_UUID + "` );",
 | 
        
           | 1 | efrain | 450 |   | 
        
           | 14 | efrain | 451 |                     "CREATE INDEX IF NOT EXISTS  `idx_progress_user_uuid` ON `" +  Constants.TABLE_PROGRESS + "` (`" +  Constants.TABLE_PROGRESS_FIELD_USER_UUID + "` );"
 | 
        
           | 1 | efrain | 452 |                 ]
 | 
        
           |  |  | 453 |   | 
        
           |  |  | 454 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 455 |   | 
        
           |  |  | 456 |             } else {
 | 
        
           |  |  | 457 |                 print("No se pudo crear la tabla: \(Constants.TABLE_PROGRESS)")
 | 
        
           |  |  | 458 |                 print(sql)
 | 
        
           | 15 | efrain | 459 |   | 
        
           | 1 | efrain | 460 |            }
 | 
        
           |  |  | 461 |         } else {
 | 
        
           |  |  | 462 |             print("Fallo la preparación para la creación de la tabla: \(Constants.TABLE_PROGRESS)")
 | 
        
           |  |  | 463 |   | 
        
           | 15 | efrain | 464 |   | 
        
           | 1 | efrain | 465 |         }
 | 
        
           |  |  | 466 |     }
 | 
        
           |  |  | 467 |   | 
        
           | 15 | efrain | 468 |     private func createTableUserLog() -> Void  {
 | 
        
           | 1 | efrain | 469 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_USER_LOG + "("
 | 
        
           |  |  | 470 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_ID + " INTEGER PRIMARY KEY, "
 | 
        
           |  |  | 471 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_COMPANY_UUID + " TEXT,"
 | 
        
           |  |  | 472 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_TOPIC_UUID + " TEXT,"
 | 
        
           |  |  | 473 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_CAPSULE_UUID + " TEXT,"
 | 
        
           |  |  | 474 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_SLIDE_UUID + " TEXT,"
 | 
        
           |  |  | 475 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_USER_UUID + " TEXT,"
 | 
        
           |  |  | 476 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_ACTIVITY + " TEXT,"
 | 
        
           |  |  | 477 |         sql = sql + Constants.TABLE_USER_LOG_FIELD_ADDED_ON + " TEXT"
 | 
        
           |  |  | 478 |         sql = sql + ");"
 | 
        
           |  |  | 479 |   | 
        
           |  |  | 480 |   | 
        
           |  |  | 481 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 482 |   | 
        
           | 15 | efrain | 483 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 484 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 485 |   | 
        
           |  |  | 486 |                 let queries = [
 | 
        
           | 14 | efrain | 487 |                     "CREATE INDEX IF NOT EXISTS `idx_user_log_user_uuid` ON `" +  Constants.TABLE_USER_LOG + "` (`" +  Constants.TABLE_USER_LOG_FIELD_USER_UUID + "` );",
 | 
        
           | 1 | efrain | 488 |   | 
        
           | 14 | efrain | 489 |                     "CREATE INDEX IF NOT EXISTS `idx_user_log_added_on` ON `" +  Constants.TABLE_USER_LOG + "` (`" +  Constants.TABLE_USER_LOG_FIELD_ADDED_ON + "` );"
 | 
        
           | 1 | efrain | 490 |                 ]
 | 
        
           |  |  | 491 |   | 
        
           |  |  | 492 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 493 |   | 
        
           |  |  | 494 |             } else {
 | 
        
           |  |  | 495 |                 print("No se pudo crear la tabla: \(Constants.TABLE_USER_LOG)")
 | 
        
           |  |  | 496 |   | 
        
           | 15 | efrain | 497 |   | 
        
           | 1 | efrain | 498 |            }
 | 
        
           |  |  | 499 |         } else {
 | 
        
           |  |  | 500 |             print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_USER_LOG)")
 | 
        
           |  |  | 501 |   | 
        
           | 15 | efrain | 502 |   | 
        
           | 1 | efrain | 503 |         }
 | 
        
           |  |  | 504 |     }
 | 
        
           |  |  | 505 |   | 
        
           |  |  | 506 |   | 
        
           |  |  | 507 |   | 
        
           | 15 | efrain | 508 |     private func createTableQuiz() -> Void  {
 | 
        
           | 1 | efrain | 509 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_QUIZ + "("
 | 
        
           |  |  | 510 |         sql = sql + Constants.TABLE_QUIZ_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 511 |         sql = sql + Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + " TEXT,"
 | 
        
           |  |  | 512 |         sql = sql + Constants.TABLE_QUIZ_FIELD_NAME + " TEXT,"
 | 
        
           |  |  | 513 |         sql = sql + Constants.TABLE_QUIZ_FIELD_TEXT + " TEXT,"
 | 
        
           |  |  | 514 |         sql = sql + Constants.TABLE_QUIZ_FIELD_FAILED + " TEXT,"
 | 
        
           |  |  | 515 |         sql = sql + Constants.TABLE_QUIZ_FIELD_POINTS + " INTEGER,"
 | 
        
           |  |  | 516 |         sql = sql + Constants.TABLE_QUIZ_FIELD_MINIMUM_POINTS_REQUIRED + " INTEGER, "
 | 
        
           |  |  | 517 |         sql = sql + Constants.TABLE_QUIZ_FIELD_MAX_TIME + " INTEGER, "
 | 
        
           |  |  | 518 |         sql = sql + Constants.TABLE_QUIZ_FIELD_ADDED_ON + " TEXT,"
 | 
        
           |  |  | 519 |         sql = sql + Constants.TABLE_QUIZ_FIELD_UPDATED_ON + " TEXT);"
 | 
        
           |  |  | 520 |   | 
        
           |  |  | 521 |   | 
        
           |  |  | 522 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 523 |   | 
        
           | 15 | efrain | 524 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 525 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 526 |   | 
        
           |  |  | 527 |                 let queries = [
 | 
        
           | 14 | efrain | 528 |                     "CREATE INDEX IF NOT EXISTS  `idx_quizzes_company_uuid` ON `" +  Constants.TABLE_QUIZ + "` (`" +  Constants.TABLE_QUIZ_FIELD_COMPANY_UUID + "` );"
 | 
        
           | 1 | efrain | 529 |                 ]
 | 
        
           |  |  | 530 |   | 
        
           |  |  | 531 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 532 |   | 
        
           |  |  | 533 |             } else {
 | 
        
           |  |  | 534 |                 print("No se pudo crear la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           |  |  | 535 |   | 
        
           | 15 | efrain | 536 |   | 
        
           | 1 | efrain | 537 |            }
 | 
        
           |  |  | 538 |         } else {
 | 
        
           |  |  | 539 |             print("Fallo la preparación de la creación de la tabla: \(Constants.TABLE_QUIZ)")
 | 
        
           |  |  | 540 |   | 
        
           | 15 | efrain | 541 |   | 
        
           | 1 | efrain | 542 |         }
 | 
        
           |  |  | 543 |   | 
        
           |  |  | 544 |     }
 | 
        
           |  |  | 545 |   | 
        
           | 15 | efrain | 546 |     private func createTableQuestion() -> Void  {
 | 
        
           | 1 | efrain | 547 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_QUESTION + "("
 | 
        
           |  |  | 548 |         sql = sql + Constants.TABLE_QUESTION_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 549 |         sql = sql + Constants.TABLE_QUESTION_FIELD_QUIZ_UUID + " TEXT,"
 | 
        
           |  |  | 550 |         sql = sql + Constants.TABLE_QUESTION_FIELD_TEXT + " TEXT,"
 | 
        
           |  |  | 551 |         sql = sql + Constants.TABLE_QUESTION_FIELD_TYPE + " TEXT,"
 | 
        
           |  |  | 552 |         sql = sql + Constants.TABLE_QUESTION_FIELD_POINTS + " INTEGER,"
 | 
        
           |  |  | 553 |         sql = sql + Constants.TABLE_QUESTION_FIELD_POSITION + " INTEGER, "
 | 
        
           |  |  | 554 |         sql = sql + Constants.TABLE_QUESTION_FIELD_ADDED_ON + " TEXT,"
 | 
        
           |  |  | 555 |         sql = sql + Constants.TABLE_QUESTION_FIELD_UPDATED_ON + " TEXT);"
 | 
        
           |  |  | 556 |   | 
        
           |  |  | 557 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 558 |   | 
        
           | 15 | efrain | 559 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 560 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 561 |   | 
        
           |  |  | 562 |                 let queries = [
 | 
        
           | 14 | efrain | 563 |                     "CREATE INDEX IF NOT EXISTS `idx_questions_quiz_uuid` ON " +  Constants.TABLE_QUIZ + "` (`" +  Constants.TABLE_QUIZ_FIELD_UUID + "` );"
 | 
        
           | 1 | efrain | 564 |                 ]
 | 
        
           |  |  | 565 |   | 
        
           |  |  | 566 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 567 |             } else {
 | 
        
           |  |  | 568 |                 print("No se pudo crear la tabla: \(Constants.TABLE_QUESTION)")
 | 
        
           |  |  | 569 |   | 
        
           | 15 | efrain | 570 |   | 
        
           | 1 | efrain | 571 |            }
 | 
        
           |  |  | 572 |         } else {
 | 
        
           |  |  | 573 |             print("Fallo la preparación de la creación  de la tabla: \(Constants.TABLE_QUESTION)")
 | 
        
           |  |  | 574 |   | 
        
           | 15 | efrain | 575 |   | 
        
           | 1 | efrain | 576 |         }
 | 
        
           |  |  | 577 |     }
 | 
        
           |  |  | 578 |   | 
        
           | 15 | efrain | 579 |     private func createTableAnswer() -> Void {
 | 
        
           | 1 | efrain | 580 |         var sql = "CREATE TABLE IF NOT EXISTS " + Constants.TABLE_ANSWER + "("
 | 
        
           |  |  | 581 |         sql = sql + Constants.TABLE_ANSWER_FIELD_UUID + " TEXT UNIQUE, "
 | 
        
           |  |  | 582 |         sql = sql + Constants.TABLE_ANSWER_FIELD_QUESTION_UUID + " TEXT,"
 | 
        
           |  |  | 583 |         sql = sql + Constants.TABLE_ANSWER_FIELD_TEXT + " TEXT,"
 | 
        
           |  |  | 584 |         sql = sql + Constants.TABLE_ANSWER_FIELD_POINTS + " INTEGER,"
 | 
        
           |  |  | 585 |         sql = sql + Constants.TABLE_ANSWER_FIELD_CORRECT + " TEXT, "
 | 
        
           |  |  | 586 |         sql = sql + Constants.TABLE_ANSWER_FIELD_ADDED_ON + " TEXT, "
 | 
        
           |  |  | 587 |         sql = sql + Constants.TABLE_ANSWER_FIELD_UPDATED_ON + " TEXT); "
 | 
        
           |  |  | 588 |   | 
        
           |  |  | 589 |   | 
        
           |  |  | 590 |         var statement : OpaquePointer? = nil
 | 
        
           |  |  | 591 |   | 
        
           | 15 | efrain | 592 |         if sqlite3_prepare_v2(db, sql, -1, &statement, nil) == SQLITE_OK {
 | 
        
           | 1 | efrain | 593 |             if sqlite3_step(statement) == SQLITE_DONE {
 | 
        
           |  |  | 594 |                 let queries = [
 | 
        
           | 14 | efrain | 595 |                     "CREATE INDEX IF NOT EXISTS `idx_answers_question_uuid` ON `" +  Constants.TABLE_QUESTION + "` (`" +  Constants.TABLE_QUESTION_FIELD_UUID + "` );"
 | 
        
           | 1 | efrain | 596 |                 ]
 | 
        
           |  |  | 597 |   | 
        
           |  |  | 598 |                 executeMultiQuery(queries: queries)
 | 
        
           |  |  | 599 |   | 
        
           |  |  | 600 |             } else {
 | 
        
           |  |  | 601 |                 print("No se pudo crear la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           |  |  | 602 |   | 
        
           | 15 | efrain | 603 |   | 
        
           | 1 | efrain | 604 |            }
 | 
        
           |  |  | 605 |         } else {
 | 
        
           |  |  | 606 |             print("Fallo la preparación para la creación de la tabla: \(Constants.TABLE_ANSWER)")
 | 
        
           |  |  | 607 |   | 
        
           | 15 | efrain | 608 |   | 
        
           | 1 | efrain | 609 |         }
 | 
        
           |  |  | 610 |     }
 | 
        
           |  |  | 611 |   | 
        
           |  |  | 612 |   | 
        
           |  |  | 613 |   | 
        
           |  |  | 614 |   | 
        
           |  |  | 615 | }
 |