httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From zhiguo zhao <zha...@gmail.com>
Subject Re: [Discuss] mod_lua and database connectivity
Date Fri, 04 Jan 2013 03:11:21 GMT
Maybe you need this: https://github.com/zhaozg/mod_luaex
Example on http://kkhub.com



2013/1/4 Brian McCallister <brianm@skife.org>

> Supporting luasql would be a big bonus, though I understand if goal is to
> provide a "quick and dirty api which is backed by mod_dbd"
>
> http://www.keplerproject.org/luasql/manual.html
>
> -Brian
>
>
> On Thu, Jan 3, 2013 at 4:57 PM, Brian McCallister <brianm@skife.org>wrote:
>
>> On Thu, Jan 3, 2013 at 5:32 AM, Daniel Gruno <rumble@cord.dk> wrote:
>>
>>> -------------------------
>>> Connecting to a database:
>>> -------------------------
>>> function handler(r)
>>>     local db, error = r:dbopen("mod_dbd") -- Open a mod_dbd connection
>>>
>>
>> Shouldn't this be a method on the server representation, not the request
>> representation?
>>
>>
>>>     if error then ... end
>>>     -- or...
>>>     local db, error = r:dbopen("mysql",
>>> "server=localhost,user=root,database=somedb")
>>>     -- essentially the same as mod_dbd's connection string.
>>>     do_stuff()
>>>     db:close() -- close the db handle (can also be done by GC)
>>>
>>
>> Hmm, if db here represents a handle, it should prolly be paired with
>> acquire not open.
>>
>>
>>>     local still_running = db:active() -- returns false, since we closed
>>>                                       -- the connection.
>>> end
>>>
>>> ---------
>>> Querying:
>>> ---------
>>> -- Run a command and get the no. of rows affected:
>>> local affected, err = db:do(r, "DELETE FROM `table` WHERE 1")
>>> if err then
>>>     print("DB error: " .. err)
>>> else
>>>     print("Deleted " .. affected .. " rows!")
>>> end
>>>
>>> -- Run a query and get the rows returned:
>>> local rows, err = db:query(r, "SELECT `name` FROM `table` WHERE 1")
>>>
>>
>> Check your errors :-)
>>
>> Also, be careful what you return, you don't want to the API to force you
>> to realize all results from a query eagerly.
>>
>>
>>> if rows then
>>>     r:puts("We got " .. #rows " .. " results!")
>>>     for k, row in pairs(rows) do
>>>         print("Name: " .. row[1] .. "<br/>")
>>>     end
>>> else
>>>     r:puts("DB error: " .. err)
>>> end
>>>
>>> -- Run a prepared statement and inject values into it:
>>> local rows, err = db:inject(r, "SELECT `name` FROM `tbl` WHERE `id` =
>>> %u", 1234)
>>>
>>
>>
>> Hmm, I would expect an API like
>>
>> local pstmt, err = h:prepare("...")
>> ... = pstmt:execute("hello", 7")
>> -- or ... = pstmt:query("hello", 7")
>>
>> or such style api. "Injecting" into implicit prepared statement is a
>> strange api.
>>
>>
>>> if rows then
>>>     ....
>>> else
>>>     ....
>>> end
>>>
>>>
>>> --------------
>>> Miscellaneous:
>>> --------------
>>>
>>> -- escaping strings for use in db queries:
>>> local escaped = db:escape(r, [[foo"bar'&|baz]])
>>>
>>>
>>> So, any comments, suggestions, remarks, objections and so on is very
>>> much welcomed. If there are no big objections to implementing this
>>> feature, I will consider it as lazy consensus and commit the bindings to
>>> trunk sometime soon along with updated documentation.
>>>
>>> With regards,
>>> Daniel.
>>>
>>> PS: I _have_ checked and double checked the code properly this time, so
>>> it conforms to the style requirements and works with maintainer mode. I
>>> know I usually get something wrong, but this time I think it's as close
>>> to perfect as it can get :) (but then again, I always write something
>>> bad, so apologies in advance if you find a bug)
>>>
>>
>>
>

Mime
View raw message