my ($self, $executable, $prepend, $append, $sqlcmd, $hide_password_in_env) = @_;
my $driver = $self->driver || 'mysql';
my $dbname = $self->dbname;
if($sqlcmd) {
if($sqlcmd =~ /(DROP\s+DATABASE(?:\s+IF\s+EXISTS)?\s*?)(?:\s+(\w+))?/i) {
$dbname = $2 if $2;
if($driver eq 'sqlite') {
return ['rm', '-f', $dbname];
} else {
if (not $dbname) {
die "'DROP DATABASE' needs a database name\n";
}
if ($driver eq 'mysql') {
$sqlcmd = "$1 \`$dbname\`" unless $2;
} else {
$sqlcmd = "$1 $dbname" unless $2;
}
$dbname = '';
}
} elsif($sqlcmd =~ /(CREATE\s+DATABASE(?:\s+IF\s+NOT\s+EXISTS)?\s*?)(?:\s+(\w+))?/i ) {
$dbname = $2 if $2;
if($driver eq 'sqlite') {
return ['touch', $dbname];
} else {
if (not $dbname) {
die "'CREATE DATABASE' needs a database name\n";
}
my %limits = ( 'mysql' => 64, 'pgsql' => 63 );
if (length($dbname) > $limits{$driver}) {
die "Database name '$dbname' is too long (> $limits{$driver}). Cannot create the database\n";
}
if ($driver eq 'mysql') {
$sqlcmd = "$1 \`$dbname\`" unless $2;
} else {
$sqlcmd = "$1 $dbname" unless $2;
}
$dbname = '';
}
}
}
my @cmd;
my $hidden_password;
if ($self->password) {
if ($hide_password_in_env) {
my $pass_variable = "EHIVE_TMP_PASSWORD_${pass_internal_counter}";
$pass_internal_counter++;
$ENV{$pass_variable} = $self->password;
$hidden_password = '$'.$pass_variable;
} else {
$hidden_password = $self->password;
}
}
if($driver eq 'mysql') {
$executable ||= 'mysql';
push @cmd, ('env', 'MYSQL_PWD='.$hidden_password) if ($self->password);
push @cmd, $executable;
push @cmd, @$prepend if ($prepend && @$prepend);
push @cmd, '--host='.$self->host if $self->host;
push @cmd, '--port='.$self->port if $self->port;
push @cmd, '--user='.$self->username if $self->username;
# push @cmd, '--password='.$hidden_password if $self->password;
push @cmd, ('-e', $sqlcmd) if $sqlcmd;
push @cmd, $dbname if $dbname;
} elsif($driver eq 'pgsql') {
$executable ||= 'psql';
push @cmd, ('env', 'PGPASSWORD='.$hidden_password) if ($self->password);
push @cmd, $executable;
push @cmd, @$prepend if ($prepend && @$prepend);
push @cmd, ('-h', $self->host) if defined($self->host);
push @cmd, ('-p', $self->port) if defined($self->port);
push @cmd, ('-U', $self->username) if defined($self->username);
push @cmd, ('-c', $sqlcmd) if $sqlcmd;
push @cmd, $dbname if $dbname;
} elsif($driver eq 'sqlite') {
$executable ||= 'sqlite3';
die "sqlite requires a database (file) name\n" unless $dbname;
push @cmd, $executable;
push @cmd, @$prepend if ($prepend && @$prepend);
push @cmd, $dbname;
push @cmd, $sqlcmd if $sqlcmd;
}
push @cmd, @$append if ($append && @$append);
return \@cmd;
}