A wrapper for LMDB written in Swift for Package Manager.
Works on all platforms supported by Swift.
SwiftLMDB works with Data types for keys and values. Let's say you have the following data:
let key = "master-key".data(using: .utf8)!
let value = "master-value".data(using: .utf8)!
You'll also need filesystem url to a file or a directory like:
let url = URL(fileURLWithPath: "/usr/local/some-database", isDirectory: true)
You can use it like this:
import LMDB
let lmdb = try LMDB(url: url)
try lmdb.beginTransaction { database in
try database.put(value: value, forKey: key)
let dbValue = try database.get(key: key)
try database.del(key: key)
}
Cursors are also supported:
import LMDB
let lmdb = try LMDB(url: url)
try lmdb.beginTransactionWithCursor { database, cursor in
try cursor.put(value: value, forKey: key)
let dbValue = try cursor.get(.first)
try cursor.del()
}
- This library abstracts many things. You don't need to create environment, open a database and start/commit/abort transactions, this is all done for you.
- You don't need to create intermediate directories in your path, those will be created if needed.
- Successful transaction commits automatically and if something throws inside
beginTransaction
block - transaction aborts. - Some lmdb flags are set automatically: if url points to a file -
MDB_NOSUBDIR
will be set on environment. If you passisReadOnly
to SwiftLMDB constructor -MDB_RDONLY
flag will be added etc.
For named databases use beginTransaction(name: String?, flags: DatabaseFlags?)
but also make sure to setMaxDbs
to something >0 before this call like:
let lmdb = try LMDB(url: url)
try lmdb.configureEnvironment { configuration in
configuration.setMaxDbs(1)
}
try lmdb.beginTransaction(name: "my-database") { database in
...
}
You can follow official guide and do things the way you'd them with the original lmdb library:
let url = URL(fileURLWithPath: "/usr/local/some-database", isDirectory: true)
let key = "master-key".data(using: .utf8)!
let value = "master-value".data(using: .utf8)!
let environment = try Environment(url: url, isReadOnly: false)
let transaction = Transaction(environment: environment, isReadOnly: false)
let database = Database(transaction: transaction)
try environment.configure { (configiration) in
try configuration.setMaxDbs(10)
try configuration.setFlags([.noSync, .noTls])
}
try environment.open()
try database.open(name: "some-database", flags: [.dupSort])
try transaction.begin()
try database.put(value: value, forKey: key, flags: [.noDupData])
try transaction.commit()