lua-cassandra
A pure Lua client library for Apache Cassandra
$ opm get thibaultcha/lua-cassandra
lua-cassandra
![Module Version][badge-version-image] [![Build Status][badge-travis-image]][badge-travis-url] [![Coverage Status][badge-coveralls-image]][badge-coveralls-url]
A pure Lua client library for Apache Cassandra (2.x/3.x), compatible with [OpenResty].
Features
This library offers 2 modules: a "single host" module, compatible with PUC Lua 5.1/5.2, LuaJIT and OpenResty, which allows your application to connect itself to a given Cassandra node, and a "cluster" module, only compatible with OpenResty which adds support for multi-node Cassandra datacenters.
Single host
cassandra
module:no dependencies
support for Cassandra 2.x and 3.x
simple, prepared, and batch statements
pagination (manual and automatic via Lua iterators)
SSL client-to-node connections
client authentication
leverage the non-blocking, reusable cosocket API in ngx_lua (with automatic fallback to LuaSocket in non-supported contexts)
Cluster
resty.cassandra.cluster
module:all features from the
cassandra
modulecluster topology discovery
advanced querying options
configurable policies (load balancing, retry, reconnection)
optimized performance for OpenResty
Usage
Single host module (Lua and OpenResty):
local cassandra = require "cassandra"
local peer = assert(cassandra.new {
host = "127.0.0.1",
port = 9042,
keyspace = "my_keyspace"
})
peer:settimeout(1000)
assert(peer:connect())
assert(peer:execute("INSERT INTO users(id, name, age) VALUES(?, ?, ?)", {
cassandra.uuid("1144bada-852c-11e3-89fb-e0b9a54a6d11"),
"John O Reilly",
42
}))
local rows = assert(peer:execute "SELECT * FROM users")
local user = rows[1]
print(user.name) -- John O Reilly
print(user.age) -- 42
peer:close()
Cluster module (OpenResty only):
http {
# you do not need the following line if you are using luarocks
lua_package_path "/path/to/src/?.lua;/path/to/src/?/init.lua;;";
# all cluster informations will be stored here
lua_shared_dict cassandra 1m;
server {
...
location / {
content_by_lua_block {
local Cluster = require 'resty.cassandra.cluster'
-- For performance reasons, the cluster variable
-- should live in an upvalue at the main chunk level of your
-- modules to avoid creating it on every request.
-- see the 'intro' example in the online documentation.
local cluster, err = Cluster.new {
shm = 'cassandra', -- defined by the lua_shared_dict directive
contact_points = {'127.0.0.1', '127.0.0.2'},
keyspace = 'my_keyspace'
}
if not cluster then
ngx.log(ngx.ERR, 'could not create cluster: ', err)
return ngx.exit(500)
end
local rows, err = cluster:execute "SELECT * FROM users"
if not rows then
ngx.log(ngx.ERR, 'could not retrieve users: ', err)
return ngx.exit(500)
end
ngx.say('users: ', #rows)
}
}
}
}
Installation
With [Luarocks]:
$ luarocks install lua-cassandra
Or via opm:
$ opm get thibaultcha/lua-cassandra
Or manually:
Once you have a local copy of this module's lib/
directory, add it to your LUA_PATH
(or lua_package_path
directive for OpenResty):
/path/to/lib/?.lua;/path/to/lib/?/init.lua;
Note: When used outside of OpenResty, or in the init_by_lua
context, this module requires additional dependencies:
If you wish to use SSL client-to-node connections, LuaSec
When used in PUC-Lua, Lua BitOp (installed by Luarocks)
Documentation and Examples
Refer to the online [manual] and detailed [documentation]. You will also find [examples] there and you can browse the test suites for in-depth ones.
Roadmap
Cluster:
new load balancing policies (token-aware)
CQL:
implement
decimal
data typev4: implement
date
andtime
data typesv4: implement
smallint
andtinyint
data types
Development
Test Suites
The single host tests require [busted] and [ccm] to be installed. They can be run with:
$ make busted
The cluster module tests require Test::Nginx::Socket in addition to ccm. They can be run with:
$ make prove
Tools
This module uses various tools for documentation and code quality, they can easily be installed from Luarocks by running:
$ make dev
Code coverage is analyzed with luacov from the busted tests:
$ make coverage
The code is linted with luacheck:
$ make lint
The documentation is generated with ldoc and can be generated with:
$ make doc
[Luarocks]: https://luarocks.org [OpenResty]: https://openresty.org [ccm]: https://github.com/pcmanus/ccm [busted]: http://olivinelabs.com/busted
[documentation]: http://thibaultcha.github.io/lua-cassandra/ [manual]: http://thibaultcha.github.io/lua-cassandra/manual/README.md.html [examples]: http://thibaultcha.github.io/lua-cassandra/examples/intro.lua.html
[badge-travis-url]: https://travis-ci.org/thibaultcha/lua-cassandra [badge-travis-image]: https://travis-ci.org/thibaultcha/lua-cassandra.svg?branch=master
[badge-coveralls-url]: https://coveralls.io/r/thibaultcha/lua-cassandra?branch=master [badge-coveralls-image]: https://coveralls.io/repos/thibaultcha/lua-cassandra/badge.svg?branch=master&style=flat
[badge-version-image]: https://img.shields.io/badge/version-1.5.2-blue.svg?style=flat
Authors
Thibault Charbonnier (thibaultcha)
License
mit
Versions
-
A pure Lua client library for Apache Cassandra 2022-05-20 18:16:01
-
A pure Lua client library for Apache Cassandra 2019-09-26 01:04:53
-
A pure Lua client library for Apache Cassandra 2019-05-09 20:03:56
-
A pure Lua client library for Apache Cassandra 2019-01-23 22:28:04
-
A pure Lua client library for Apache Cassandra 2018-11-09 23:56:43
-
A pure Lua client library for Apache Cassandra 2018-08-10 20:26:43
-
A pure Lua client library for Apache Cassandra 2018-06-15 02:53:33
-
A pure Lua client library for Apache Cassandra 2017-01-12 22:17:21