haskelldb-flat 0.10 → 1.0.1
raw patch · 5 files changed
+93/−40 lines, 5 filesdep +containersdep +directorydep +old-timedep −haskell98dep ~basedep ~haskelldbnew-component:exe:DBDirect-flatnew-uploader
Dependencies added: containers, directory, old-time
Dependencies removed: haskell98
Dependency ranges changed: base, haskelldb
Files
- DBDirect.hs +5/−0
- Database/HaskellDB/FlatDB.hs +34/−17
- LICENSE +31/−0
- haskelldb-flat.cabal +23/−13
- tools/flatdb-create.hs +0/−10
+ DBDirect.hs view
@@ -0,0 +1,5 @@+import Database.HaskellDB.FlatDB+import Database.HaskellDB.DBDirect++main :: IO ()+main = dbdirect driver
Database/HaskellDB/FlatDB.hs view
@@ -16,15 +16,18 @@ withFlatDB, newDB) where import Database.HaskellDB.Database-import Database.HaskellDB.HDBRec import Database.HaskellDB.FieldType import Database.HaskellDB.PrimQuery import Database.HaskellDB.Query hiding (isNull, union, intersect) import Database.HaskellDB.DriverAPI+import Database.HaskellDB (Record) +import Control.Exception (bracket) import Control.Monad+import Control.Monad.Error () import Control.Monad.Trans import Data.Bits+import Data.Function (on) import Data.IORef import Data.Map (Map) import qualified Data.Map as Map@@ -67,11 +70,12 @@ flatDBConnectOpts opts f = do [a] <- getOptions ["filepath"] opts withFlatDB a f +-- FIXME: this is full of race conditions withFlatDB :: MonadIO m => FilePath -> (Database -> m a) -> m a withFlatDB f m = do e <- liftIO $ doesFileExist f when (not e) $ liftIO $ newDB f- db <- liftIO $ readDB f+ db <- liftIO $ fileReadDB f dbr <- liftIO $ newIORef db x <- m (flatDatabase dbr) db' <- liftIO $ readIORef dbr@@ -106,28 +110,37 @@ dbDropTable = \x -> modifyDB db $ flatDropTable x } +fileReadDB :: FilePath -> IO FlatDB+fileReadDB f = openFile f ReadMode >>= hReadDB -readDB :: FilePath -> IO FlatDB-readDB f = do c <- readFile f- case reads c of- [] -> err $ "parse error"- [(x,[])] -> return x- [(_,_)] -> err $ "junk at end"- _ -> fail $ "ambiguous parse"- where err e = fail $ "FlatDB error when reading " ++ show f - ++ ": " ++ e+hReadDB :: Handle -> IO FlatDB+hReadDB h = + do c <- hGetContents h+ case readDB c of+ Left err ->+ fail $ "FlatDB error when reading " ++ show h+ ++ ": " ++ err+ Right db -> return db -writeDB :: FilePath -> FlatDB -> IO ()-writeDB f db = do h <- openFile f WriteMode- hWriteDB h db- hClose h+fileWriteDB :: FilePath -> FlatDB -> IO ()+fileWriteDB f db = bracket (openFile f WriteMode) hClose (flip hWriteDB db) hWriteDB :: Handle -> FlatDB -> IO ()-hWriteDB h db = hPutStr h $ show db+hWriteDB h db = hPutStr h $ showDB db newDB :: FilePath -> IO ()-newDB f = writeDB f emptyDB+newDB f = fileWriteDB f emptyDB +showDB :: FlatDB -> String+showDB = show . Map.toList ++readDB :: Monad m => String -> m FlatDB+readDB c = case reads c of+ [] -> fail "parse error"+ [(x,[])] -> return $ Map.fromList x+ [(_,_)] -> fail "junk at end"+ _ -> fail "ambiguous parse"+ -- Relations -- FIXME: make distinct@@ -196,6 +209,10 @@ | otherwise = map (\g -> fst (head g) ++ [(n,evalAggr (map snd g) e) | (n,e) <- abs]) rps2 Restrict p x -> relFilter (\r -> toBool (evalExpr r p)) t where t = e x+ Group gs x -> FlatRel { relSchema = s, relRows = rs' }+ where FlatRel { relSchema = s, relRows = rs } = e x+ -- FIXME: BUG: what if groups are not contiguous?+ rs' = map (fst . head) $ groupBy ((==) `on` snd) [(r,evalBinds r gs) | r <- rs] Binary op x1 x2 -> case op of Times -> FlatRel { relSchema = s1 ++ s2, -- FIXME: assert s1, s2 disjoint
+ LICENSE view
@@ -0,0 +1,31 @@+Copyright (c) 1999 Daan Leijen, daan@cs.uu.nl+Copyright (c) 2003-2004 The HaskellDB development team+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are+met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the names of the copyright holders nor the names of the+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
haskelldb-flat.cabal view
@@ -1,23 +1,33 @@ Name: haskelldb-flat-Version: 0.10+Version: 1.0.1+Cabal-version: >= 1.6+Build-type: Simple+Homepage: https://github.com/m4dc4p/haskelldb+Maintainer: Maintainer: haskelldb-users@lists.sourceforge.net+License-file: LICENSE Copyright: Bjorn Bringert-Maintainer: bjorn@bringert.net Author: Bjorn Bringert License: BSD3-build-depends: - haskell98, - base, - mtl, - haskelldb==0.10-Extensions: Synopsis: An experimental HaskellDB back-end in pure Haskell (no SQL) Description: This is a very experimental HaskellDB back-end which is written in pure Haskell and doesn't use SQL. It stores the database in a file. Using this with concurrent writes leads to data loss. This back-end does not support transactions.-Exposed-Modules: Database.HaskellDB.FlatDB-ghc-options: -O2+Category: Database -Executable: flatdb-create-Main-Is: tools/flatdb-create.hs-ghc-options: -O2 -Wall+Flag split-base++Library+ Build-depends: mtl, haskelldb >= 1 && < 2+ if flag(split-base)+ Build-depends: base >= 3 && < 5, containers, old-time >= 1 && < 2, directory >= 1 && < 2+ else+ Build-depends: base < 3.0+ Exposed-Modules: Database.HaskellDB.FlatDB++Executable DBDirect-flat+ Main-is: DBDirect.hs++Source-repository head+ Type: git+ Location: https://github.com/m4dc4p/haskelldb
− tools/flatdb-create.hs
@@ -1,10 +0,0 @@-import Database.HaskellDB.FlatDB--import System.Environment-import System.IO--main :: IO ()-main = do args <- getArgs- case args of- [f] -> newDB f- _ -> hPutStrLn stderr "Usage: flatdb-create <file>"