Proyectos de Subversion Iphone Microlearning - Inconcert

Rev

Rev 15 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  UserNotificationDao.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 7/31/22.
6
//
7
 
8
 
9
import UIKit
10
import SQLite3
11
 
12
class UserNotificationDao {
13
    private let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
14
    private var database = Database.sharedInstance
15
 
16
    static let sharedInstance: UserNotificationDao = {
17
           let instance = UserNotificationDao()
18
 
19
           // setup code
20
           return instance
21
    }()
22
 
23
    func selectById(id : Int)-> UserNotificationModel {
24
        let db = database.open()
25
        var model = UserNotificationModel ()
26
 
27
        var query = "SELECT "
28
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
29
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
30
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
31
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
32
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
33
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
34
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
35
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
36
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
37
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
38
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)'  LIMIT 1;"
39
 
40
        var statement : OpaquePointer? = nil
41
 
42
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
43
            if (sqlite3_step(statement) == SQLITE_ROW) {
44
 
45
 
46
                model.id = Int(sqlite3_column_int(statement, 0))
47
 
48
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
49
 
50
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
51
 
52
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
53
 
54
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
55
 
56
                model.viewed = Int(sqlite3_column_int(statement, 5))
57
 
58
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
59
 
60
 
61
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
62
 
63
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))
64
 
65
 
66
               //print("\nSuccessfully get record")
67
 
68
            }
69
        } else {
70
            database.printError()
71
        }
72
        sqlite3_finalize(statement)
73
        return model
74
    }
75
 
76
    func selectAllDistinctDateByUserUuid(userUuid : String) -> [String] {
77
        let db = database.open()
78
        var records = [String]()
79
 
80
        var query = "SELECT "
81
        query = query + " DISTINCT(" + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + ") "
82
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
83
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
84
        query = query + " ORDER BY " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " DESC ;"
85
 
86
        var statement : OpaquePointer? = nil
87
 
88
 
89
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
90
            while (sqlite3_step(statement) == SQLITE_ROW) {
91
 
92
                let date = String(describing: String(cString: sqlite3_column_text(statement, 0)))
93
 
94
                records.append(date)
95
 
96
            }
97
        } else {
98
            database.printError()
99
        }
100
        sqlite3_finalize(statement)
101
        return records
102
    }
103
 
104
 
105
    func selectAllByUserUuidAndDate(userUuid : String, date : String)-> [UserNotificationModel] {
106
        let db = database.open()
107
        var records = [UserNotificationModel]()
108
 
109
        var query = "SELECT "
110
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
111
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
112
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
113
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
114
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
115
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
116
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
117
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
118
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
119
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
120
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
121
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " = '\(date)'"
122
        query = query + " ORDER BY  " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " DESC,  "
123
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON + " DESC; "
124
        var statement : OpaquePointer? = nil
125
 
126
 
127
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
128
            while (sqlite3_step(statement) == SQLITE_ROW) {
129
 
130
                var  model = UserNotificationModel()
131
                model.id = Int(sqlite3_column_int(statement, 0))
132
 
133
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
134
 
135
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
136
 
137
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
138
 
139
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
140
 
141
                model.viewed = Int(sqlite3_column_int(statement, 5))
142
 
143
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
144
 
145
 
146
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
147
 
148
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))
149
 
150
 
151
 
152
                records.append(model)
153
 
154
            }
155
        } else {
156
            database.printError()
157
        }
158
        sqlite3_finalize(statement)
159
        return records
160
    }
161
 
162
    func selectAllByUserUuid(userUuid : String)-> [UserNotificationModel] {
163
        let db = database.open()
164
        var records = [UserNotificationModel]()
165
 
166
        var query = "SELECT "
167
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
168
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
169
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
170
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
171
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
172
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
173
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
174
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
175
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
176
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
177
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
178
        query = query + " ORDER BY  " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " || 'T' || "
179
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON + " DESC; "
180
        var statement : OpaquePointer? = nil
181
 
182
 
183
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
184
            while (sqlite3_step(statement) == SQLITE_ROW) {
185
 
186
                var  model = UserNotificationModel()
187
                model.id = Int(sqlite3_column_int(statement, 0))
188
 
189
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
190
 
191
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
192
 
193
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
194
 
195
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
196
 
197
                model.viewed = Int(sqlite3_column_int(statement, 5))
198
 
199
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
200
 
201
 
202
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
203
 
204
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))
205
 
206
 
207
 
208
                records.append(model)
209
 
210
            }
211
        } else {
212
            database.printError()
213
        }
214
        sqlite3_finalize(statement)
215
        return records
216
    }
217
 
218
 
219
 
220
 
221
 
222
    func getCountByUserUuid(userUuid : String) -> Int {
223
        let db = database.open()
224
        var query = "SELECT COUNT(*) AS total FROM " + Constants.TABLE_USER_NOTIFICATION
225
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
226
 
227
        var statement : OpaquePointer? = nil
228
        var count = 0;
229
 
230
 
231
        if (sqlite3_prepare(db, query, -1, &statement, nil) == SQLITE_OK) {
232
            if(sqlite3_step(statement) == SQLITE_ROW){
233
                count = Int(sqlite3_column_int(statement, 0))
234
                //print("\(count)")
235
            }
236
        } else {
237
            count = -1
238
            database.printError()
239
        }
240
        sqlite3_finalize(statement)
241
        return count
242
    }
243
 
244
    func insert(userNotification : UserNotificationModel) -> Int {
245
        let db = database.open()
246
        var result : Int = 0
247
        var query = "INSERT INTO " + Constants.TABLE_USER_NOTIFICATION + " ( "
248
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
249
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
250
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
251
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + ", "
252
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + ", "
253
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + ", "
254
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + ", "
255
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
256
        query = query + " ) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"
257
        var statement : OpaquePointer?
258
 
259
 
260
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
261
 
262
            sqlite3_bind_text(statement, 1, userNotification.userUuid, -1, SQLITE_TRANSIENT)
263
            sqlite3_bind_text(statement, 2, userNotification.title, -1 , SQLITE_TRANSIENT)
264
            sqlite3_bind_text(statement, 3, userNotification.body , -1, SQLITE_TRANSIENT)
265
            sqlite3_bind_text(statement, 4, userNotification.url , -1, SQLITE_TRANSIENT)
266
            sqlite3_bind_int(statement, 5, Int32(userNotification.viewed))
267
            sqlite3_bind_text(statement, 6, userNotification.command, -1, SQLITE_TRANSIENT)
268
            sqlite3_bind_text(statement, 7, userNotification.dateOn, -1, SQLITE_TRANSIENT)
269
            sqlite3_bind_text(statement, 8, userNotification.timeOn , -1, SQLITE_TRANSIENT)
270
 
271
            if (sqlite3_step(statement) == SQLITE_DONE) {
272
                result = Int(sqlite3_last_insert_rowid(db))
273
            } else {
274
                 print("No se pudo insertar el registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
275
 
276
                database.printError()
277
 
278
            }
279
        } else {
280
            print("Fallo la preparación del insertar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
281
 
282
            database.printError()
283
        }
284
 
285
        sqlite3_finalize(statement)
286
 
287
        return result
288
    }
289
 
290
    func markViewed(id : Int) {
291
        let db = database.open()
292
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
293
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + "  1 "
294
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)';"
295
        var statement : OpaquePointer? = nil
296
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
297
            if (sqlite3_step(statement) != SQLITE_DONE) {
298
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
299
 
300
                database.printError()
301
            }
302
        } else {
303
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
304
 
305
            database.printError()
306
        }
307
        sqlite3_finalize(statement)
308
    }
309
 
310
    func markViewedAllPendingByUserUuid(userUuid : String) {
311
        let db = database.open()
312
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
313
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + "  1 "
314
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 0 "
315
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
316
        var statement : OpaquePointer? = nil
317
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
318
            if (sqlite3_step(statement) != SQLITE_DONE) {
319
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
320
 
321
                database.printError()
322
            }
323
        } else {
324
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
325
 
326
            database.printError()
327
        }
328
        sqlite3_finalize(statement)
329
    }
330
 
331
    func markViewedAllPendingByUserUuidAndCommand(userUuid : String, command : String) {
332
        let db = database.open()
333
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
334
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 1 "
335
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 0 "
336
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
337
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " = '\(command)'; "
338
        var statement : OpaquePointer? = nil
339
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
340
            if (sqlite3_step(statement) != SQLITE_DONE) {
341
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
342
 
343
                database.printError()
344
            }
345
        } else {
346
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
347
 
348
            database.printError()
349
        }
350
        sqlite3_finalize(statement)
351
    }
352
 
353
 
354
    func removeExpired(userUuid : String)
355
    {
356
        let now = Date()
357
        let date = Calendar.current.date(byAdding: .day, value: -5, to: now)!
358
 
359
 
360
        let dateFormatter = DateFormatter()
361
        dateFormatter.dateFormat = Constants.FORMAT_DATE_YMD
362
 
363
        let sDate = dateFormatter.string(from: date)
364
 
365
        let db = database.open()
366
        var query = "DELETE FROM " + Constants.TABLE_USER_NOTIFICATION
367
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)' "
368
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " < '\(sDate)' "
369
 
370
        var statement : OpaquePointer? = nil
371
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
372
            if (sqlite3_step(statement) != SQLITE_DONE) {
373
                print("No se pudo borrar los registros con fecha menor a : \(sDate) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
374
 
375
                database.printError()
376
            }
377
        } else {
378
            print("Fallo la preparación del borrado de los registros con fecha menor a : \(sDate) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" )
379
 
380
            database.printError()
381
        }
382
        sqlite3_finalize(statement)
383
 
384
 
385
    }
386
 
387
    func remove(id: Int) {
388
        let db = database.open()
389
        let query = "DELETE FROM " + Constants.TABLE_USER_NOTIFICATION
390
            + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)' ;"
391
        var statement : OpaquePointer? = nil
392
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
393
            if (sqlite3_step(statement) != SQLITE_DONE) {
394
                print("No se pudo borrar el registro con el id: \(id) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
395
 
396
                database.printError()
397
            }
398
        } else {
399
            print("Fallo la preparación del borrado del registro con el id: \(id) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" )
400
 
401
            database.printError()
402
        }
403
        sqlite3_finalize(statement)
404
    }
405
 
406
 
407
 
408
    func removeAllUserUuidNotEqual(userUuid : String)
409
    {
410
        let db = database.open()
411
        let query = "DELETE FROM " +  Constants.TABLE_USER_NOTIFICATION +
412
            " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " <> '\(userUuid)' ;"
413
        var statement : OpaquePointer? = nil
414
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
415
            if sqlite3_step(statement) != SQLITE_DONE {
416
                print("No se pudo borrar todos los registros en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" +
417
                " de los usuarios diferentes de : \(userUuid)" )
418
 
419
                database.printError()
420
            }
421
        } else {
422
            print("Fallo la preparación de borrar todos los registros en la tabla: \(Constants.TABLE_USER_NOTIFICATION) de los usuarios diferentes de : \(userUuid) ")
423
 
424
            database.printError()
425
        }
426
        sqlite3_finalize(statement)
427
    }
428
 
429
}
430