This commit is contained in:
2019-03-23 06:29:32 -05:00
parent 7cab0a39e5
commit a546f6de73
39 changed files with 974 additions and 331 deletions

View File

@@ -25,9 +25,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var bridge: RCTBridge!
static var backend = Backend(databaseOpener: IosDatabaseOpener(),
static var backend = Backend(databaseOpener: IosDatabaseOpener(withLog: StandardLog()),
fileOpener: IosFileOpener(),
log: IosLog())
log: StandardLog())
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index.ios", fallbackResource: nil)

View File

@@ -24,7 +24,6 @@ internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
class IosPreparedStatement : NSObject, PreparedStatement {
var db: OpaquePointer
var statement: OpaquePointer
@@ -53,12 +52,20 @@ class IosPreparedStatement : NSObject, PreparedStatement {
return String(cString: sqlite3_column_text(statement, index))
}
func getReal(index: Int32) -> Double {
return sqlite3_column_double(statement, index)
}
func bindInt(index: Int32, value: Int32) {
sqlite3_bind_int(statement, index, value)
sqlite3_bind_int(statement, index + 1, value)
}
func bindText(index: Int32, value: String) {
sqlite3_bind_text(statement, index, value, -1, SQLITE_TRANSIENT)
sqlite3_bind_text(statement, index + 1, value, -1, SQLITE_TRANSIENT)
}
func bindReal(index: Int32, value: Double) {
sqlite3_bind_double(statement, index + 1, value)
}
func reset() {
@@ -72,16 +79,18 @@ class IosPreparedStatement : NSObject, PreparedStatement {
class IosDatabase : NSObject, Database {
var db: OpaquePointer
var log: Log
init(withDb db: OpaquePointer) {
init(withDb db: OpaquePointer, withLog log: Log) {
self.db = db
self.log = log
}
func prepareStatement(sql: String) -> PreparedStatement {
if sql.isEmpty {
fatalError("Provided SQL query is empty")
}
print("Running SQL: \(sql)")
log.debug(tag: "IosDatabase", msg: "Preparing: \(sql)")
var statement : OpaquePointer?
let result = sqlite3_prepare_v2(db, sql, -1, &statement, nil)
if result == SQLITE_OK {
@@ -98,16 +107,23 @@ class IosDatabase : NSObject, Database {
}
class IosDatabaseOpener : NSObject, DatabaseOpener {
var log: Log
init(withLog log: Log) {
self.log = log
}
func open(file: UserFile) -> Database {
let dbPath = (file as! IosUserFile).path
let version = String(cString: sqlite3_libversion())
print("SQLite \(version)")
print("Opening database: \(dbPath)")
log.info(tag: "IosDatabaseOpener", msg: "SQLite \(version)")
log.info(tag: "IosDatabaseOpener", msg: "Opening database: \(dbPath)")
var db: OpaquePointer?
let result = sqlite3_open(dbPath, &db)
if result == SQLITE_OK {
return IosDatabase(withDb: db!)
return IosDatabase(withDb: db!, withLog: log)
} else {
fatalError("Error opening database (code \(result))")
}

View File

@@ -1,77 +0,0 @@
/*
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import Foundation
class IosResourceFile : NSObject, ResourceFile {
var path: String
var fileManager = FileManager.default
init(forPath path: String) {
self.path = path
}
func readLines() -> [String] {
do {
let contents = try String(contentsOfFile: self.path, encoding: .utf8)
return contents.components(separatedBy: CharacterSet.newlines)
} catch {
return [""]
}
}
}
class IosUserFile : NSObject, UserFile {
var path: String
init(forPath path: String) {
self.path = path
}
func delete() {
do {
try FileManager.default.removeItem(atPath: path)
} catch {
}
}
func exists() -> Bool {
return FileManager.default.fileExists(atPath: path)
}
}
class IosFileOpener : NSObject, FileOpener {
func openResourceFile(filename: String) -> ResourceFile {
let path = "\(Bundle.main.resourcePath!)/\(filename)"
return IosResourceFile(forPath: path)
}
func openUserFile(filename: String) -> UserFile {
do {
let root = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).path
return IosUserFile(forPath: "\(root)/\(filename)")
} catch {
return IosUserFile(forPath: "invalid")
}
}
}

View File

@@ -1,30 +0,0 @@
/*
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import Foundation
class IosLog : NSObject, Log {
func info(msg: String) {
print("[I] \(msg)")
}
func debug(msg: String) {
print("[D] \(msg)")
}
}