Page 3 of 5

Re: luasql in mudlet

Posted: Thu Apr 15, 2010 7:19 pm
by ixokai
Basically (I had a longer post explaining details :( but Chrome crashed), db:add takes a variable number of arguments. The first is the sheet to add a record to; each successive is one individual record.

It does not take a "array like table" containing a set of records to add at once. But! Lua to the rescue :) Lua has a built in function 'unpack' which converts a table like array into actual arguments, so:

Code: Select all

db:add(mydb.folks, unpack(persontable))
Should be what you're looking for.

This API is a bit.. fuzzy, and I apologize for that ;-) Lua's single composite data structure and the desire to shield as much true SQL from the masses who weren't interested in learning, led to a lot of .. judgement calls on my part, to try to decide what was Easiest for the Most Common Usage, while still Easy Enough for The Rest. Not all were necessarily perfect :)

Re: luasql in mudlet

Posted: Thu Apr 15, 2010 10:06 pm
by Skylark
Excellent, thanks. You all have been very helpful, and that works perfectly.

Re: luasql in mudlet

Posted: Fri Apr 16, 2010 12:57 am
by tsuujin
Vadi wrote:Lua doesn't allow duplicate table values. Has nothing to do with db at all here. You create a table, then overwrite name Abby with Bob and then with Carlos. So you end up with a table of 1 element.
I caught that last night, then left the window open and went to bed without saving. Heh.

Re: luasql in mudlet

Posted: Fri Apr 16, 2010 1:34 am
by Vadi
No worries :D

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 7:44 am
by kkerwin1
Ok. I used two aliases, as was advised elsewhere.

First, init:

Code: Select all

echo( "Initializing.\n")
db:create("people", {folks={"name"}})
local mydb = db:get_database("people")
local persontable= {{name="Abby"}, {name="Bob"}, {name="Carlos"}}
db:add(mydb.folks, unpack(persontable))
And then, "^find (\w+)$":

Code: Select all

echo("Querying " .. matches[2] .. ".\n")
local mydb = db:get_database("people")
local searching = capitalize(matches[2])
local results= db:fetch(mydb.folks, db:eq(mydb.folks.name, searching))
display(results)
The only output that I got was:
Initializing.
Querying Abby.
No results to speak of.

I am on Linux x86-64bit, Ubuntu.

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 1:54 pm
by tsuujin
Open a debug window (click on triggers, then debug is a ladybug icon on the lefthand side).

Run the aliases with that window open, and check for errors, post those here.

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 9:26 pm
by kkerwin1
Wow. Had never noticed the debug console. That's a huge help. Here's the output from the first command, init (see above for the code):

Code: Select all

Alias name=Init DB(^init$) matched.
Alias: capture group #1 = <init>
LUA: ERROR running script Init DB (Alias2) ERROR:/home/kris/.config/mudlet/db.lua:517: Failed to 
add item: this is probably a violation of a UNIQUE index or other constraint.Alias name=query 
And the second, from "^find (\w+)$"; which was passed "Abby":

Code: Select all

db(^find (\w+)$) matched.
Alias: capture group #1 = <find Abby>
Alias: capture group #2 = <Abby>
LUA: ERROR running script query db (Alias3) ERROR:[string "function Alias3()..."]:4: attempt to 
call global 'capitalize' (a nil value)

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 9:33 pm
by tsuujin
well, on the second part, you're trying to call a function (capitalize) that doesn't exist. Did you pull it from someone elses system?

As for the data insertion: it's returning some error on trying to add the record. I don't use the db wrapper myself, so I can't tell for certain what the error is there because it looks ok. My question would be: is the unpack method supported? Are you certain that's how they want you to add records?

Try
[syntax=lua]
echo( "Initializing.\n")
db:create("people", {folks={"name"}})
local mydb = db:get_database("people")
db:add(mydb.folks, {name="Abby"}, {name="Bob"}, {name="Carlos"})
[/syntax]

Also, is "get_database" the correct term? The mudlet manual shows "fetch_database"

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 9:55 pm
by kkerwin1
Ok. Output is now:

Code: Select all

Alias name=Init DB(^init$) matched.
Alias: capture group #1 = <init>
LUA: ERROR running script Init DB (Alias2) ERROR:/home/kris/.config/mudlet/db.lua:517: Failed to 
add item: this is probably a violation of a UNIQUE index or other constraint.Alias name=query 
db(^find (\w+)$) matched.
Alias: capture group #1 = <find Abby>
Alias: capture group #2 = <Abby>
LUA: ERROR running script query db (Alias3) ERROR:[string "function Alias3()..."]:3: attempt to 
call method 'fetch_database' (a nil value)
Using the following code for init:

[syntax="lua"]
echo( "Initializing.\n")
db:create("people", {folks={"name"}})
local mydb = db:get_database("people")
db:add(mydb.folks, {name="Abby"}, {name="Bob"}, {name="Carlos"})
[/syntax]

And find (\w+):

[syntax="lua"]
echo("Querying " .. matches[2] .. ".\n")
local mydb = db:fetch_database("people")
--local searching = capitalize(matches[2])
local results= db:fetch(mydb.folks, db:eq(mydb.folks.name, matches[2]))
display(results)
[/syntax]

Re: luasql in mudlet

Posted: Tue Apr 20, 2010 10:02 pm
by tsuujin
yeah, fetch_database is wrong, and should be corrected in the manual. Go back to get_database