patbef-iOS/Befund/Core/Database/Logs.swift

298 lines
11 KiB
Swift

//
// Logs.swift
// Befund
//
// Created by Irakli Abetschkhrischwili on 21.05.22.
// Copyright © 2022 MVZ Dr. Stein und Kollegen. All rights reserved.
import Foundation
import SQLite3
extension Core.Database
{
/**
* Database context of logs object
*/
public class Logs
{
static let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
static let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
/**
* Creates a database if it still not exist
*/
public static func CreateDBIfNotExists() -> Bool
{
var result: Bool = false
if(!DatabaseExists())
{
let con = CreateConnection()
if(con != nil)
{
let sql = """
create table if not exists logs(
id integer primary key autoincrement not null,
guid text not null,
message text not null,
type text not null,
created datetime not null
)
"""
if(sqlite3_exec(con, sql, nil, nil, nil) == SQLITE_OK)
{
sqlite3_close(con)
result = true
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "CreateDBIfNotExists")
}
}
}
return result
}
/**
* Inserts a log in the database
*/
public static func Create(log: Core.Database.Log) -> Bool
{
var result: Bool = false
if(log.message != nil && log.type != nil)
{
if(DatabaseExists())
{
let con = CreateConnection()
if(con != nil)
{
var cmd: OpaquePointer? = nil
let sql = "insert into logs (guid, message, type, created) values(?, ?, ?, ?)"
if(sqlite3_prepare_v2(con, sql, -1, &cmd, nil) == SQLITE_OK)
{
let guid = (log.guid != nil ? log.guid! : UUID().uuidString)
sqlite3_bind_text(cmd, 1, (guid as NSString).utf8String, -1, SQLITE_TRANSIENT)
sqlite3_bind_text(cmd, 2, (log.message! as NSString).utf8String, -1, SQLITE_TRANSIENT)
sqlite3_bind_text(cmd, 3, (log.type! as NSString).utf8String, -1, SQLITE_TRANSIENT)
let now = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let created = dateFormatter.string(from: now)
sqlite3_bind_text(cmd, 4, (created as NSString).utf8String, -1, SQLITE_TRANSIENT)
if(sqlite3_step(cmd) != SQLITE_DONE)
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "Create(Log)")
}
sqlite3_finalize(cmd)
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "Create(Log)")
}
sqlite3_close(con)
result = true
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "Create(Log)")
}
}
}
return result
}
/**
* Returns logs from the database
*/
public static func GetLogs() -> Array<Core.Database.Log>?
{
var result: Array<Core.Database.Log>? = nil
if(DatabaseExists())
{
let con = CreateConnection()
if(con != nil)
{
var cmd: OpaquePointer? = nil
let sql = "select id, guid, message, type, created from logs order by created desc"
if(sqlite3_prepare_v2(con, sql, -1, &cmd, nil) == SQLITE_OK)
{
result = Array<Core.Database.Log>()
while(sqlite3_step(cmd) == SQLITE_ROW)
{
var log = Core.Database.Log()
log.id = sqlite3_column_int(cmd, 0)
log.guid = String(cString: sqlite3_column_text(cmd, 1))
log.message = String(cString: sqlite3_column_text(cmd, 2))
log.type = String(cString: sqlite3_column_text(cmd, 3))
let created_str = String(cString: sqlite3_column_text(cmd, 4))
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
log.created = dateFormatter.date(from: created_str)
result!.append(log)
}
sqlite3_finalize(cmd)
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "GetLogs")
}
sqlite3_close(con)
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "GetLogs")
}
}
return result
}
/**
* Returns logs by type from the database
*/
public static func GetLogs(type: String) -> Array<Core.Database.Log>?
{
var result: Array<Core.Database.Log>? = nil
if(DatabaseExists())
{
let con = CreateConnection()
if(con != nil)
{
var cmd: OpaquePointer? = nil
let sql = "select id, guid, message, type, created from logs where type = ? order by created desc"
if(sqlite3_prepare_v2(con, sql, -1, &cmd, nil) == SQLITE_OK)
{
sqlite3_bind_text(cmd, 1, (type as NSString).utf8String, -1, nil)
result = Array<Core.Database.Log>()
while(sqlite3_step(cmd) == SQLITE_ROW)
{
var log = Core.Database.Log()
log.id = sqlite3_column_int(cmd, 0)
log.guid = String(cString: sqlite3_column_text(cmd, 1))
log.message = String(cString: sqlite3_column_text(cmd, 2))
log.type = String(cString: sqlite3_column_text(cmd, 3))
let created_str = String(cString: sqlite3_column_text(cmd, 4))
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
log.created = dateFormatter.date(from: created_str)
result!.append(log)
}
sqlite3_finalize(cmd)
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "GetLogs(String)")
}
sqlite3_close(con)
}
else
{
let dbError = String(cString: sqlite3_errmsg(con))
Core.Log.Critical(msg: dbError, namespace: "Core.Database.Logs", method: "GetLogs(String)")
}
}
return result
}
/**
* Deletes the database of logs
*/
public static func DeleteLogs() -> Bool
{
var result = false
let dbPath = Core.System.LogsDatabasePath()
if(dbPath != nil)
{
result = Core.System.DeleteFile(atPath: dbPath!)
}
return result
}
/**
* Check if database exists
*/
private static func DatabaseExists() -> Bool
{
let dbPath = Core.System.LogsDatabasePath()
return (dbPath != nil && Core.System.FileExists(atPath: dbPath!))
}
/**
* Returns database connection pointer
*/
private static func CreateConnection() -> OpaquePointer?
{
var result: OpaquePointer? = nil
let dbPath = Core.System.LogsDatabasePath()
if(dbPath != nil && sqlite3_open(dbPath!, &result) == SQLITE_OK)
{
return result
}
return result
}
}
/**
* Database log object
*/
public struct Log
{
public var id: Int32 = 0
public var guid: String? = nil
public var message: String? = nil
public var type: String? = nil
public var created: Date? = nil
}
}