BerkeleyDB 0.8.6 → 0.8.7
raw patch · 4 files changed
+45/−8 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Database.Berkeley.Db: dbCursor_set_range :: [DbFlag] -> DbCursor -> ByteString -> IO (Maybe (ByteString, ByteString))
Files
- BerkeleyDB.cabal +5/−3
- Database/Berkeley/Db.hsc +31/−2
- Database/Berkeley/db_helper.c +7/−2
- Database/Berkeley/db_helper.h +2/−1
BerkeleyDB.cabal view
@@ -1,5 +1,5 @@ name: BerkeleyDB-version: 0.8.6+version: 0.8.7 license: BSD3 license-file: LICENSE cabal-version: >= 1.4@@ -26,9 +26,11 @@ DARCS repository: <http://code.haskell.org/BerkeleyDB/> .- Changes: 0.8: Support db4.7 and db4.8, removed C++ binding.+ Changes: 0.7.2: Fix on db4.7+ 0.8: Support db4.7 and db4.8, removed C++ binding. 0.8.5: Add db_sync.- 0.7.2: Fix on db4.7+ 0.8.6: Fix crash in transaction commit.+ 0.8.7: Add dbCursor_set_range. . Contributors: Michael Stone, Balázs Jávorszky
Database/Berkeley/Db.hsc view
@@ -71,6 +71,7 @@ dbCursor_dup, dbCursor_get, dbCursor_set,+ dbCursor_set_range, dbCursor_put, -- * Logging subsystem #if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 7) || DB_VERSION_MAJOR > 4@@ -1225,7 +1226,7 @@ BSI.fromForeignPtr value 0 (fromIntegral value_len)) foreign import ccall "db_helper.h _dbCursor_set" _dbCursor_set- :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Word32 -> IO CInt+ :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Word32 -> IO CInt -- | Move the cursor to the specified key/data pair of the database, and return -- the datum associated with the given key, or Nothing if it wasn't matched.@@ -1236,7 +1237,7 @@ alloca $ \ptr1 -> alloca $ \ptr2 -> withForeignPtr cur $ \c_cur -> do- ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) ptr1 ptr2 (dbOrFlags (DB_SET:flags))+ ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) nullPtr nullPtr ptr1 ptr2 (dbOrFlags (DB_SET:flags)) if ret /= 0 then if (dbErrFromNum$ fromIntegral ret) == DB_NOTFOUND@@ -1247,6 +1248,34 @@ value_len <- peek ptr2 str <- newForeignPtr _freeString_finalizer c_value return $ Just $ BSI.fromForeignPtr str 0 (fromIntegral value_len)++-- | Move the cursor to the specified key/data pair of the database, and return+-- the next record (key, value) where the key is greater than or equal to+-- the specified key, or Nothing if no such record was found.+-- (This is DBC->get with the DB_SET_RANGE flag. The DB_SET_RANGE flag is implied.)+dbCursor_set_range :: [DbFlag] -> DbCursor -> ByteString -> IO (Maybe (ByteString, ByteString))+dbCursor_set_range flags cur key =+ withByteString key $ \c_key key_len ->+ alloca $ \ptr1 ->+ alloca $ \ptr2 ->+ alloca $ \ptr3 ->+ alloca $ \ptr4 ->+ withForeignPtr cur $ \c_cur -> do+ ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) ptr1 ptr2 ptr3 ptr4 (dbOrFlags (DB_SET_RANGE:flags))+ if ret /= 0+ then+ if (dbErrFromNum$ fromIntegral ret) == DB_NOTFOUND+ then return Nothing+ else throwDB "dbCursor_set" ret+ else do+ c_key <- peek ptr1+ key_len <- peek ptr2+ key_str <- newForeignPtr _freeString_finalizer c_key+ c_value <- peek ptr3+ value_len <- peek ptr4+ value_str <- newForeignPtr _freeString_finalizer c_value+ return $ Just (BSI.fromForeignPtr key_str 0 (fromIntegral key_len),+ BSI.fromForeignPtr value_str 0 (fromIntegral value_len)) foreign import ccall "db_helper.h _dbCursor_put" _dbCursor_put :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr Word8 -> CUInt -> Word32 -> IO CInt
Database/Berkeley/db_helper.c view
@@ -458,14 +458,15 @@ return ret; } -int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** value, u_int32_t* value_len, u_int32_t flags)+int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** okey, u_int32_t* okey_len,+ char** value, u_int32_t* value_len, u_int32_t flags) { UNWRAP_DBCURSOR(); int ret; DBT keyDbt; memset(&keyDbt, 0, sizeof(keyDbt));- keyDbt.flags = DB_DBT_USERMEM;+ keyDbt.flags = okey ? DB_DBT_MALLOC : DB_DBT_USERMEM; keyDbt.data = (void*)key; keyDbt.size = key_len; @@ -477,6 +478,10 @@ ret = dbc->get(dbc, &keyDbt, &valueDbt, flags); if (ret == 0) {+ if (okey) {+ *okey = (char*)keyDbt.data;+ *okey_len = keyDbt.size;+ } *value = (char*)valueDbt.data; *value_len = valueDbt.size; }
Database/Berkeley/db_helper.h view
@@ -63,7 +63,8 @@ int _dbCursor_del(DBC** dbcp, u_int32_t flags); int _dbCursor_dup(DBC** dbcp, DBC*** dbcursorpp, u_int32_t flags); int _dbCursor_get(DBC** dbcp, char** key, u_int32_t* key_len, char** value, u_int32_t* value_len, u_int32_t flags);-int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** value, u_int32_t* value_len, u_int32_t flags);+int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** okey, u_int32_t* okey_len,+ char** value, u_int32_t* value_len, u_int32_t flags); int _dbCursor_put(DBC** dbcp, const char* key, u_int32_t key_len, const char* value, u_int32_t value_len, u_int32_t flags); #endif