[Thousand-oaks-pm] P6 Hackathon - Word from the Parrot SQLite3 Trenches...
Andrew Grangaard
agrangaard at rubiconproject.com
Tue Jul 21 15:28:26 PDT 2009
Kickass!
inspiring, dude, inspiring.
--andrew
Todd Presta wrote:
> We have lift off!
>
> I grafted the birdseed library into SQLite3.pir, played musical chairs
> with the DBDI package, and connected to SQLite3 through Rakudo Perl 6.
> Did run into some HLLCompiler errors when using thing .next() iterator,
> though. That's why there is only a single $rs.next() call.
> "while($rs.next())" triggered some statement parsing errors. Got
> research that...
>
> Seems like DBDI eq JDBC though. :)
>
> Here's some transcript:
>
> C:\rakudo\20090721\rakudo\parrot\ext\SQLite3>sqlite3 test.db
> SQLite version 3.5.4
> Enter ".help" for instructions
> sqlite> .sc
> CREATE TABLE foo(bar,baz);
> sqlite> select * from foo;
> 1|123
> 2|Thingy
> sqlite> .q
>
> C:\rakudo\20090721\rakudo\parrot\ext\SQLite3>type mytest.p6
> use DBDI;
>
> say 'Grabbing connection...';
> my $conn = DBDI::DriverManager.getConnection("dbdi:SQLite3:test.db",
> "", "");
>
> say 'Creating a statement...';
> my $stm = $conn.createStatement();
>
> say 'Getting a resultset...';
> my $rs = $stm.executeQuery("select baz, bar from foo");
>
> say 'Fast forward one...';
> $rs.next();
>
> say 'Get a value...';
> my $data = $rs.getCol('baz');
>
> print 'And the value is...';
> say $data;
>
> say 'w00t!';
>
> C:\rakudo\20090721\rakudo\parrot\ext\SQLite3>perl6 mytest.p6
> Grabbing connection...
> get_db_handle: got here
> Creating a statement...
> Getting a resultset...
> get_statement_handle: got here
> Fast forward one...
> Get a value...
> And the value is...123
> w00t!
>
>
>
> T
>
> -- Todd Presta
> -- http://www.asciiville.com
>
> --- On *Tue, 7/21/09, Todd Presta /<toddpresta at sbcglobal.net>/* wrote:
>
>
> From: Todd Presta <toddpresta at sbcglobal.net>
> Subject: [Thousand-oaks-pm] P6 Hackathon - Word from the Parrot
> SQLite3 Trenches...
> To: "perlmongers" <thousand-oaks-pm at mail.pm.org>
> Date: Tuesday, July 21, 2009, 11:16 AM
>
> Ok. I might be able to sleep tonight.
>
> Even with Parrot 1.4 out, still getting build errors when trying to
> use ncigen for the SQLite3 extension.
>
> On another front, the NCI functionality within Parrot seems to choke
> whenever requesting SQLite database connection handle and prepared
> statement handle no matter what type of PMC is passed as a parameter
> during the SQLite dynamic library function calls from within Parrot
> PIR. Using either Pointer, CPointer, UnManagedStruct, ManagedStruct,
> or ResizablePMCArray either segfaults or returns an erroneous value.
>
> I decided to go deep and write some C code, basically wrapping both
> the sqlite3_open and sqlite3_prepare functions in the SQLite3
> dynamic library and returning the pointers as the function return
> values rather than as a reference parameters.
>
> This following PIR snippet calls my dynamic library (birdseed), the
> SQLite3 dynamic library, and obtains the last column value of a row
> returned from a prepared statement.
>
> .sub main :main
> .local pmc sqllib, bslib
> .local pmc fn_dbh, dbh, fn_sth, sth, fn_close, fn_step, fn_final,
> fn_col_t
> bslib = loadlib "birdseed"
> sqllib = loadlib "sqlite3"
>
> $S0 = "select * from dummy"
>
> fn_dbh = dlfunc bslib, "get_db_handle", "pt"
> fn_sth = dlfunc bslib, "get_statement_handle", "ppt"
> fn_step = dlfunc sqllib, "sqlite3_step", "ip"
> fn_final = dlfunc sqllib, "sqlite3_finalize", "ip"
> fn_col_t = dlfunc sqllib, "sqlite3_column_text", "tpi"
> fn_close = dlfunc sqllib, "sqlite3_close", "ip"
>
> dbh = fn_dbh("dummy.db")
> sth = fn_sth(dbh, "select * from dummy")
>
> $I1 = fn_step(sth)
> say $I1
>
> $S0 = fn_col_t(sth, 1)
> say $S0
>
> $I2 = fn_final(sth)
> say $I2
> $I3 = fn_close(dbh)
> say $I3
>
> .end
>
> Here is the resulting output from Parrot
>
> C:\t\dv\parrot\PARROT~1\birdseed>parrot birdseed.pir
> get_db_handle: got here
> get_statement_handle: got here
> 100
> This is tag 1
> 0
> 0
>
> Basically, the line that reads "This is tag 1" is the second column
> of the first row returned from the table "dummy." The lines
> beginning with "get_" are being printf'd from my library. 100 is
> SQLITE_ROW (that is a row ready for plucking), and the 0's are
> SQLITE_OK.
>
> So the trick now is to determine if the SQLite3.pir under <parrot
> src tree>/etc/SQLite3 can be retrofitted with the "potential"
> birdseed dynamic library and then be recognized by <parrot src
> tree>/etc/SQLite3/DBDI/Driver/SQLite3.pm.
>
> More on this later ...
>
> "Er uh, we're still doing the project, right?" :)
>
>
>
> T
>
>
>
> -- Todd Presta
> -- http://www.asciiville.com
>
>
> -----Inline Attachment Follows-----
>
> _______________________________________________
> Thousand-oaks-pm mailing list
> Thousand-oaks-pm at pm.org </mc/compose?to=Thousand-oaks-pm at pm.org>
> http://mail.pm.org/mailman/listinfo/thousand-oaks-pm
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Thousand-oaks-pm mailing list
> Thousand-oaks-pm at pm.org
> http://mail.pm.org/mailman/listinfo/thousand-oaks-pm
More information about the Thousand-oaks-pm
mailing list