App-Repository
view release on metacpan or search on metacpan
lib/App/Repository/DBI.pm view on Meta::CPAN
$sth->finish if ($endrow > 0 && $rownum > $endrow);
}
else {
# return $sth->_fetchall_arrayref;
$rownum = 0;
while ($row = $sth->fetch) {
$rownum++;
last if ($endrow > 0 && $rownum > $endrow);
push @rows, [ @$row ] if ($rownum >= $startrow);
}
$sth->finish if ($endrow > 0 && $rownum > $endrow);
}
}
elsif ($mode eq 'HASH') {
if (keys %$slice) {
my @o_keys = keys %$slice;
my @i_keys = map { lc } keys %$slice;
$rownum = 0;
while ($row = $sth->fetchrow_hashref('NAME_lc')) {
my %hash;
@hash{@o_keys} = @{$row}{@i_keys};
$rownum++;
last if ($endrow > 0 && $rownum > $endrow);
push @rows, \%hash if ($rownum >= $startrow);
}
$sth->finish if ($endrow > 0 && $rownum > $endrow);
}
else {
# XXX assumes new ref each fetchhash
while ($row = $sth->fetchrow_hashref()) {
$rownum++;
last if ($endrow > 0 && $rownum > $endrow);
push @rows, $row if ($rownum >= $startrow);
}
$sth->finish if ($endrow > 0 && $rownum > $endrow);
}
}
else { Carp::croak("fetchall_arrayref($mode) invalid") }
&App::sub_exit(\@rows) if ($App::trace);
return \@rows;
}
######################################################################
# SQL CREATE METHODS (new methods not defined in App::Repository)
######################################################################
sub _mk_where_clause {
&App::sub_entry if ($App::trace);
my ($self, $table, $params, $options) = @_;
my ($where, $column, $param, $value, $colnum, $repop, $sqlop, $column_def, $quoted);
my ($tabledef, $tabcols, $alias, $dbexpr);
my $dbh = $self->{dbh};
$tabledef = $self->{table}{$table};
$alias = $tabledef->{alias};
$tabcols = $tabledef->{column};
my %sqlop = (
"contains" => "like",
"matches" => "like",
"not_contains" => "not like",
"not_matches" => "not like",
"eq" => "=",
"ne" => "!=",
"le" => "<=",
"lt" => "<",
"ge" => ">=",
"gt" => ">",
"in" => "in",
"not_in" => "not in",
);
my %repop = (
"=~" => "contains",
"~" => "contains",
"!~" => "not_contains",
"==" => "eq",
"=" => "eq",
"!" => "ne",
"!=" => "ne",
"<=" => "le",
"<" => "lt",
">=" => "ge",
">" => "gt",
"=/" => "regexp",
"/" => "regexp",
"!/" => "not_regexp",
);
$where = "";
$params = {} if (!$params);
my $param_order = $params->{"_order"};
if (!defined $param_order && ref($params) eq "HASH") {
$param_order = [ (keys %$params) ];
}
if (defined $param_order && $#$param_order > -1) {
my ($include_null, $inferred_op, @where);
for ($colnum = 0; $colnum <= $#$param_order; $colnum++) {
$param = $param_order->[$colnum];
$column = $param;
$sqlop = "=";
$repop = "";
$inferred_op = 1;
# check if $column contains an embedded operation, i.e. "name.eq", "name.contains"
if ($param =~ /^(.*)\.([^.]+)$/) {
$repop = $2;
$inferred_op = 0;
if ($sqlop{$repop}) {
$column = $1;
$sqlop = $sqlop{$repop};
}
}
$value = $params->{$param};
if (!$repop && $value && $value =~ s/^(=~|~|!~|==|=|!=|!|<=|<|>=|>)//) {
$repop = $repop{$1};
$sqlop = $sqlop{$repop};
$inferred_op = 0 if ($1 eq "==");
}
if (!$repop && $value && $value =~ /[\*\?]/) {
$repop = "matches";
$sqlop = $sqlop{$repop};
}
if ($repop eq "verbatim") {
push(@where, "$params->{$param}");
next;
}
$column_def = $tabcols->{$column};
if (!defined $column_def) {
if ($param =~ /^begin_(.*)/) {
$column = $1;
$sqlop = ">=";
$inferred_op = 0;
}
elsif ($param =~ /^end_(.*)/) {
$column = $1;
$sqlop = "<=";
$inferred_op = 0;
}
$column_def = $tabcols->{$column};
}
next if (!defined $column_def); # skip if the column is unknown
if (! defined $value) {
# $value = "?"; # TODO: make this work with the "contains/matches" operators
if (!$sqlop || $sqlop eq "=") {
push(@where, "$column is null");
}
elsif ($sqlop eq "!=") {
push(@where, "$column is not null");
}
}
else {
next if ($inferred_op && $value eq "ALL");
if (ref($value) eq "ARRAY") {
$value = join(",", @$value);
}
if ($value =~ s/^@\[(.*)\]$/$1/) { # new @[] expressions replace !expr!
$quoted = 0;
}
elsif ($value =~ s/^@\{(.*)\}$/$1/) { # replaced !expr!, but @{x} is interp'd by perl so deprecate!
$quoted = 0;
}
elsif ($value =~ s/^!expr!//) { # deprecated (ugh!)
$quoted = 0;
}
elsif ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
$quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($value !~ /^-?[0-9.,]+$/);
}
else {
$quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($value !~ /^-?[0-9.]+$/);
}
next if ($inferred_op && !$quoted && $value eq "");
$include_null = 0;
if ($repop eq "contains" || $repop eq "not_contains") {
$value = $dbh->quote("%" . $value . "%");
}
elsif ($repop eq "matches" || $repop eq "not_matches") {
$value = $dbh->quote($value);
$value =~ s/_/\\_/g;
$value =~ s/\*/%/g;
$value =~ s/\?/_/g;
}
elsif ($sqlop eq "in" || ($inferred_op && $sqlop eq "=")) {
if (! defined $value || $value eq "NULL") {
$sqlop = "is";
$value = "null";
}
else {
if ($value =~ s/NULL,//g || $value =~ s/,NULL//) {
$include_null = 1;
}
if ($quoted) {
$value = $dbh->quote($value);
if ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
$value =~ s/,/','/g;
$value = "($value)";
$sqlop = "in";
}
else {
$sqlop = "=";
}
}
else {
if ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
$value = "($value)";
$sqlop = "in";
}
else {
$sqlop = "=";
}
}
}
}
elsif ($sqlop eq "not in" || ($inferred_op && $sqlop eq "!=")) {
if (! defined $value || $value eq "NULL") {
$sqlop = "is not";
$value = "null";
}
else {
if ($value =~ s/NULL,//g || $value =~ s/,NULL//) {
$include_null = 1;
}
if ($quoted) {
$value = $dbh->quote($value);
if ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
$value =~ s/,/','/g;
$value = "($value)";
$sqlop = "not in";
}
else {
$sqlop = "!=";
}
}
else {
if ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
$value = "($value)";
$sqlop = "not in";
lib/App/Repository/DBI.pm view on Meta::CPAN
# create order-by columns
############################################################
my (@order_by_dbexpr, $order_by_dbexpr);
if (defined $order_by && ref($order_by) eq "ARRAY") {
my ($dir);
for ($idx = 0; $idx <= $#$order_by; $idx++) {
$column = $order_by->[$idx];
$dir = "";
if ($column =~ /^(.+)\.asc$/) {
$column = $1;
$dir = " asc";
}
elsif ($column =~ /^(.+)\.desc$/) {
$column = $1;
$dir = " desc";
}
$column_def = $table_def->{column}{$column};
next if (!defined $column_def);
$order_by_dbexpr = $dbexpr{$column};
if (!$order_by_dbexpr) {
$order_by_dbexpr = $column_def->{dbexpr};
$dbexpr{$column} = $order_by_dbexpr;
$self->_require_tables($order_by_dbexpr, \%reqd_tables, $tablealiashref, 1);
}
$columnalias = $column_def->{alias};
if (defined $columnidx{$column} && $columnalias) {
$order_by_dbexpr = $columnalias;
}
if ($order_by_dbexpr) {
if ($dir) {
$order_by_dbexpr .= $dir;
}
else {
if ($direction && ref($direction) eq "HASH" && defined $direction->{$column}) {
if ($direction->{$column} =~ /^[au]/i) {
$order_by_dbexpr .= " asc";
}
elsif ($direction->{$column} =~ /^d/i) {
$order_by_dbexpr .= " desc";
}
}
}
push(@order_by_dbexpr, $order_by_dbexpr);
}
}
}
############################################################
# create initial where conditions for the selected rows
############################################################
#print $App::DEBUG_FILE $self->{context}->dump(), "\n";
my %sqlop = (
"contains" => "like",
"matches" => "like",
"not_contains" => "not like",
"not_matches" => "not like",
"eq" => "=",
"ne" => "!=",
"le" => "<=",
"lt" => "<",
"ge" => ">=",
"gt" => ">",
"in" => "in",
"not_in" => "not in",
);
my %repop = (
"=~" => "contains",
"~" => "contains",
"!~" => "not_contains",
"==" => "eq",
"=" => "eq",
"!" => "ne",
"!=" => "ne",
"<=" => "le",
"<" => "lt",
">=" => "ge",
">" => "gt",
);
my ($include_null, $inferred_op);
for ($idx = 0; $idx <= $#$param_order; $idx++) {
$param = $param_order->[$idx];
next if (!defined $param || $param eq "");
$column = $param;
#if ($param eq "_key") {
# # o TODO: enable multi-field primary keys (this assumes one-field only)
# # o TODO: enable non-integer primary key fields (this assumes integer, no quotes)
# $column = $table_def->{primary_key}; # assumes one column primary key
# $dbexpr = $table_def->{column}{$column}{dbexpr};
# if ($value =~ /,/) {
# $where_condition = "$dbexpr in ($value)"; # assumes one column, non-quoted primary key
# }
# else {
# $where_condition = "$dbexpr = $value"; # assumes one column, non-quoted primary key
# }
# push(@criteria_conditions, $where_condition);
# next;
#}
$sqlop = "=";
$repop = "";
$inferred_op = 1;
$value = $params->{$param};
# check if $param contains an embedded operation, i.e. "name.eq", "name.contains"
if ($param =~ /^(.*)\.([^.]+)$/) {
$repop = $2;
$inferred_op = 0;
if ($sqlop{$repop}) {
$column = $1;
$sqlop = $sqlop{$repop};
}
}
if (!$repop && $value && $value =~ s/^(=~|~|!~|==|=|!=|!|<=|<|>=|>)//) {
$repop = $repop{$1};
$sqlop = $sqlop{$repop};
$inferred_op = 0 if ($1 eq "==");
}
if (!$repop && $value && $value =~ /[\*\?]/) {
$repop = "matches";
$sqlop = $sqlop{$repop};
}
if ($repop eq "verbatim") {
push(@criteria_conditions, $params->{$param});
next;
}
lib/App/Repository/DBI.pm view on Meta::CPAN
$column_def = $table_def->{column}{$column};
if (!defined $column_def) {
if ($param =~ /^begin_(.*)/) {
$column = $1;
$sqlop = ">=";
$inferred_op = 0;
}
elsif ($param =~ /^end_(.*)/) {
$column = $1;
$sqlop = "<=";
$inferred_op = 0;
}
$column_def = $table_def->{column}{$column};
}
if (defined $column_def) { # skip if the column is unknown
$include_null = 0;
if (! defined $value) {
# $value = "?"; # TODO: make this work with the "contains/matches" operators
if (!$sqlop || $sqlop eq "=") {
$sqlop = "is";
}
elsif ($sqlop eq "!=") {
$sqlop = "is not";
}
else {
next;
}
$value = "null";
}
else {
next if (defined $table_def->{param}{$param}{all_value} &&
$value eq $table_def->{param}{$param}{all_value});
next if ($inferred_op && $value eq "ALL");
if (ref($value) eq "ARRAY") {
$value = join(",", @$value);
}
if ($value =~ s/^@\[(.*)\]$/$1/) { # new @[] expressions replace !expr!
$quoted = 0;
}
elsif ($value =~ s/^@\{(.*)\}$/$1/) { # new @{} don't work.. perl interpolates... deprecate.
$quoted = 0;
}
elsif ($value =~ s/^!expr!//) { # deprecated (ugh!)
$quoted = 0;
}
elsif ($value =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
$quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($value !~ /^-?[0-9.,]+$/);
}
else {
$quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($value !~ /^-?[0-9.]+$/);
}
next if ($inferred_op && !$quoted && $value eq "");
if ($repop eq "contains" || $repop eq "not_contains") {
$value = $dbh->quote("%" . $value . "%");
}
elsif ($repop eq "matches" || $repop eq "not_matches") {
$value = $dbh->quote($value);
$value =~ s/_/\\_/g;
$value =~ s/\*/%/g;
$value =~ s/\?/_/g;
}
elsif ($sqlop eq "in" || ($inferred_op && $sqlop eq "=")) {
if (! defined $value || $value eq "NULL") {
$sqlop = "is";
$value = "null";
}
else {
if ($value =~ s/NULL,//g || $value =~ s/,NULL//) {
$include_null = 1;
}
if ($quoted) {
$value = $dbh->quote($value);
if ($value =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
$value =~ s/,/','/g;
$value = "($value)";
$sqlop = "in";
}
else {
$sqlop = "=";
}
}
else {
if ($value =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
$value = "($value)";
$sqlop = "in";
}
else {
$sqlop = "=";
}
}
}
}
elsif ($sqlop eq "not in" || ($inferred_op && $sqlop eq "!=")) {
if (! defined $value || $value eq "NULL") {
$sqlop = "is not";
$value = "null";
}
else {
if ($value =~ s/NULL,//g || $value =~ s/,NULL//) {
$include_null = 1;
}
if ($quoted) {
$value = $dbh->quote($value);
if ($value =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
$value =~ s/,/','/g;
$value = "($value)";
$sqlop = "not in";
}
else {
$sqlop = "!=";
}
}
else {
if ($value =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
( run in 0.579 second using v1.01-cache-2.11-cpan-39bf76dae61 )