#!/usr/bin/perl # Lite SQLite Database Shell # This script is licensed under the FDL (Free Documentataion License) # The complete license text can be found at http://www.gnu.org/copyleft/fdl.html # # A really quick and dirty sqlite shell using SAL use strict; use CGI; use SAL::DBI; # Set up the CGI object, get any parameters, and initialize some vars my $q = new CGI; my $db = $q->param('db') || ':memory:'; # Set up the database my $dbo_factory = new SAL::DBI; my $dbo_data = $dbo_factory->spawn_sqlite($db); print "\nLSQL - Lite SQLite Shell\n\nThis program is licensed under the Free Documentation License v1.2\n(http://www.gnu.org/copyleft/fdl.html)\n\n"; my $query; my @params = (); while (1) { print "[lsql] > "; my $line = ; chomp($line); $line =~ s/^\s+//; $line =~ s/\s+$//; if ($line !~ /^quit$/i) { if ($line =~ /^go$/i) { print "\nExecuting: $query\n"; my $num_rows = 0; my $num_cols = 0; my $query_type; $query_type = dbGetQueryType($query); if ($query_type =~ /^select$/i) { ($num_rows, $num_cols) = dbEXECUTE($query); displayTable($num_rows, $num_cols); } elsif ($query_type =~ /^insert$/i) { $num_rows = dbDO($query); } elsif ($query_type =~ /^update$/i) { $num_rows = dbDO($query); } elsif ($query_type =~ /^create table$/i) { $num_rows = dbDO($query); } elsif ($query_type =~ /^pragma$/i) { ($num_rows, $num_cols) = dbEXECUTE($query); displayTable($num_rows, $num_cols); } elsif ($query_type =~ /^cmdversion$/i) { my $eng_ver = $dbo_data->{connection}{dbh}->sqlite_version(); print "SQLite Engine Version: $eng_ver\n"; } elsif ($query_type =~ /^cmdhelp$/i) { print "Help\n"; print "----\n"; } else { print "Syntax Error.\n\n"; } print "($num_rows rows affected)\n\n"; $query = ''; } else { $query .= $line . ' '; } } else { last; } } print "\n"; sub dbGetQueryType { my $query = shift; $query =~ s/^\s+//; $query =~ s/\s+$//; if ($query =~ /^select /i) { return 'SELECT'; } elsif ($query =~ /^insert /) { return 'INSERT'; } elsif ($query =~ /^update /) { return 'UPDATE'; } elsif ($query =~ /^create table /) { return 'CREATE TABLE'; } elsif ($query =~ /^pragma /) { return 'PRAGMA'; } elsif ($query =~ /^version/) { return 'CMDVersion'; } elsif ($query =~ /^help/) { return 'CMDHelp'; } else { return 'UNKNOWN'; } } sub dbEXECUTE { my $query = shift; my ($w, $h) = $dbo_data->execute($query); return ($h, $w); } sub dbDO { my $query = shift; my ($h) = $dbo_data->do($query); return $h; } sub displayTable { my $rows = shift; my $cols = shift; for (my $r=0; $r < $rows; $r++) { print "\n"; my $record; for (my $c=0; $c <= $cols; $c++) { my $v = $dbo_data->{data}->[$r][$c]; $record .= "$v, "; } $record =~ s/,\s+$//; print $record; } print "\n\n"; }