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
//  CapsuleDao.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 2/21/22.
6
//
7
 
8
import UIKit
9
import SQLite3
10
 
11
class CapsuleDao {
12
    private let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
13
    private var database = Database.sharedInstance
14
 
15
    static let sharedInstance: CapsuleDao = {
16
           let instance = CapsuleDao()
17
 
18
           // setup code
19
           return instance
20
    }()
21
 
22
 
23
    func getCountAll() -> Int {
24
        let db = database.open()
25
        var count = 0
26
        let query = "SELECT COUNT(*) AS total FROM \(Constants.TABLE_CAPSULE) LIMIT 1"
27
 
28
        var statement : OpaquePointer? = nil
29
 
30
 
31
        if (sqlite3_prepare(db, query, -1, &statement, nil) == SQLITE_OK) {
32
            if(sqlite3_step(statement) == SQLITE_ROW){
33
                count = Int(sqlite3_column_int(statement, 0))
34
                //print("\(count)")
35
            }
36
        }
37
        sqlite3_finalize(statement)
38
        return count
39
    }
40
 
41
    func getCountByTopicUuid(topicUuid: String) -> Int {
42
        let db = database.open()
43
        var count = 0
44
        let query = "SELECT COUNT(*) AS total FROM " +  Constants.TABLE_CAPSULE +
45
            " WHERE " +  Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " = \(topicUuid) LIMIT 1"
46
 
47
        var statement : OpaquePointer? = nil
48
 
49
 
50
        if (sqlite3_prepare(db, query, -1, &statement, nil) == SQLITE_OK) {
51
            if(sqlite3_step(statement) == SQLITE_ROW){
52
                count = Int(sqlite3_column_int(statement, 0))
53
               // print("\(count)")
54
            }
55
        }
56
        sqlite3_finalize(statement)
57
        return count
58
    }
59
 
60
    func selectAll()-> [CapsuleModel] {
61
        let db = database.open()
62
        var records = [CapsuleModel]()
63
        var query = "SELECT "
64
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
65
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
66
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
67
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
68
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
69
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
70
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
71
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
72
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
73
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
74
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
75
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
76
        query = query + " FROM " + Constants.TABLE_CAPSULE
77
        query = query + " ORDER BY " + Constants.TABLE_CAPSULE_FIELD_NAME + " ;"
78
        var statement : OpaquePointer? = nil
79
 
80
 
81
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
82
            while (sqlite3_step(statement) == SQLITE_ROW) {
83
                var model = CapsuleModel()
84
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
85
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
86
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
87
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
88
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
89
                model.position = Int(sqlite3_column_int(statement, 5))
90
 
91
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
92
 
93
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
94
 
95
                model.totalComments = Int(sqlite3_column_int(statement, 8))
96
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
97
 
98
 
99
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
100
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
101
 
102
                records.append(model)
103
            }
104
        }
105
        sqlite3_finalize(statement)
106
        return records
107
    }
108
 
109
    func selectAllByTopicUuid(topicUuid: String)-> [CapsuleModel] {
110
        let db = database.open()
111
        var records = [CapsuleModel]()
112
        var query = "SELECT "
113
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
114
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
115
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
116
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
117
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
118
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
119
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
120
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
121
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
122
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
123
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
124
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
125
        query = query + " FROM " + Constants.TABLE_CAPSULE
126
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " = '\(topicUuid)' "
127
        query = query + " ORDER BY " + Constants.TABLE_CAPSULE_FIELD_POSITION + " ;"
128
        var statement : OpaquePointer? = nil
129
 
130
 
131
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
132
            while (sqlite3_step(statement) == SQLITE_ROW) {
133
                var model = CapsuleModel()
134
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
135
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
136
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
137
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
138
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
139
                model.position = Int(sqlite3_column_int(statement, 5))
140
 
141
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
142
 
143
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
144
 
145
                model.totalComments = Int(sqlite3_column_int(statement, 8))
146
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
147
 
148
 
149
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
150
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
151
 
152
                records.append(model)
153
            }
154
        }
155
        sqlite3_finalize(statement)
156
        return records
157
    }
158
 
159
    func selectLastPendingByUserUuid(userUuid: String)-> [CapsuleModel] {
160
        let db = database.open()
161
        var records = [CapsuleModel]()
162
        var query = "SELECT "
163
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
164
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
165
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
166
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
167
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
168
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
169
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
170
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
171
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
172
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
173
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
174
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
175
        query = query + " FROM " + Constants.TABLE_CAPSULE
176
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " NOT IN ("
177
        query = query + " SELECT " + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID
178
        query = query + " FROM " + Constants.TABLE_PROGRESS
179
        query = query + " WHERE " + Constants.TABLE_PROGRESS_FIELD_TYPE + " = '" + Constants.PROGRESS_TYPE_CAPSULE + "'";
180
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " ='\(userUuid)\' "
181
        query = query + ") ORDER BY " + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON + " LIMIT 1 ;"
182
 
183
        //print("selectLastPendingByUserUuid query : \(query)")
184
 
185
 
186
        var statement : OpaquePointer? = nil
187
 
188
 
189
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
190
            while (sqlite3_step(statement) == SQLITE_ROW) {
191
                var model = CapsuleModel()
192
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
193
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
194
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
195
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
196
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
197
                model.position = Int(sqlite3_column_int(statement, 5))
198
 
199
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
200
 
201
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
202
 
203
                model.totalComments = Int(sqlite3_column_int(statement, 8))
204
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
205
 
206
 
207
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
208
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
209
 
210
                records.append(model)
211
            }
212
        }
213
        sqlite3_finalize(statement)
214
        return records
215
    }
216
 
217
    func selectAllPendingByUserUuid(userUuid: String, search : String = "")-> [CapsuleModel] {
218
        let db = database.open()
219
        var records = [CapsuleModel]()
220
        var query = "SELECT "
221
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
222
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
223
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
224
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
225
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
226
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
227
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
228
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
229
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
230
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
231
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
232
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
233
        query = query + " FROM " + Constants.TABLE_CAPSULE
234
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " NOT IN ("
235
        query = query + " SELECT " + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID
236
        query = query + " FROM " + Constants.TABLE_PROGRESS
237
        query = query + " WHERE " + Constants.TABLE_PROGRESS_FIELD_TYPE + " = '" + Constants.PROGRESS_TYPE_CAPSULE + "'";
238
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " ='\(userUuid)\' "
239
        query = query + ") "
240
 
241
        if !search.isEmpty {
242
            query = query + " AND " + Constants.TABLE_CAPSULE_FIELD_NAME + " LIKE '%\(search)%' "
243
        }
244
 
245
 
246
        query = query + "ORDER BY " + Constants.TABLE_CAPSULE_FIELD_NAME + " ;"
247
 
248
 
249
        //print("selectAllPendingByUserUuid query : \(query)")
250
 
251
        var statement : OpaquePointer? = nil
252
 
253
 
254
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
255
            while (sqlite3_step(statement) == SQLITE_ROW) {
256
                var model = CapsuleModel()
257
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
258
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
259
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
260
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
261
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
262
                model.position = Int(sqlite3_column_int(statement, 5))
263
 
264
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
265
 
266
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
267
 
268
                model.totalComments = Int(sqlite3_column_int(statement, 8))
269
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
270
 
271
 
272
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
273
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
274
 
275
                records.append(model)
276
            }
277
        }
278
        sqlite3_finalize(statement)
279
        return records
280
    }
281
 
282
    func selectAllInProgressByUserUuid(userUuid: String, search : String = "")-> [CapsuleModel] {
283
        let db = database.open()
284
        var records = [CapsuleModel]()
285
        var query = "SELECT "
286
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
287
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
288
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
289
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
290
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
291
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
292
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
293
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
294
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
295
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
296
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
297
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
298
        query = query + " FROM " + Constants.TABLE_CAPSULE
299
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " IN ("
300
        query = query + " SELECT " + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID
301
        query = query + " FROM " + Constants.TABLE_PROGRESS
302
        query = query + " WHERE " + Constants.TABLE_PROGRESS_FIELD_TYPE + " = '" + Constants.PROGRESS_TYPE_CAPSULE + "'";
303
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " = '\(userUuid)\' "
304
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_PROGRESS + " < 0 "
305
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_COMPLETED + " = 0 "
306
        query = query + ") "
307
 
308
        if !search.isEmpty {
309
            query = query + " AND " + Constants.TABLE_CAPSULE_FIELD_NAME + " LIKE '%\(search)%' "
310
        }
311
 
312
 
313
        query = query + "ORDER BY " + Constants.TABLE_CAPSULE_FIELD_NAME + " ;"
314
 
315
        //print("selectAllInProgressByUserUuid query : \(query)")
316
 
317
        var statement : OpaquePointer? = nil
318
 
319
 
320
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
321
            while (sqlite3_step(statement) == SQLITE_ROW) {
322
                var model = CapsuleModel()
323
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
324
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
325
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
326
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
327
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
328
                model.position = Int(sqlite3_column_int(statement, 5))
329
 
330
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
331
 
332
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
333
 
334
                model.totalComments = Int(sqlite3_column_int(statement, 8))
335
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
336
 
337
 
338
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
339
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
340
 
341
                records.append(model)
342
            }
343
        }
344
        sqlite3_finalize(statement)
345
        return records
346
    }
347
 
348
    func selectAllCompletedByUserUuid(userUuid: String, search : String = "")-> [CapsuleModel] {
349
        let db = database.open()
350
        var records = [CapsuleModel]()
351
        var query = "SELECT "
352
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
353
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
354
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
355
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
356
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
357
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
358
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
359
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
360
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
361
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
362
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
363
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
364
        query = query + " FROM " + Constants.TABLE_CAPSULE
365
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " IN ("
366
        query = query + " SELECT " + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID
367
        query = query + " FROM " + Constants.TABLE_PROGRESS
368
        query = query + " WHERE " + Constants.TABLE_PROGRESS_FIELD_TYPE + " = '" + Constants.PROGRESS_TYPE_CAPSULE + "'";
369
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " = '\(userUuid)\' "
370
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_PROGRESS + " >= 0 "
371
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_COMPLETED + " = 1 "
372
        query = query + ") "
373
 
374
        if !search.isEmpty {
375
            query = query + " AND " + Constants.TABLE_CAPSULE_FIELD_NAME + " LIKE '%\(search)%' "
376
        }
377
 
378
 
379
        query = query + "ORDER BY " + Constants.TABLE_CAPSULE_FIELD_NAME + " ;"
380
 
381
        //print("selectAllCompletedByUserUuid query : \(query)")
382
 
383
 
384
        var statement : OpaquePointer? = nil
385
 
386
 
387
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
388
            while (sqlite3_step(statement) == SQLITE_ROW) {
389
                var model = CapsuleModel()
390
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
391
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
392
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
393
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
394
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
395
                model.position = Int(sqlite3_column_int(statement, 5))
396
 
397
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
398
 
399
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
400
 
401
                model.totalComments = Int(sqlite3_column_int(statement, 8))
402
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
403
 
404
 
405
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
406
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
407
 
408
                records.append(model)
409
            }
410
        }
411
        sqlite3_finalize(statement)
412
        return records
413
    }
414
 
415
    func selectLastInProgress(userUuid: String)-> CapsuleModel {
416
        let db = database.open()
417
        var model = CapsuleModel()
418
        var query = "SELECT " + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
419
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
420
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
421
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
422
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
423
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
424
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
425
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
426
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
427
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
428
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
429
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
430
        query = query + " FROM " + Constants.TABLE_CAPSULE
431
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + "  IN ("
432
        query = query + " SELECT " + Constants.TABLE_PROGRESS_FIELD_CAPSULE_UUID
433
        query = query + " FROM " + Constants.TABLE_PROGRESS
434
        query = query + " WHERE " + Constants.TABLE_PROGRESS_FIELD_TYPE + " = '" + Constants.PROGRESS_TYPE_CAPSULE + "'";
435
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_PROGRESS + "  <= 100 "
436
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_COMPLETED + " = 0 "
437
        query = query + " AND " + Constants.TABLE_PROGRESS_FIELD_USER_UUID + " ='\(userUuid)\' "
438
        query = query + " ORDER BY " + Constants.TABLE_PROGRESS_FIELD_UPDATED_ON + " DESC LIMIT 1"
439
        query = query + ") "
440
 
441
        var statement : OpaquePointer? = nil
442
 
443
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
444
            if (sqlite3_step(statement) == SQLITE_ROW) {
445
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
446
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
447
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
448
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
449
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
450
                model.position = Int(sqlite3_column_int(statement, 5))
451
 
452
 
453
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
454
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
455
 
456
                model.totalComments = Int(sqlite3_column_int(statement, 8))
457
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
458
 
459
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
460
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
461
 
462
            }
463
        }
464
        sqlite3_finalize(statement)
465
        return model
466
    }
467
 
468
    /*
469
     SELECT * FROM tb_capsules AS c
470
     WHERE uuid NOT IN (SELECT capsule_uuid FROM tb_progress WHERE type = 'c' AND user_uuid = '4cf9fb4b-0190-4bb4-9369-15eb68e9cace')
471
     ORDER BY name
472
 
473
     SELECT * FROM tb_capsules AS c
474
     WHERE uuid IN (SELECT capsule_uuid FROM tb_progress WHERE type = 'c' AND user_uuid = '4cf9fb4b-0190-4bb4-9369-15eb68e9cace' AND completed = 0)
475
     ORDER BY name
476
     */
477
 
478
    func selectByUuid(uuid: String)-> CapsuleModel {
479
        let db = database.open()
480
        var model = CapsuleModel()
481
        var query = "SELECT " + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
482
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + " , "
483
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + "  ,  "
484
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " , "
485
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " , "
486
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " , "
487
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " , "
488
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " , "
489
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " , "
490
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " , "
491
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " , "
492
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
493
        query = query + " FROM " + Constants.TABLE_CAPSULE
494
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " = '\(uuid)'  LIMIT 1;"
495
        var statement : OpaquePointer? = nil
496
 
497
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
498
            if (sqlite3_step(statement) == SQLITE_ROW) {
499
                model.uuid = String(describing: String(cString: sqlite3_column_text(statement, 0)))
500
                model.topicUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
501
                model.name = String(describing: String(cString: sqlite3_column_text(statement, 2)))
502
                model.description = String(describing: String(cString: sqlite3_column_text(statement, 3)))
503
                model.image = String(describing: String(cString: sqlite3_column_text(statement, 4)))
504
                model.position = Int(sqlite3_column_int(statement, 5))
505
 
506
 
507
                model.linkComments = String(describing: String(cString: sqlite3_column_text(statement, 6)))
508
                model.linkCommentAdd = String(describing: String(cString: sqlite3_column_text(statement, 7)))
509
 
510
                model.totalComments = Int(sqlite3_column_int(statement, 8))
511
                model.totalRating = Decimal(sqlite3_column_double(statement, 9))
512
 
513
                model.addedOn = String(describing: String(cString: sqlite3_column_text(statement, 10)))
514
                model.updatedOn  = String(describing: String(cString: sqlite3_column_text(statement, 11)))
515
 
516
            }
517
        } else {
518
            database.printError()
519
        }
520
        sqlite3_finalize(statement)
521
        return model
522
    }
523
 
524
    func insert(capsule: CapsuleModel) {
525
        let db = database.open()
526
        var query = "INSERT INTO " + Constants.TABLE_CAPSULE + " ( "
527
        query = query + Constants.TABLE_CAPSULE_FIELD_UUID + ", "
528
        query = query + Constants.TABLE_CAPSULE_FIELD_TOPIC_UUID + ", "
529
        query = query + Constants.TABLE_CAPSULE_FIELD_NAME + ", "
530
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + ", "
531
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + ", "
532
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + ", "
533
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + ", "
534
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + ", "
535
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + ", "
536
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + ", "
537
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + ", "
538
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON
539
        query = query +  " ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,?);"
540
        var statement : OpaquePointer?
541
 
542
 
543
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
544
 
545
            sqlite3_bind_text(statement, 1, capsule.uuid, -1, SQLITE_TRANSIENT)
546
            sqlite3_bind_text(statement, 2, capsule.topicUuid, -1, SQLITE_TRANSIENT)
547
            sqlite3_bind_text(statement, 3, capsule.name , -1, SQLITE_TRANSIENT)
548
            sqlite3_bind_text(statement, 4, capsule.description , -1, SQLITE_TRANSIENT)
549
            sqlite3_bind_text(statement, 5, capsule.image , -1, SQLITE_TRANSIENT)
550
            sqlite3_bind_int(statement, 6, Int32(capsule.position))
551
            sqlite3_bind_text(statement, 7, capsule.linkComments , -1, SQLITE_TRANSIENT)
552
            sqlite3_bind_text(statement, 8, capsule.linkCommentAdd , -1, SQLITE_TRANSIENT)
553
            sqlite3_bind_int(statement, 9, Int32(capsule.totalComments))
554
            sqlite3_bind_double(statement, 10,Double("\(capsule.totalRating)") ?? 0)
555
            sqlite3_bind_text(statement, 11, capsule.addedOn , -1, SQLITE_TRANSIENT)
556
            sqlite3_bind_text(statement, 12, capsule.updatedOn , -1, SQLITE_TRANSIENT)
557
 
558
           if (sqlite3_step(statement) != SQLITE_DONE) {
559
                print("No se pudo insertar un registro en la tabla: \(Constants.TABLE_CAPSULE)")
560
 
561
                database.printError()
562
           }
563
        } else {
564
            print("Fallo la prepración de insertar un registro en la tabla: \(Constants.TABLE_CAPSULE)")
565
 
566
            database.printError()
567
        }
568
 
569
        sqlite3_finalize(statement)
570
    }
571
 
572
    func update(capsule : CapsuleModel) {
573
        let db = database.open()
574
        var query = "UPDATE " + Constants.TABLE_CAPSULE
575
        query = query + " SET " + Constants.TABLE_CAPSULE_FIELD_NAME + " = '\(capsule.name)', "
576
        query = query + Constants.TABLE_CAPSULE_FIELD_DESCRIPTION + " = '\(capsule.description)', "
577
        query = query + Constants.TABLE_CAPSULE_FIELD_IMAGE + " = '\(capsule.image)', "
578
        query = query + Constants.TABLE_CAPSULE_FIELD_POSITION + " = '\(capsule.position)', "
579
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS + " = '\(capsule.linkComments)', "
580
        query = query + Constants.TABLE_CAPSULE_FIELD_LINK_COMMENTS_ADD + " = '\(capsule.linkCommentAdd)',"
581
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_COMMENTS + " = '\(capsule.totalComments)', "
582
        query = query + Constants.TABLE_CAPSULE_FIELD_TOTAL_RATING + " = '\(capsule.totalRating)', "
583
        query = query + Constants.TABLE_CAPSULE_FIELD_ADDED_ON + " = '\(capsule.addedOn)', "
584
        query = query + Constants.TABLE_CAPSULE_FIELD_UPDATED_ON + " = '\(capsule.updatedOn)' "
585
        query = query + " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " = '\(capsule.uuid)' ;"
586
        var statement : OpaquePointer? = nil
587
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
588
            if (sqlite3_step(statement) != SQLITE_DONE) {
589
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_CAPSULE)")
590
 
591
                database.printError()
592
            }
593
        } else {
594
            print("Fallo la preparación para actualizar un registro en la tabla: \(Constants.TABLE_CAPSULE)")
595
 
596
            database.printError()
597
        }
598
        sqlite3_finalize(statement)
599
    }
600
 
601
 
602
 
603
    func remove(uuid: String) {
604
        let db = database.open()
605
        let query = "DELETE FROM " + Constants.TABLE_CAPSULE +
606
            " WHERE " + Constants.TABLE_CAPSULE_FIELD_UUID + " = " + "\(uuid) ;"
607
        var statement : OpaquePointer? = nil
608
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
609
            if (sqlite3_step(statement) != SQLITE_DONE) {
610
                print("No se pudo borrar el registro con el uuid: \(uuid) en la tabla: \(Constants.TABLE_CAPSULE)")
611
 
612
                database.printError()
613
            }
614
        } else {
615
            print("Fallo la preparación de borrar un registro con el uuid: \(uuid) en la tabla: \(Constants.TABLE_CAPSULE)")
616
 
617
            database.printError()
618
        }
619
        sqlite3_finalize(statement)
620
    }
621
 
622
    func removeAll() {
623
        let db = database.open()
624
        let query = "DELETE FROM " + Constants.TABLE_CAPSULE + ";"
625
        var statement : OpaquePointer? = nil
626
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
627
            if (sqlite3_step(statement) != SQLITE_DONE) {
628
                print("No se pudo borrar todos los registros en la tabla: \(Constants.TABLE_CAPSULE)")
629
 
630
                database.printError()
631
            }
632
        } else {
633
            print("No se pudo preparar el borrar todos los registros en la tabla: \(Constants.TABLE_CAPSULE)")
634
 
635
            database.printError()
636
        }
637
        sqlite3_finalize(statement)
638
    }
639
 
640
}