Improve Mongo output handling
This commit is contained in:
parent
954b0bc8a6
commit
e507817b84
|
@ -7,63 +7,37 @@
|
|||
//
|
||||
|
||||
import Foundation
|
||||
import JavaScriptCore
|
||||
import MongoSwift
|
||||
|
||||
struct MongoEvaluator {
|
||||
|
||||
static let context: JSContext = {
|
||||
let context = JSContext()!
|
||||
let date: @convention(block) (JSValue) -> Dictionary<String, Any> = { (input) in
|
||||
["$date": input]
|
||||
}
|
||||
let functions: [NSString: @convention(block) (JSValue) -> Dictionary<String, Any>] = [
|
||||
"ObjectId": { (input) in
|
||||
["$oid": input]
|
||||
},
|
||||
"NumberLong": { (input) in
|
||||
["$numberLong": input]
|
||||
},
|
||||
"NumberInt": { (input) in
|
||||
["$numberInt": input]
|
||||
},
|
||||
"NumberDecimal": { (input) in
|
||||
["$numberDecimal": input]
|
||||
},
|
||||
"Date": date,
|
||||
"ISODate": date,
|
||||
]
|
||||
functions.forEach { (key, value) in
|
||||
context.setObject(value, forKeyedSubscript: key)
|
||||
}
|
||||
let dbRef: @convention(block) (String, String) -> Dictionary<String, Any> = { (ref, id) in
|
||||
["$ref": ref, "$id": ["$oid": id]]
|
||||
}
|
||||
context.setObject(dbRef, forKeyedSubscript: "DBRef" as NSString)
|
||||
return context
|
||||
}()
|
||||
static let decoder = BSONDecoder()
|
||||
|
||||
static func parse(shellJSON: String) -> Document? {
|
||||
guard !shellJSON.isEmpty,
|
||||
let result = context.evaluateScript("JSON.stringify(\(shellJSON))") else {
|
||||
return nil
|
||||
static func parse(extendedJSON: String) -> BSON? {
|
||||
guard !extendedJSON.isEmpty else {
|
||||
return nil
|
||||
}
|
||||
do {
|
||||
return try Document(fromJSON: result.toString())
|
||||
return try decoder.decode(BSON.self, from: extendedJSON)
|
||||
} catch {
|
||||
print("Unable to parse Document: \(error)")
|
||||
print("Unable to parse BSON: \(error)")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
static func eval(command: String, connectingTo connStr: String) -> [Document] {
|
||||
static func eval(command: String, connectingTo connStr: String) -> [BSON] {
|
||||
let realCommand = """
|
||||
Object.prototype.printExtJSON = function() { print(JSON.stringify(this)); };
|
||||
Array.prototype.printExtJSON = function() { this.map(JSON.stringify).forEach(it => print(it)); };
|
||||
\(command).printExtJSON()
|
||||
"""
|
||||
print("Running command \"\(command)\" against \(connStr)")
|
||||
|
||||
let mongoOutputPipe = Pipe()
|
||||
|
||||
let mongoProcess = Process()
|
||||
mongoProcess.launchPath = "/usr/local/bin/mongo"
|
||||
mongoProcess.arguments = [connStr, "--quiet", "--norc", "--eval", command]
|
||||
mongoProcess.arguments = [connStr, "--quiet", "--norc", "--eval", realCommand]
|
||||
mongoProcess.standardOutput = mongoOutputPipe
|
||||
mongoProcess.launch()
|
||||
|
||||
|
@ -78,7 +52,7 @@ struct MongoEvaluator {
|
|||
mongoOutputHandle.closeFile()
|
||||
|
||||
let lines = strs.joined(separator: "").components(separatedBy: "\n")
|
||||
return lines.compactMap(parse(shellJSON:))
|
||||
return lines.compactMap(parse(extendedJSON:))
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -37,8 +37,15 @@ class Node {
|
|||
}
|
||||
|
||||
init(key: Key? = nil, value: BSON) {
|
||||
self.key = key
|
||||
self.value = value
|
||||
|
||||
if key == nil,
|
||||
case let .document(doc) = value,
|
||||
case let .objectId(id) = doc["_id"] {
|
||||
self.key = .objectId(id)
|
||||
} else {
|
||||
self.key = key
|
||||
}
|
||||
}
|
||||
|
||||
convenience init(document: Document) {
|
||||
|
|
|
@ -20,7 +20,7 @@ class QueryViewController: NSViewController {
|
|||
let collection: DatabaseCollection
|
||||
|
||||
var defaultQuery: String {
|
||||
"db.getCollection('\(collection.name)').find({})"
|
||||
"db.getCollection('\(collection.name)').find({}).toArray()"
|
||||
}
|
||||
|
||||
var hasQueryChanged: Bool {
|
||||
|
|
Loading…
Reference in New Issue