In one of my last posts I showed a simple web application (created with the help of WebSharper Platform 2010) that captured registration information from a user and saved it to a CouchDB database. I've been using CouchDB for a while now and I'm still amazed at how quickly you can get things up and running when you don't have to worry about the object-relational impedance mismatch.
To interact with CouchDB, I primarily use Relax (a full featured ".NET API abstraction of CouchDB's (excellent) RESTful API"); however, I thought it might be fun and educational to create a simple CouchDB .NET API abstraction in F#. Note: The code provided here is loosely based on SharpCouch.
Just Show Me the Code:
Without any further ado, here's the code.
module FSharpCouch
open System
open System.Net
open System.Text
open System.IO
open Newtonsoft.Json
open Newtonsoft.Json.Linq
let WriteRequest url methodName contentType content =
let request = WebRequest.Create(string url)
request.Method <- methodName
request.ContentType <- contentType
let bytes = UTF8Encoding.UTF8.GetBytes(string content)
use requestStream = request.GetRequestStream()
requestStream.Write(bytes, 0, bytes.Length)
request
let AsyncReadResponse (request:WebRequest) =
async { use! response = request.AsyncGetResponse()
use stream = response.GetResponseStream()
use reader = new StreamReader(stream)
let contents = reader.ReadToEnd()
return contents }
let ProcessRequest url methodName contentType content =
match methodName with
| "POST" ->
WriteRequest url methodName contentType content
| _ ->
let req = WebRequest.Create(string url)
req.Method <- methodName
req
|> AsyncReadResponse
|> Async.RunSynchronously
let ToJson content =
JsonConvert.SerializeObject content
let FromJson<'a> json =
JsonConvert.DeserializeObject<'a> json
let BuildUrl (server:string) (database:string) =
server + "/" + database.ToLower()
let CreateDatabase server database =
ProcessRequest (BuildUrl server database) "PUT" "" ""
let DeleteDatabase server database =
ProcessRequest (BuildUrl server database) "DELETE" "" ""
let CreateDocument server database content =
content |> ToJson
|> ProcessRequest (BuildUrl server database) "POST" "application/json"
let GetDocument<'a> server database documentId =
ProcessRequest ((BuildUrl server database) + "/" + documentId) "GET" "" ""
|> FromJson<'a>
let GetAllDocuments<'a> server database =
let jsonObject = ProcessRequest ((BuildUrl server database) + "/_all_docs") "GET" "" ""
|> JObject.Parse
Async.Parallel [for row in jsonObject.["rows"] ->
async {return FromJson<'a>(row.ToString())}]
|> Async.RunSynchronously
let DeleteDocument server database documentId revision =
ProcessRequest ((BuildUrl server database) + "/" + documentId + "?rev=" + revision) "DELETE" "" ""
Conclusion:F# + CouchDB = totally awesome! You can find the full solution with integration tests at http://github.com/dmohl/FSharpCouch.
No comments:
Post a Comment