Cassy - High Level Cassandra Client for Haskell
The intent is to develop a high quality, high level driver similar to pycassa.
There are currently two modules, one for basic/lower level (but still much more pleasant than thrift) operation, and one for some experimental JSON serialization support.
Please see the Haddocks hosted on HackageDB:
This module offers straightforward functionality that is still much more pleasant than using Thrift directly.
import Database.Cassandra.Basic test :: IO () test = do pool <- createCassandraPool defServers 3 300 "TestKeySpace" insert pool "testCF" "key1" QUORUM [col "col1" "value1"] getCol pool "testCF" "key1" "col1" QUORUM
This module does two things in addition to basic functionality:
Row and column keys are polymorphic so that you can use any type that is a member of the CKey typeclass. By default, we provide instances for String, ByteString and Text.
Values are automatically marshalled to/from JSON.
import Database.Cassandra.JSON import Data.Aeson type Name = String type Age = Int data Person = Person Name Age -- Define JSON serialization for our data structure instance ToJSON Person where toJSON (Person nm age) = toJSON (nm,age) instance FromJSON Person where parseJSON v = do (nm, age) <- parseJSON v return $ Person nm age test :: Person -> IO () test p@(Person nm age) = do pool <- createCassandraPool defServers 3 300 "TestKeySpace" -- I can use any string-like key and don't have to explicitly -- convert person to ByteString. insertCol pool "testCF" "people" nm QUORUM p -- Automatically de-serialized back to a datatype res <- getCol pool "testCF" "people" nm QUORUM case res of Just (Person nm age) -> return age Nothing -> error "Oh NO!!!"
- Added MonadCassandra typeclass, which is now used by all operations by default.
- Added a default Cas moand that instantiates MonadCassandra for convenience.
- All Basic module ops now return results directly instead of an Either wrapper. Each operation may raise a CassandraException.
- Connection pooling now builds on top of the resource-pool library to initiate connections to multiple servers in round-robin fashion.
- Basic.insert now knows how to insert a SuperColumn.
- Add support for counters and batch mutators
- Add support for composite columns
- Add support for database/admin operations
Would love to get contributions, bug reports, suggestions, feedback from the community.