httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian McCallister <bri...@skife.org>
Subject Re: [Discuss] mod_lua and database connectivity
Date Thu, 03 Jan 2013 23:57:20 GMT
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