Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

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