[PD-dev] SQLite for PD v0.0
Hans-Christoph Steiner
hans at eds.org
Sat Dec 1 06:39:12 CET 2007
On Nov 30, 2007, at 5:04 PM, Mike McGonagle wrote:
>
>
> On Nov 30, 2007 2:13 PM, Hans-Christoph Steiner <hans at eds.org> wrote:
>
> Works for me after I compiled it as a universal binary. I attached
> the makefile to compile it as universal. I have one question about
> the interface, the [sqlite -open( style messages seem strange.
> Since you are sending them directly to the [sqlite] object, the
> "sqlite" part seems redundant, and the preceding "-" isn't very Pd-
> like. How about:
>
> [open $1(
> [close(
> [tagged 1(
> [tagged 0(
>
> Hans, Thanks for taking the time to look at this.
>
> I guess something needs to be explained here as the whole SQL
> parsing thing is to get around how PD treats comma's. The external
> tries to parse the SQL as closely as possible to what REAL SQL
> would be (mind you, this is not real parsing, so much as reading
> the SQL as characters, and then reassembling the characters in the
> buffer). As PD uses comma's to separate messages that get sent to
> the same object, we are taking advantage of that by assuming that a
> message like
>
> "sql select mine, this, that from mytable submitsql"
>
> would get reassembled from the following PD messages.
>
> "sql select mine"
> "this"
> "that from mytable submitsql"
>
> Because of this, it is necessary to delimit an SQL statement, with
> both the beginning and the ending of the statement.
>
> So, because of this, we also need a way to send control messages to
> the external itself. Hence the reason for the 'sqlite' messages.
>
> As Jamie has pointed out, the biggest benefit to using the messages
> in this way is that we get to use the '$1' replacement mechinism
> already in PD to put the data into the SQL statements.
>
> And as far as the '-' goes, it is immaterial and can go away... I
> just thought it made it easier to read, especially when you can
> send multiple control commands within a single message...
>
> [sqlite -buffer 1000 -results 100 -tagged 0(
>
> This would set up the size of the SQL buffer, the size of the
> expected result set buffer, and then turn off the tagging. I only
> put the hyphens there to make this readable.
> I don't quite see the need for the "endsql" and "submitsql" tags at
> the end of a message. Is there ever a time that you would write
> stuff after "endsql" that has a specific meaning? Otherwise, it
> seems like there should just be the selector "sql" at the front of
> the message.
>
> We need to know where the REAL end to the message is because of the
> comma issue. And, no, putting something at the end of the message
> would not work, as the "parser" looks at the last token in the
> message for a delimiter.
>
> Basically, the difference between the two tags is that one will
> terminate the SQL statement, and then return (that is 'endsql').
> The other one would terminate the statement, and then submit the
> SQL to the database. Each line then is processed. IF, for instance,
> you chained a bunch of 'select' statements, all the results from
> each statement would be returned as one large result set. This also
> allows for the ability to send a buffer of 'insert' statements as
> one large group. Such as...
>
> [sql begin endsql(
> [sqla insert into mytable (name, id, data) values ('$1', $2, $3)
> endsql(
> [sqla commit submitsql(
If you use a selector for every message into this object, then you
can get rid of the "sqlite" prefix, and it would be very natural for
people used to Pd. For example:
[open $1(
[close(
[export $1( - this could be used to export the database to a .sql file
This would build a message chunk-by-chunk:
[clear (
[add insert into mytable (name) values ('$1') (
[add insert into mytable (id) values ($2) (
[add insert into mytable (data) values ($3) (
[submit (
And this would be a one liner:
[submit insert into mine (name) values ('the_text') (
>
> The first message would start a transaction, the second would be
> iterated over some loop, replacing the $1, $2, and $3 with whatever
> data is to be stored, and the last message would submit the SQL to
> the database, and commit the data.
>
> Also, this character buffer will grow as needed, and as far as I
> know, it is not restricted to the size of MAXPDSTRING.
>
> My first thought on this feature was in storing data into a
> database (in the case where you are connecting over a network, not
> with SQLite), and you wanted to send an entire buffer at once,
> instead of as a serise of buffers.
>
>
> Also, I am assuming that "sqla" means something like "append". How
> about emulating the [textfile] syntax so it feels more Pd-ish.
> Something like:
>
> [add insert into mine (name) values ('jacob') (
> [add insert into mine (name) values ('fred') (
> [submit(
>
> This is doable, as a matter of fact, it is set up in such a way
> that the user can change these tags to be whatever they want. Not
> very portable, but hey...
>
> I still think there would need to be a trailing tag to delimit the
> SQL, due to the comma issue.
Instead of commas, you could reuse the same message used for message
boxes [addcomma(. Plus [tkwidgets/text] (its in Pd-extended now)
will allow you to type commas and have them sent in messages, but
they'll be escaped. Here's an example combined the syntax of
[textfile] and message boxes:
[clear (
[add insert into mytable (name (
[addcomma (
[add id (
[addcomma (
[add data) values ('$1' (
[addcomma (
[add $2 (
[addcomma (
[add $3) (
[submit (
It's not pretty, but it follows Pd-style messages and it would work.
>
> and
>
> [submit insert into mine (name) values ('the_text') (
>
> Looks good overall, keep up the good work! I think this will be
> quite useful, and should be easy to build on all platforms and
> include in Pd-extended.
>
> Thanks, Hans. I do have one question about the SQLite code. While
> the intent of using SQLite in the first place was to make it as
> painless as possible to work with SQL from PD. I had started with
> the idea of using 'libdbi', and they say that you need Fink on the
> Mac to install it. I went through the whole install, only to get to
> the last stage for the drivers, and it tells me that one of the
> programs it expected from Fink was NOT there.
>
> I do see it to be very possible that this could be a prototype for
> working with SQL, and the same message processing things could work
> with other databases.
>
> Another issue that I need to find out about is how to include the
> SQLite code. As that is under PUBLIC DOMAIN and holds no copyright,
> we can freely include the latest version with the external. OR,
> would it be better to include it as a library. They do claim that
> running it compiled directly into your code, it runs faster. They
> claim it is about %5 faster.
>
> At the same time, compiling as a library is an extra step require
> to use this.
I think it should just be compiled into the external. It'll make it
really easy to use and distribute. I think this will be an very
useful object. Since it's all straight C, it should be easy to
incorporate into Pd-extended. Then we'll have a cross-platform
database object included in the distro. (For whatever reason, no one
has ever gotten around to adding flext and therefore [pool] to Pd-
extended...)
.hc
>
>
> Mike
>
>
> --
> Peace may sound simple—one beautiful word— but it requires
> everything we have, every quality, every strength, every dream,
> every high ideal.
> —Yehudi Menuhin (1916–1999), musician
------------------------------------------------------------------------
----
Man has survived hitherto because he was too ignorant to know how to
realize his wishes. Now that he can realize them, he must either
change them, or perish. -William Carlos Williams
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20071201/e070ce17/attachment.htm>
More information about the Pd-dev
mailing list