packages feed

rocksdb-haskell-jprupp-2.1.0: src/Database/RocksDB/C.hs

{-# LANGUAGE CPP                      #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LANGUAGE ForeignFunctionInterface #-}
-- |
-- Module      : Database.RocksDB.C
-- Copyright   : (c) 2012-2020 The rocksdb-haskell Authors
-- License     : BSD3
-- Maintainer  : jprupp@protonmail.ch
-- Stability   : experimental
-- Portability : non-portable
--

module Database.RocksDB.C
    ( RocksDB
    , Options
    , ReadOpts
    , WriteOpts
    , ColumnFamily
    , PrefixExtract
    , Snapshot
    , Iterator
    , WriteBatch
    , BloomFilter
    , ErrPtr
    , DBName
    , CFName
    , Key
    , Val
    , c_rocksdb_open
    , c_rocksdb_open_column_families
    , c_rocksdb_close
    , c_rocksdb_create_column_family
    , c_rocksdb_drop_column_family
    , c_rocksdb_column_family_handle_destroy
    , c_rocksdb_put
    , c_rocksdb_put_cf
    , c_rocksdb_delete
    , c_rocksdb_delete_cf
    , c_rocksdb_write
    , c_rocksdb_get
    , c_rocksdb_get_cf
    , c_rocksdb_multi_get
    , c_rocksdb_multi_get_cf
    , c_rocksdb_create_snapshot
    , c_rocksdb_release_snapshot
    , c_rocksdb_property_value
    , c_rocksdb_approximate_sizes
    , c_rocksdb_destroy_db
    , c_rocksdb_repair_db
    , c_rocksdb_create_iterator
    , c_rocksdb_create_iterator_cf
    , c_rocksdb_iter_destroy
    , c_rocksdb_iter_valid
    , c_rocksdb_iter_seek_to_first
    , c_rocksdb_iter_seek_to_last
    , c_rocksdb_iter_seek
    , c_rocksdb_iter_next
    , c_rocksdb_iter_prev
    , c_rocksdb_iter_key
    , c_rocksdb_iter_value
    , c_rocksdb_iter_get_error
    , c_rocksdb_writebatch_create
    , c_rocksdb_writebatch_destroy
    , c_rocksdb_writebatch_clear
    , c_rocksdb_writebatch_put
    , c_rocksdb_writebatch_put_cf
    , c_rocksdb_writebatch_delete
    , c_rocksdb_writebatch_delete_cf
    , c_rocksdb_options_create
    , c_rocksdb_options_destroy
    , c_rocksdb_options_set_create_if_missing
    , c_rocksdb_options_set_error_if_exists
    , c_rocksdb_options_set_paranoid_checks
    , c_rocksdb_options_set_max_open_files
    , c_rocksdb_options_set_prefix_extractor
    , c_rocksdb_slicetransform_create_fixed_prefix
    , c_rocksdb_slicetransform_destroy
    , c_rocksdb_filterpolicy_destroy
    , c_rocksdb_filterpolicy_create_bloom
    , c_rocksdb_readoptions_create
    , c_rocksdb_readoptions_destroy
    , c_rocksdb_readoptions_set_snapshot
    , c_rocksdb_writeoptions_create
    , c_rocksdb_writeoptions_destroy
    , c_rocksdb_free
    ) where

import           Foreign
import           Foreign.C.String
import           Foreign.C.Types

data LRocksDB
data LColumnFamily
data LIterator
data LOptions
data LReadOpts
data LSnapshot
data LWriteBatch
data LWriteOpts
data LBloomFilter
data LPrefixExtract

type RocksDB       = Ptr LRocksDB
type ColumnFamily  = Ptr LColumnFamily
type Options       = Ptr LOptions
type WriteBatch    = Ptr LWriteBatch
type PrefixExtract = Ptr LPrefixExtract
type ReadOpts      = Ptr LReadOpts
type WriteOpts     = Ptr LWriteOpts
type Snapshot      = Ptr LSnapshot
type Iterator      = Ptr LIterator
type BloomFilter   = Ptr LBloomFilter

type ErrPtr           = Ptr CString
type DBName           = CString
type CFName           = CString
type Key              = CString
type Val              = CString

foreign import ccall safe "rocksdb/c.h rocksdb_open"
  c_rocksdb_open :: Options -> DBName -> ErrPtr -> IO RocksDB

foreign import ccall safe "rocksdb/c.h rocksdb_open_column_families"
  c_rocksdb_open_column_families :: Options
                                 -> DBName
                                 -> CInt
                                 -> Ptr CFName
                                 -> Ptr Options
                                 -> Ptr ColumnFamily
                                 -> ErrPtr
                                 -> IO RocksDB

foreign import ccall safe "rocksdb/c.h rocksdb_close"
  c_rocksdb_close :: RocksDB -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_create_column_family"
  c_rocksdb_create_column_family :: RocksDB
                                 -> Options
                                 -> CFName
                                 -> ErrPtr
                                 -> IO ColumnFamily

foreign import ccall safe "rocksdb/c.h rocksdb_drop_column_family"
  c_rocksdb_drop_column_family :: RocksDB
                               -> ColumnFamily
                               -> ErrPtr
                               -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_column_family_handle_destroy"
  c_rocksdb_column_family_handle_destroy :: ColumnFamily -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_put"
  c_rocksdb_put :: RocksDB
                -> WriteOpts
                -> Key -> CSize
                -> Val -> CSize
                -> ErrPtr
                -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_put_cf"
  c_rocksdb_put_cf :: RocksDB
                   -> WriteOpts
                   -> ColumnFamily
                   -> Key -> CSize
                   -> Val -> CSize
                   -> ErrPtr
                   -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_delete"
  c_rocksdb_delete :: RocksDB
                   -> WriteOpts
                   -> Key -> CSize
                   -> ErrPtr
                   -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_delete_cf"
  c_rocksdb_delete_cf :: RocksDB
                      -> WriteOpts
                      -> ColumnFamily
                      -> Key -> CSize
                      -> ErrPtr
                      -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_write"
  c_rocksdb_write :: RocksDB
                  -> WriteOpts
                  -> WriteBatch
                  -> ErrPtr
                  -> IO ()

-- | Returns NULL if not found. A malloc()ed array otherwise.
-- Stores the length of the array in *vallen.
foreign import ccall safe "rocksdb/c.h rocksdb_get"
  c_rocksdb_get :: RocksDB
                -> ReadOpts
                -> Key -> CSize
                -> Ptr CSize        -- ^ value length
                -> ErrPtr
                -> IO CString

foreign import ccall safe "rocksdb/c.h rocksdb_get_cf"
  c_rocksdb_get_cf :: RocksDB
                   -> ReadOpts
                   -> ColumnFamily
                   -> Key -> CSize
                   -> Ptr CSize        -- ^ value length
                   -> ErrPtr
                   -> IO CString

foreign import ccall safe "rocksdb/c.h rocksdb_multi_get"
  c_rocksdb_multi_get :: RocksDB
                      -> ReadOpts
                      -> CSize        -- ^ number of keys
                      -> Ptr CString  -- ^ keys
                      -> Ptr CSize    -- ^ key sizes
                      -> Ptr CString  -- ^ values
                      -> Ptr CSize    -- ^ values sizes
                      -> ErrPtr
                      -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_multi_get_cf"
  c_rocksdb_multi_get_cf :: RocksDB
                         -> ReadOpts
                         -> Ptr ColumnFamily -- ^ column families
                         -> CSize                   -- ^ number of keys
                         -> Ptr CString             -- ^ keys
                         -> Ptr CSize               -- ^ key sizes
                         -> Ptr CString             -- ^ values
                         -> Ptr CSize               -- ^ values sizes
                         -> ErrPtr
                         -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_create_snapshot"
  c_rocksdb_create_snapshot :: RocksDB -> IO Snapshot

foreign import ccall safe "rocksdb/c.h rocksdb_release_snapshot"
  c_rocksdb_release_snapshot :: RocksDB -> Snapshot -> IO ()

-- | Returns NULL if property name is unknown. Else returns a pointer to a
-- malloc()-ed null-terminated value.
foreign import ccall safe "rocksdb/c.h rocksdb_property_value"
  c_rocksdb_property_value :: RocksDB -> CString -> IO CString

foreign import ccall safe "rocksdb/c.h rocksdb_approximate_sizes"
  c_rocksdb_approximate_sizes :: RocksDB
                              -> CInt
                                 -- ^ num ranges
                              -> Ptr CString -> Ptr CSize
                                 -- ^ range start keys (array)
                              -> Ptr CString -> Ptr CSize
                                 -- ^ range limit keys (array)
                              -> Ptr Word64
                                 -- ^ array of approx. sizes of ranges
                              -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_destroy_db"
  c_rocksdb_destroy_db :: Options -> DBName -> ErrPtr -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_repair_db"
  c_rocksdb_repair_db :: Options -> DBName -> ErrPtr -> IO ()


--
-- Iterator
--

foreign import ccall safe "rocksdb/c.h rocksdb_create_iterator"
  c_rocksdb_create_iterator :: RocksDB
                            -> ReadOpts
                            -> IO Iterator

foreign import ccall safe "rocksdb/c.h rocksdb_create_iterator_cf"
  c_rocksdb_create_iterator_cf :: RocksDB
                               -> ReadOpts
                               -> ColumnFamily
                               -> IO Iterator

foreign import ccall safe "rocksdb/c.h rocksdb_iter_destroy"
  c_rocksdb_iter_destroy :: Iterator -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_valid"
  c_rocksdb_iter_valid :: Iterator -> IO CUChar

foreign import ccall safe "rocksdb/c.h rocksdb_iter_seek_to_first"
  c_rocksdb_iter_seek_to_first :: Iterator -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_seek_to_last"
  c_rocksdb_iter_seek_to_last :: Iterator -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_seek"
  c_rocksdb_iter_seek :: Iterator -> Key -> CSize -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_next"
  c_rocksdb_iter_next :: Iterator -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_prev"
  c_rocksdb_iter_prev :: Iterator -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_iter_key"
  c_rocksdb_iter_key :: Iterator -> Ptr CSize -> IO Key

foreign import ccall safe "rocksdb/c.h rocksdb_iter_value"
  c_rocksdb_iter_value :: Iterator -> Ptr CSize -> IO Val

foreign import ccall safe "rocksdb/c.h rocksdb_iter_get_error"
  c_rocksdb_iter_get_error :: Iterator -> ErrPtr -> IO ()


--
-- Write batch
--

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_create"
  c_rocksdb_writebatch_create :: IO WriteBatch

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_destroy"
  c_rocksdb_writebatch_destroy :: WriteBatch -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_clear"
  c_rocksdb_writebatch_clear :: WriteBatch -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_put"
  c_rocksdb_writebatch_put :: WriteBatch
                           -> Key -> CSize
                           -> Val -> CSize
                           -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_put_cf"
  c_rocksdb_writebatch_put_cf :: WriteBatch
                              -> ColumnFamily
                              -> Key -> CSize
                              -> Val -> CSize
                              -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_delete"
  c_rocksdb_writebatch_delete :: WriteBatch
                              -> Key -> CSize -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_writebatch_delete_cf"
  c_rocksdb_writebatch_delete_cf :: WriteBatch
                                 -> ColumnFamily
                                 -> Key
                                 -> CSize
                                 -> IO ()

--
-- Options
--

foreign import ccall safe "rocksdb/c.h rocksdb_options_create"
  c_rocksdb_options_create :: IO Options

foreign import ccall "rocksdb/c.h rocksdb_options_destroy"
  c_rocksdb_options_destroy :: Options -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_options_set_create_if_missing"
  c_rocksdb_options_set_create_if_missing :: Options -> CBool -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_options_set_error_if_exists"
  c_rocksdb_options_set_error_if_exists :: Options -> CBool -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_options_set_paranoid_checks"
  c_rocksdb_options_set_paranoid_checks :: Options -> CBool -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_options_set_max_open_files"
  c_rocksdb_options_set_max_open_files :: Options -> CInt -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_options_set_prefix_extractor"
  c_rocksdb_options_set_prefix_extractor :: Options
                                         -> PrefixExtract
                                         -> IO ()

--
-- Prefix Extractor
--

foreign import ccall safe "rocksdb/c.h rocksdb_slicetransform_create_fixed_prefix"
  c_rocksdb_slicetransform_create_fixed_prefix :: CSize -> IO PrefixExtract

foreign import ccall safe "rocksdb/c.h rocksdb_slicetransform_destroy"
  c_rocksdb_slicetransform_destroy :: PrefixExtract -> IO ()

--
-- Bloom Filter
--

foreign import ccall safe "rocksdb/c.h rocksdb_filterpolicy_destroy"
  c_rocksdb_filterpolicy_destroy :: BloomFilter -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_filterpolicy_create_bloom"
  c_rocksdb_filterpolicy_create_bloom :: CInt -> IO BloomFilter

--
-- Read options
--

foreign import ccall safe "rocksdb/c.h rocksdb_readoptions_create"
  c_rocksdb_readoptions_create :: IO ReadOpts

foreign import ccall safe "rocksdb/c.h rocksdb_readoptions_destroy"
  c_rocksdb_readoptions_destroy :: ReadOpts -> IO ()

foreign import ccall safe "rocksdb/c.h rocksdb_readoptions_set_snapshot"
  c_rocksdb_readoptions_set_snapshot :: ReadOpts -> Snapshot -> IO ()


--
-- Write options
--

foreign import ccall safe "rocksdb/c.h rocksdb_writeoptions_create"
  c_rocksdb_writeoptions_create :: IO WriteOpts

foreign import ccall safe "rocksdb/c.h rocksdb_writeoptions_destroy"
  c_rocksdb_writeoptions_destroy :: WriteOpts -> IO ()

--
-- Free
--

foreign import ccall safe "rocksdb/c.h rocksdb_free"
  c_rocksdb_free :: CString -> IO ()