Persist logs by renaming table (hopefully reduces lock time)
This commit is contained in:
@@ -33,11 +33,9 @@ extension SQLiteDatabase {
|
|||||||
do {
|
do {
|
||||||
try run(sql: "SELECT 1 FROM req LIMIT 1;") // fails if req doesnt exist
|
try run(sql: "SELECT 1 FROM req LIMIT 1;") // fails if req doesnt exist
|
||||||
createFunction("domainof") { ($0.first as! String).extractDomain() }
|
createFunction("domainof") { ($0.first as! String).extractDomain() }
|
||||||
try run(sql: """
|
transaction("""
|
||||||
BEGIN TRANSACTION;
|
|
||||||
INSERT INTO heap(ts,fqdn,domain,opt) SELECT ts,domain,domainof(domain),nullif(logOpt,0) FROM req;
|
INSERT INTO heap(ts,fqdn,domain,opt) SELECT ts,domain,domainof(domain),nullif(logOpt,0) FROM req;
|
||||||
DROP TABLE req;
|
DROP TABLE req;
|
||||||
COMMIT;
|
|
||||||
""")
|
""")
|
||||||
} catch { /* no need to migrate */ }
|
} catch { /* no need to migrate */ }
|
||||||
}
|
}
|
||||||
@@ -119,13 +117,12 @@ extension SQLiteDatabase {
|
|||||||
/// - Returns: `nil` in case no entries were transmitted.
|
/// - Returns: `nil` in case no entries were transmitted.
|
||||||
@discardableResult func dnsLogsPersist() -> SQLiteRowRange? {
|
@discardableResult func dnsLogsPersist() -> SQLiteRowRange? {
|
||||||
guard lastRowId(.cache) > 0 else { return nil }
|
guard lastRowId(.cache) > 0 else { return nil }
|
||||||
|
transaction("ALTER TABLE cache RENAME TO tmp_cache; \(CreateTable.cache)")
|
||||||
let before = lastRowId(.heap) + 1
|
let before = lastRowId(.heap) + 1
|
||||||
createFunction("domainof") { ($0.first as! String).extractDomain() }
|
createFunction("domainof") { ($0.first as! String).extractDomain() }
|
||||||
try? run(sql:"""
|
transaction("""
|
||||||
BEGIN TRANSACTION;
|
INSERT INTO heap(ts,fqdn,domain,opt) SELECT ts,dns,domainof(dns),nullif(opt&1,0) FROM tmp_cache;
|
||||||
INSERT INTO heap(ts,fqdn,domain,opt) SELECT ts,dns,domainof(dns),nullif(opt&1,0) FROM cache;
|
DROP TABLE tmp_cache;
|
||||||
DELETE FROM cache;
|
|
||||||
COMMIT;
|
|
||||||
""")
|
""")
|
||||||
let after = lastRowId(.heap)
|
let after = lastRowId(.heap)
|
||||||
return (before > after) ? nil : (before, after)
|
return (before > after) ? nil : (before, after)
|
||||||
|
|||||||
@@ -91,15 +91,20 @@ class SQLiteDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `BEGIN TRANSACTION; \(sql); COMMIT;` on exception rollback.
|
||||||
|
func transaction(_ sql: String) {
|
||||||
|
do { try run(sql: "BEGIN TRANSACTION; \(sql); COMMIT;") }
|
||||||
|
catch { rollback() }
|
||||||
|
}
|
||||||
|
|
||||||
func ifStep(_ stmt: OpaquePointer, _ expected: Int32) throws {
|
func ifStep(_ stmt: OpaquePointer, _ expected: Int32) throws {
|
||||||
guard sqlite3_step(stmt) == expected else {
|
guard sqlite3_step(stmt) == expected else {
|
||||||
throw SQLiteError.Step(message: errorMessage)
|
throw SQLiteError.Step(message: errorMessage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func vacuum() {
|
func vacuum() { NSLog("[SQL] VACUUM"); try? run(sql: "VACUUM;"); }
|
||||||
try? run(sql: "VACUUM;")
|
func rollback() { NSLog("[SQL] ROLLBACK"); try? run(sql: "ROLLBACK;"); }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user