Skip to content
/ swift-lmdb Public

A Swift wrapper for LMDB - Lightning Memory-Mapped Database

License

Notifications You must be signed in to change notification settings

VFK/swift-lmdb

Repository files navigation

SwiftLMDB SPM Version

A wrapper for LMDB written in Swift for Package Manager.

Works on all platforms supported by Swift.

Usage

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 pass isReadOnly 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
    ...
}

Additionally direct mappings to lmdb methods are also provided

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()

About

A Swift wrapper for LMDB - Lightning Memory-Mapped Database

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages