Proyectos de Subversion Iphone Microlearning - Inconcert

Rev

Rev 15 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

//
//  UserNotificationDao.swift
//  twogetskills
//
//  Created by Efrain Yanez Recanatini on 7/31/22.
//


import UIKit
import SQLite3

class UserNotificationDao {
    private let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
    public var db : OpaquePointer?
    
    func selectById(id : Int)-> UserNotificationModel {
        
        var model = UserNotificationModel ()
        
        var query = "SELECT "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)'  LIMIT 1;"
 
        var statement : OpaquePointer? = nil
        
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) == SQLITE_ROW) {
                

                model.id = Int(sqlite3_column_int(statement, 0))
                
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
                
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
                
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
                
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
                
                model.viewed = Int(sqlite3_column_int(statement, 5))
                
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
                
                
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
                
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))
                
                
               //print("\nSuccessfully get record")
                
            }
        } else {
           
        }
        sqlite3_finalize(statement)
        return model
    }
    
    func selectAllDistinctDateByUserUuid(userUuid : String) -> [String] {
        
        var records = [String]()
        
        var query = "SELECT "
        query = query + " DISTINCT(" + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + ") "
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
        query = query + " ORDER BY " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " DESC ;"
        
        var statement : OpaquePointer? = nil
        
        
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                
                let date = String(describing: String(cString: sqlite3_column_text(statement, 0)))
               
                records.append(date)
                
            }
        } else {
           
        }
        sqlite3_finalize(statement)
        return records
    }


    func selectAllByUserUuidAndDate(userUuid : String, date : String)-> [UserNotificationModel] {
        
        var records = [UserNotificationModel]()
        
        var query = "SELECT "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " = '\(date)'"
        query = query + " ORDER BY  " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " DESC,  "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON + " DESC; "
        var statement : OpaquePointer? = nil
        
        
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                
                var  model = UserNotificationModel()
                model.id = Int(sqlite3_column_int(statement, 0))
                
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
                
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
                
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
                
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
                
                model.viewed = Int(sqlite3_column_int(statement, 5))
                
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
               
                
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
               
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))


                
                records.append(model)
                
            }
        } else {
           
        }
        sqlite3_finalize(statement)
        return records
    }
    
    func selectAllByUserUuid(userUuid : String)-> [UserNotificationModel] {
        
        var records = [UserNotificationModel]()
        
        var query = "SELECT "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " , "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
        query = query + " FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
        query = query + " ORDER BY  " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " || 'T' || "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON + " DESC; "
        var statement : OpaquePointer? = nil
        
        
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                
                var  model = UserNotificationModel()
                model.id = Int(sqlite3_column_int(statement, 0))
                
                model.userUuid = String(describing: String(cString: sqlite3_column_text(statement, 1)))
                
                model.title = String(describing: String(cString: sqlite3_column_text(statement, 2)))
                
                model.body = String(describing: String(cString: sqlite3_column_text(statement, 3)))
                
                model.url = String(describing: String(cString: sqlite3_column_text(statement, 4)))
                
                model.viewed = Int(sqlite3_column_int(statement, 5))
                
                model.command = String(describing: String(cString: sqlite3_column_text(statement, 6)))
               
                
                model.dateOn = String(describing: String(cString: sqlite3_column_text(statement, 7)))
               
                model.timeOn = String(describing: String(cString: sqlite3_column_text(statement, 8)))


                
                records.append(model)
                
            }
        } else {
           
        }
        sqlite3_finalize(statement)
        return records
    }
    
    

    
    
    func getCountByUserUuid(userUuid : String) -> Int {
        
        var query = "SELECT COUNT(*) AS total FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "

        var statement : OpaquePointer? = nil
        var count = 0;
        
        
        if (sqlite3_prepare(db, query, -1, &statement, nil) == SQLITE_OK) {
            if(sqlite3_step(statement) == SQLITE_ROW){
                count = Int(sqlite3_column_int(statement, 0))
                //print("\(count)")
            }
        } else {
            count = -1
           
        }
        sqlite3_finalize(statement)
        return count
    }
    
    func insert(userNotification : UserNotificationModel) -> Int {
        
        var result : Int = 0
        var query = "INSERT INTO " + Constants.TABLE_USER_NOTIFICATION + " ( "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TITLE + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_BODY + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_URL + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + ", "
        query = query + Constants.TABLE_USER_NOTIFICATION_FIELD_TIME_ON
        query = query + " ) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"
        var statement : OpaquePointer?
        
           
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
                   
            sqlite3_bind_text(statement, 1, userNotification.userUuid, -1, SQLITE_TRANSIENT)
            sqlite3_bind_text(statement, 2, userNotification.title, -1 , SQLITE_TRANSIENT)
            sqlite3_bind_text(statement, 3, userNotification.body , -1, SQLITE_TRANSIENT)
            sqlite3_bind_text(statement, 4, userNotification.url , -1, SQLITE_TRANSIENT)
            sqlite3_bind_int(statement, 5, Int32(userNotification.viewed))
            sqlite3_bind_text(statement, 6, userNotification.command, -1, SQLITE_TRANSIENT)
            sqlite3_bind_text(statement, 7, userNotification.dateOn, -1, SQLITE_TRANSIENT)
            sqlite3_bind_text(statement, 8, userNotification.timeOn , -1, SQLITE_TRANSIENT)
            
            if (sqlite3_step(statement) == SQLITE_DONE) {
                result = Int(sqlite3_last_insert_rowid(conn))
            } else {
                 print("No se pudo insertar el registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
                
               
             
            }
        } else {
            print("Fallo la preparación del insertar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
            
           
        }
       
        sqlite3_finalize(statement)
        
        return result
    }

    func markViewed(id : Int) {
        
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + "  1 "
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)';"
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
                
               
            }
        } else {
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
            
           
        }
        sqlite3_finalize(statement)
    }
    
    func markViewedAllPendingByUserUuid(userUuid : String) {
        
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + "  1 "
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 0 "
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
                
               
            }
        } else {
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
            
           
        }
        sqlite3_finalize(statement)
    }
    
    func markViewedAllPendingByUserUuidAndCommand(userUuid : String, command : String) {
        
        var query = "UPDATE " + Constants.TABLE_USER_NOTIFICATION
        query = query + " SET " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 1 "
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_VIEWED + " = 0 "
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)'; "
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_COMMAND + " = '\(command)'; "
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                print("No se pudo actualizar un registro en la tabla: \(Constants.TABLE_USER_NOTIFICATION) ")
                
               
            }
        } else {
            print("Fallo la preparación de la actualización de un registro en la tabla \(Constants.TABLE_USER_NOTIFICATION) ")
            
           
        }
        sqlite3_finalize(statement)
    }
    
    
    func removeExpired(userUuid : String)
    {
        let now = Date()
        let date = Calendar.current.date(byAdding: .day, value: -5, to: now)!
        
        
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = Constants.FORMAT_DATE_YMD
        
        let sDate = dateFormatter.string(from: date)
        
        
        var query = "DELETE FROM " + Constants.TABLE_USER_NOTIFICATION
        query = query + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " = '\(userUuid)' "
        query = query + " AND " + Constants.TABLE_USER_NOTIFICATION_FIELD_DATE_ON + " < '\(sDate)' "
        
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                print("No se pudo borrar los registros con fecha menor a : \(sDate) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
                
               
            }
        } else {
            print("Fallo la preparación del borrado de los registros con fecha menor a : \(sDate) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" )
            
           
        }
        sqlite3_finalize(statement)
        
        
    }

    func remove(id: Int) {
        
        let query = "DELETE FROM " + Constants.TABLE_USER_NOTIFICATION
            + " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_ID + " = '\(id)' ;"
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                print("No se pudo borrar el registro con el id: \(id) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)")
                
               
            }
        } else {
            print("Fallo la preparación del borrado del registro con el id: \(id) en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" )
            
           
        }
        sqlite3_finalize(statement)
    }

    
    
    func removeAllUserUuidNotEqual(userUuid : String)
    {
        
        let query = "DELETE FROM " +  Constants.TABLE_USER_NOTIFICATION +
            " WHERE " + Constants.TABLE_USER_NOTIFICATION_FIELD_USER_UUID + " <> '\(userUuid)' ;"
        var statement : OpaquePointer? = nil
        if (sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK) {
            if sqlite3_step(statement) != SQLITE_DONE {
                print("No se pudo borrar todos los registros en la tabla: \(Constants.TABLE_USER_NOTIFICATION)" +
                " de los usuarios diferentes de : \(userUuid)" )
                
               
            }
        } else {
            print("Fallo la preparación de borrar todos los registros en la tabla: \(Constants.TABLE_USER_NOTIFICATION) de los usuarios diferentes de : \(userUuid) ")
            
           
        }
        sqlite3_finalize(statement)
    }
    
}