diff --git a/Database/MongoDB.hs b/Database/MongoDB.hs index 5ec9636..51721dd 100644 --- a/Database/MongoDB.hs +++ b/Database/MongoDB.hs @@ -28,7 +28,10 @@ module Database.MongoDB -- * Connection Connection, connect, connectOnPort, conClose, disconnect, - -- * Basic database operations + -- * Database operations + Database, + collectionNames, + -- * Collection operations Collection, FieldSelector, NumToSkip, NumToReturn, Selector, QueryOpt(..), UpdateFlag(..), @@ -52,8 +55,9 @@ import qualified Data.ByteString.Lazy.UTF8 as L8 import Data.Int import Data.IORef import qualified Data.List as List +import Data.Maybe import Data.Typeable -import Database.MongoDB.BSON +import Database.MongoDB.BSON as BSON import Database.MongoDB.Util import qualified Network import Network.Socket hiding (connect, send, sendTo, recv, recvFrom) @@ -88,6 +92,14 @@ conClose = hClose . cHandle disconnect :: Connection -> IO () disconnect = conClose +-- | Return a list of collections in /Database/. +collectionNames :: Connection -> Database -> IO [Collection] +collectionNames c db = do + docs <- quickFind' c (db ++ ".system.namespaces") $ toBsonDoc [] + let names = flip List.map docs $ \doc -> + fromBson $ fromJust $ BSON.lookup (L8.fromString "name") doc + return $ List.filter (not . List.elem '$') names + -- | An Itertaor over the results of a query. Use 'nextDoc' to get each -- successive result document, or 'allDocs' or 'allDocs'' to get lazy or -- strict lists of results. @@ -146,6 +158,9 @@ toOpcode 2006 = OP_DELETE toOpcode 2007 = OP_KILL_CURSORS toOpcode n = throw $ MongoDBInternalError $ "Got unexpected Opcode: " ++ show n +-- | The name of a database. +type Database = String + -- | The full collection name. The full collection name is the -- concatenation of the database name with the collection name, using -- a @.@ for the concatenation. For example, for the database @foo@ diff --git a/TODO b/TODO index 6012d7d..ead6d5f 100644 --- a/TODO +++ b/TODO @@ -23,7 +23,6 @@ MongoDB - pair mode connection - operations on database objects * getName - * getCollectionNames * getCollection * dropCollection * executeCommand