Skip to content

Add IsSqlValue instance for Maybe, move SqlValue stuff to a separate module #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 26, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions MODULE.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ type ConnectionInfo = { password :: String, user :: String, port :: Number, db :
connect :: forall eff. ConnectionInfo -> Aff (db :: DB | eff) Client
```

Makes a connection to the database
Makes a connection to the database.

#### `execute`

``` purescript
execute :: forall eff a. Query a -> [SqlValue] -> Client -> Aff (db :: DB | eff) Unit
```

Runs a query and returns nothing
Runs a query and returns nothing.

#### `execute_`

Expand All @@ -61,7 +61,7 @@ Runs a query and returns nothing
query :: forall eff a p. (IsForeign a) => Query a -> [SqlValue] -> Client -> Aff (db :: DB | eff) [F a]
```

Runs a query and returns all results
Runs a query and returns all results.

#### `query_`

Expand Down Expand Up @@ -93,7 +93,7 @@ Just like `queryOne` but does not make any param replacement
queryValue :: forall eff a. (IsForeign a) => Query a -> [SqlValue] -> Client -> Aff (db :: DB | eff) (Maybe a)
```

Runs a query and returns a single value, if any
Runs a query and returns a single value, if any.

#### `queryValue_`

Expand All @@ -112,6 +112,16 @@ withConnection :: forall eff a. ConnectionInfo -> (Client -> Aff (db :: DB | eff
Connects to the database, calls the provided function with the client
and returns the results.

#### `end`

``` purescript
end :: forall eff. Client -> Eff (db :: DB | eff) Unit
```



## Module Database.Postgres.SqlValue

#### `SqlValue`

``` purescript
Expand Down Expand Up @@ -148,10 +158,10 @@ instance isSqlValueInt :: IsSqlValue Int
```


#### `end`
#### `isSqlValueMaybe`

``` purescript
end :: forall eff. Client -> Eff (db :: DB | eff) Unit
instance isSqlValueMaybe :: (IsSqlValue a) => IsSqlValue (Maybe a)
```


Expand Down
26 changes: 2 additions & 24 deletions src/Database/Postgres.purs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ module Database.Postgres
, Client()
, DB()
, ConnectionInfo()
, SqlValue()
, IsSqlValue
, toSql
, connect
, end
, execute, execute_
Expand All @@ -23,13 +20,14 @@ import Data.Array
import Data.Foreign
import Data.Foreign.Class
import Data.Maybe
import Data.Int
import Control.Monad.Aff
import Control.Monad.Eff.Class
import Control.Monad.Eff.Exception(Error(), error)
import Control.Monad.Error.Class (throwError)
import Data.Traversable (sequence)

import Database.Postgres.SqlValue

newtype Query a = Query String

foreign import data Client :: *
Expand Down Expand Up @@ -123,26 +121,6 @@ finally a sequel = do
sequel
either throwError pure res

foreign import data SqlValue :: *

foreign import unsafeToSqlValue """
function unsafeToSqlValue(x) {
return x;
}
""" :: forall a. a -> SqlValue

class IsSqlValue a where
toSql :: a -> SqlValue

instance isSqlValueString :: IsSqlValue String where
toSql = unsafeToSqlValue

instance isSqlValueNumber :: IsSqlValue Number where
toSql = unsafeToSqlValue

instance isSqlValueInt :: IsSqlValue Int where
toSql = unsafeToSqlValue <<< toNumber


foreign import connect' """
function connect$prime(conString) {
Expand Down
34 changes: 34 additions & 0 deletions src/Database/Postgres/SqlValue.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module Database.Postgres.SqlValue
( SqlValue()
, IsSqlValue
, toSql
) where

import Data.Int
import Data.Maybe

foreign import data SqlValue :: *

class IsSqlValue a where
toSql :: a -> SqlValue

instance isSqlValueString :: IsSqlValue String where
toSql = unsafeToSqlValue

instance isSqlValueNumber :: IsSqlValue Number where
toSql = unsafeToSqlValue

instance isSqlValueInt :: IsSqlValue Int where
toSql = unsafeToSqlValue <<< toNumber

instance isSqlValueMaybe :: (IsSqlValue a) => IsSqlValue (Maybe a) where
toSql Nothing = nullSqlValue
toSql (Just x) = toSql x

foreign import unsafeToSqlValue """
function unsafeToSqlValue(x) {
return x;
}
""" :: forall a. a -> SqlValue

foreign import nullSqlValue "var nullSqlValue = null;" :: SqlValue
1 change: 1 addition & 0 deletions test/Main.purs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Test.Main where

import Database.Postgres
import Database.Postgres.SqlValue
import Debug.Trace
import Control.Monad.Eff
import Control.Monad.Eff.Class
Expand Down