mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 14:07:55 +00:00
sql: Test of %-quoting.
sql: Test of cyclic aliases.
This commit is contained in:
parent
9711803e61
commit
c9b2a3f727
|
@ -1,16 +1,3 @@
|
||||||
== SQL ==
|
|
||||||
|
|
||||||
Unittest:
|
|
||||||
dburl = :
|
|
||||||
dburl = null
|
|
||||||
|
|
||||||
Denne med '?' skal vel også virke:
|
|
||||||
sql mysql:///mydb?'SELECT * FROM foo'
|
|
||||||
el.
|
|
||||||
sql 'mysql:///mydb?SELECT * FROM foo'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
== FEX ==
|
== FEX ==
|
||||||
|
|
||||||
fex syntax for splitting fields
|
fex syntax for splitting fields
|
||||||
|
|
49
src/sql
49
src/sql
|
@ -176,7 +176,8 @@ Example of aliases:
|
||||||
:myalias4 mysql://:33333/mydb
|
:myalias4 mysql://:33333/mydb
|
||||||
# Alias for an alias
|
# Alias for an alias
|
||||||
:m :myalias4
|
:m :myalias4
|
||||||
|
# the sortest alias possible
|
||||||
|
: sqlite:////tmp/mydefault.sqlite
|
||||||
|
|
||||||
=head1 EXAMPLES
|
=head1 EXAMPLES
|
||||||
|
|
||||||
|
@ -451,6 +452,7 @@ sub parse_options {
|
||||||
|
|
||||||
if(defined $::opt_help) { die_usage(); }
|
if(defined $::opt_help) { die_usage(); }
|
||||||
if(defined $::opt_version) { version(); exit(0); }
|
if(defined $::opt_version) { version(); exit(0); }
|
||||||
|
$Global::debug = $::opt_debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub database_driver_alias {
|
sub database_driver_alias {
|
||||||
|
@ -703,6 +705,7 @@ sub get_alias {
|
||||||
if ($alias !~ /^:/) {
|
if ($alias !~ /^:/) {
|
||||||
return $alias;
|
return $alias;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Find the alias
|
# Find the alias
|
||||||
my $path;
|
my $path;
|
||||||
if (-l $0) {
|
if (-l $0) {
|
||||||
|
@ -729,7 +732,15 @@ sub get_alias {
|
||||||
push @urlalias, `cat "$alias_file"`;
|
push @urlalias, `cat "$alias_file"`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my ($alias_part,$rest) = $alias=~/(:\w+)(.*)/;
|
my ($alias_part,$rest) = $alias=~/(:\w*)(.*)/;
|
||||||
|
# If we saw this before: we have an alias loop
|
||||||
|
if(grep {$_ eq $alias_part } @Private::seen_aliases) {
|
||||||
|
print STDERR "$alias_part is a cyclic alias\n";
|
||||||
|
exit -1;
|
||||||
|
} else {
|
||||||
|
push @Private::seen_aliases, $alias_part;
|
||||||
|
}
|
||||||
|
|
||||||
my $dburl;
|
my $dburl;
|
||||||
for (@urlalias) {
|
for (@urlalias) {
|
||||||
/^$alias_part\s+(\S+)/ and do { $dburl = $1; last; }
|
/^$alias_part\s+(\S+)/ and do { $dburl = $1; last; }
|
||||||
|
@ -739,6 +750,7 @@ sub get_alias {
|
||||||
return get_alias($dburl.$rest);
|
return get_alias($dburl.$rest);
|
||||||
} else {
|
} else {
|
||||||
Usage("$alias is not defined in @search");
|
Usage("$alias is not defined in @search");
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,7 +780,7 @@ sub parse_dburl {
|
||||||
((?:oracle|ora|mysql|pg|postgres|postgresql)(?:s|ssl|)|
|
((?:oracle|ora|mysql|pg|postgres|postgresql)(?:s|ssl|)|
|
||||||
(?:sqlite|sqlite2|sqlite3)):// # Databasedriver ($1)
|
(?:sqlite|sqlite2|sqlite3)):// # Databasedriver ($1)
|
||||||
(?:
|
(?:
|
||||||
([^:@]*) # Username ($2)
|
([^:@/][^:@]*|) # Username ($2)
|
||||||
(?:
|
(?:
|
||||||
:([^@]*) # Password ($3)
|
:([^@]*) # Password ($3)
|
||||||
)?
|
)?
|
||||||
|
@ -793,7 +805,11 @@ sub parse_dburl {
|
||||||
$options{host} = undef_if_empty($4);
|
$options{host} = undef_if_empty($4);
|
||||||
$options{port} = undef_if_empty($5);
|
$options{port} = undef_if_empty($5);
|
||||||
$options{database} = undef_if_empty($6);
|
$options{database} = undef_if_empty($6);
|
||||||
$options{statement} = undef_if_empty($7);
|
$options{statement} = undef_if_empty(uri_unescape($7));
|
||||||
|
debug("databasedriver ",$options{databasedriver}, " user ", $options{user},
|
||||||
|
" password ", $options{password}, " host ", $options{host},
|
||||||
|
" port ", $options{port}, " database ", $options{database},
|
||||||
|
" statement ",$options{statement}, "\n");
|
||||||
} else {
|
} else {
|
||||||
Usage("$url is not a valid DBURL");
|
Usage("$url is not a valid DBURL");
|
||||||
exit -1;
|
exit -1;
|
||||||
|
@ -801,6 +817,25 @@ sub parse_dburl {
|
||||||
return %options;
|
return %options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub uri_unescape {
|
||||||
|
# Copied from http://cpansearch.perl.org/src/GAAS/URI-1.55/URI/Escape.pm
|
||||||
|
# to avoid depending on URI::Escape
|
||||||
|
# Note from RFC1630: "Sequences which start with a percent sign
|
||||||
|
# but are not followed by two hexadecimal characters are reserved
|
||||||
|
# for future extension"
|
||||||
|
my $str = shift;
|
||||||
|
if (@_ && wantarray) {
|
||||||
|
# not executed for the common case of a single argument
|
||||||
|
my @str = ($str, @_); # need to copy
|
||||||
|
foreach (@str) {
|
||||||
|
s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
|
||||||
|
}
|
||||||
|
return @str;
|
||||||
|
}
|
||||||
|
$str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg if defined $str;
|
||||||
|
$str;
|
||||||
|
}
|
||||||
|
|
||||||
sub undef_if_empty {
|
sub undef_if_empty {
|
||||||
if(defined($_[0]) and $_[0] eq "") {
|
if(defined($_[0]) and $_[0] eq "") {
|
||||||
return undef;
|
return undef;
|
||||||
|
@ -841,6 +876,12 @@ sub usage {
|
||||||
print "See 'man $Global::progname' for the options\n";
|
print "See 'man $Global::progname' for the options\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub debug {
|
||||||
|
# Returns: N/A
|
||||||
|
$Global::debug or return;
|
||||||
|
@_ = grep { defined $_ ? $_ : "" } @_;
|
||||||
|
print @_;
|
||||||
|
}
|
||||||
|
|
||||||
# TODO --list-databases: psql -l eller '\l'. mysql show databases. Oracle ?
|
# TODO --list-databases: psql -l eller '\l'. mysql show databases. Oracle ?
|
||||||
$::opt_skip_first_line = $::opt_shebang = 0;
|
$::opt_skip_first_line = $::opt_shebang = 0;
|
||||||
|
|
|
@ -46,6 +46,7 @@ sql mysql://sqlunittest:CB5A1FFFA5A@localhost:3306/sqlunittest </tmp/unittest.sq
|
||||||
|
|
||||||
echo "### Test .sql/aliases"
|
echo "### Test .sql/aliases"
|
||||||
echo :sqlunittest mysql://sqlunittest:CB5A1FFFA5A@localhost:3306/sqlunittest >> ~/.sql/aliases
|
echo :sqlunittest mysql://sqlunittest:CB5A1FFFA5A@localhost:3306/sqlunittest >> ~/.sql/aliases
|
||||||
|
perl -i -ne '$seen{$_}++ || print' ~/.sql/aliases
|
||||||
sql :sqlunittest "SELECT 'Yes it does' as 'Test if .sql/aliases works';"
|
sql :sqlunittest "SELECT 'Yes it does' as 'Test if .sql/aliases works';"
|
||||||
|
|
||||||
echo "### Test --noheaders --no-headers -n"
|
echo "### Test --noheaders --no-headers -n"
|
||||||
|
|
33
unittest/tests-to-run/sql03.sh
Normal file
33
unittest/tests-to-run/sql03.sh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
sql mysql://root@ "drop user 'sqlunittest'@'localhost'"
|
||||||
|
sql mysql://root@ DROP DATABASE sqlunittest;
|
||||||
|
sql mysql://root@ CREATE DATABASE sqlunittest;
|
||||||
|
sql mysql://root@ "CREATE USER 'sqlunittest'@'localhost' IDENTIFIED BY 'CB5A1FFFA5A';"
|
||||||
|
sql mysql://root@ "GRANT ALL PRIVILEGES ON sqlunittest.* TO 'sqlunittest'@'localhost';"
|
||||||
|
|
||||||
|
echo '### Test reading sql from url command line'
|
||||||
|
sql "mysql:///tange?SELECT 'Yes it works' as 'Test reading SQL from command line';"
|
||||||
|
|
||||||
|
echo '### Test reading sql from url command line %-quoting'
|
||||||
|
sql "mysql:///tange?SELECT 'Yes it%20works' as 'Test%20%-quoting%20SQL from command line';"
|
||||||
|
|
||||||
|
echo "### Test .sql/aliases with url on commandline"
|
||||||
|
echo :sqlunittest mysql://sqlunittest:CB5A1FFFA5A@localhost:3306/sqlunittest >> ~/.sql/aliases
|
||||||
|
perl -i -ne '$seen{$_}++ || print' ~/.sql/aliases
|
||||||
|
sql ":sqlunittest?SELECT 'Yes it%20works' as 'Test if .sql/aliases with %-quoting works';"
|
||||||
|
|
||||||
|
echo "### Test cyclic alias .sql/aliases"
|
||||||
|
echo :cyclic :cyclic2 >> ~/.sql/aliases
|
||||||
|
echo :cyclic2 :cyclic3 >> ~/.sql/aliases
|
||||||
|
echo :cyclic3 :cyclic >> ~/.sql/aliases
|
||||||
|
perl -i -ne '$seen{$_}++ || print' ~/.sql/aliases
|
||||||
|
stdout sql ":cyclic3?SELECT 'NO IT DID NOT' as 'Test if :cyclic is found works';"
|
||||||
|
|
||||||
|
echo "### Test empty dburl"
|
||||||
|
stdout sql ''
|
||||||
|
|
||||||
|
echo "### Test dburl :"
|
||||||
|
stdout sql ':'
|
||||||
|
|
21
unittest/wanted-results/sql03
Normal file
21
unittest/wanted-results/sql03
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
### Test reading sql from url command line
|
||||||
|
Test reading SQL from command line
|
||||||
|
Yes it works
|
||||||
|
### Test reading sql from url command line %-quoting
|
||||||
|
Test %-quoting SQL from command line
|
||||||
|
Yes it works
|
||||||
|
### Test .sql/aliases with url on commandline
|
||||||
|
Test if .sql/aliases with %-quoting works
|
||||||
|
Yes it works
|
||||||
|
### Test cyclic alias .sql/aliases
|
||||||
|
:cyclic3 is a cyclic alias
|
||||||
|
### Test empty dburl
|
||||||
|
Error:
|
||||||
|
is not a valid DBURL
|
||||||
|
|
||||||
|
sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
|
||||||
|
### Test dburl :
|
||||||
|
Error:
|
||||||
|
: is not defined in /home/tange/.sql/aliases /home/tange/.dburl.aliases /etc/sql/aliases /usr/local/bin/dburl.aliases /usr/local/bin/dburl.aliases.dist
|
||||||
|
|
||||||
|
sql [-hnr] [--table-size] [--db-size] [-p pass-through] [-s string] dburl [command]
|
Loading…
Reference in a new issue