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