App-AltSQL
view release on metacpan or search on metacpan
lib/App/AltSQL/Model/MySQL.pm view on Meta::CPAN
if (/^\s*\[(.*?)\]\s*$/) { # we've hit a section
# verify that we're inside a valid section,
# and if so, set $in_valid_section
if ( grep $_ eq $1, @valid_sections ) {
$in_valid_section = 1;
} else {
$in_valid_section = 0;
}
} elsif ($in_valid_section) {
# read a key/value pair
#/^\s*(.+?)\s*=\s*(.+?)\s*$/;
#my ($key, $val) = ($1, $2);
my ($key, $val) = split /\s*=\s*/, $_, 2;
# value cleanup
$key =~ s/^\s*(.+?)\s*$/$1/;
$key || next;
$key =~ s/-/_/g;
$val || ( $val = '' );
$val && $val =~ s/\s*$//;
# special case for no_auto_rehash, which is 'skip-auto-rehash' in my.cnf
if ($key eq 'skip_auto_rehash') {
$key = 'no_auto_rehash';
}
# verify that the field is one of the supported ones
unless ( grep $_ eq $key, @valid_keys ) { next; }
# if this key is expected to be a boolean, fix the value
if ( grep $_ eq $key, @boolean_keys ) {
if ($val eq '0' || $val eq 'false') {
$val = 0;
} else {
# this includes empty values
$val = 1;
}
}
# override anything that was set on the commandline with the stuff read from the config.
unless (defined $self->{$key}) { $self->{$key} = $val };
}
}
close MYCNF;
}
sub db_connect {
my $self = shift;
my $dsn = 'DBI:mysql:' . join (';',
map { "$_=" . $self->$_ }
grep { defined $self->$_ }
qw(database host port)
);
my $dbh = DBI->connect($dsn, $self->user, $self->password, {
PrintError => 0,
mysql_auto_reconnect => 1,
mysql_enable_utf8 => 1,
}) or die $DBI::errstr . "\nDSN used: '$dsn'\n";
$self->dbh($dbh);
## Update autocomplete entries
if ($self->database) {
$self->current_database($self->database);
$self->update_autocomplete_entries($self->database);
}
$self->update_db_types();
}
sub update_autocomplete_entries {
my ($self, $database) = @_;
return if $self->no_auto_rehash;
my $cache_key = 'autocomplete_' . $database;
if (! $self->{_cache}{$cache_key}) {
$self->log_debug("Reading table information for completion of table and column names\nYou can turn off this feature to get a quicker startup with -A\n");
my %autocomplete;
my $rows = $self->dbh->selectall_arrayref("select TABLE_NAME, COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA = ?", {}, $database);
foreach my $row (@$rows) {
$autocomplete{$row->[0]} = 1; # Table
$autocomplete{$row->[1]} = 1; # Column
$autocomplete{$row->[0] . '.' . $row->[1]} = 1; # Table.Column
}
$self->{_cache}{$cache_key} = \%autocomplete;
}
$self->app->term->autocomplete_entries( $self->{_cache}{$cache_key} );
}
sub handle_sql_input {
my ($self, $input, $render_opts) = @_;
# Figure out the verb of the SQL by either using regex or a parser. If we
# use the parser, we get error checking here instead of the server.
my $verb;
if (defined $self->sql_parser && $self->sql_parser) {
# Attempt to parse the input with a SQL parser
my $parsed = $self->sql_parser->parse($input);
if (! defined $parsed->root) {
$self->show_sql_error($input, $parsed->pos, $parsed->line);
return;
}
# Figure out the verb
my $statement = $parsed->root->extract('statement');
if (! $statement) {
$self->log_error("Not sure what to do with this; no 'statement' in the parse tree");
return;
}
$verb = $statement->children->[0];
}
else {
($verb, undef) = split /\s+/, $input, 2;
}
# Run the SQL
( run in 1.181 second using v1.01-cache-2.11-cpan-6b5c3043376 )