-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathSQLiteViewer.swift
More file actions
99 lines (80 loc) · 3.57 KB
/
SQLiteViewer.swift
File metadata and controls
99 lines (80 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//
// SQLiteViewer.swift
// SQLite.viewer
//
// Created by Orkhan Alikhanov on 7/2/17.
// Copyright © 2017 BiAtoms. All rights reserved.
//
import HttpSwift
import SQLite
open class SQLiteViewer {
public static var shared = SQLiteViewer()
public var assetDir: String = ""
public var dbDir: String = "" {
didSet {
db = DatabaseController(path: dbDir)
}
}
lazy var server: Server = {
let server = Server()
self.prepareServer(server)
return server
}()
open var db: DatabaseController!
func prepareServer(_ server: Server) {
server.errorHandler = SQLiteErrorHanler.self
let assetDir = self.assetDir
let db = self.db!
server.get("/") { _ in
return try StaticServer.serveFile(in: assetDir, path: "index.html")
}
server.group("api") {
server.group("databases") {
server.get("/") { _ in
return .success(try db.getList())
}
server.group("/{name}") {
server.get("/tables/{table-name}") { r in
let dbName = r.routeParams["name"]!
let table = r.routeParams["table-name"]!
return .success(try db.getTableData(db: dbName, table: table))
}
server.get("/tables") { r in
let dbName = r.routeParams["name"]!
return .success(try db.getTableList(db: dbName))
}
server.get("/download") { r in
let dbName = r.routeParams["name"]!
let path = "\(self.dbDir)/\(dbName)"
if !File(path: path).exists {
throw SQLite.Result.error(message: "no such database: \(dbName)", code: 1, statement: nil)
}
return try StaticServer.serveFile(at: "\(self.dbDir)/\(dbName)")
}.middleware { request, closure in
let response = try closure(request)
let dbName = request.routeParams["name"]!
response.headers["Content-Type"] = "application/octet-stream"
response.headers["Content-Disposition"] = "attachment; filename=\"\(dbName)\""
return response
}
server.get("/execute") { r in
if let query = r.queryParams["query"] {
let dbName = r.routeParams["name"]!
return .success(try db.executeRawQuery(db: dbName, query: query))
}
return .error("Query is missing. use `/execute?query=insert...`")
}
}
}
}
server.files(in: assetDir)
}
open func start(port: UInt16 = 8081, dbDir: String? = nil, assetDir: String? = nil) {
self.dbDir = dbDir ?? NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
self.assetDir = assetDir ?? Bundle(for: SQLiteViewer.self).resourceURL!.appendingPathComponent("com.biatoms.sqlite-viewer.assets.bundle").path
try! server.run(port: port)
}
open func stop() {
server.stop()
}
}