DB-Object
view release on metacpan or search on metacpan
lib/DB/Object/Mysql/Query.pm view on Meta::CPAN
{
## It is useless to insert a blank data in a field whose default value is NULL.
## Especially since a test on a NULL field may be made specifically.
push( @avoid, $field ) if( !exists( $arg{ $field } ) && $null->{ $field } );
}
$self->getdefault({
table => $table,
arg => \@arg,
avoid => \@avoid
});
my( $fields, $values ) = $self->format_statement;
## $self->{ 'binded_values' } = $db_data->{ 'binded_values' };
my $query = $self->{query} = $select ? "REPLACE INTO $table $select" : "REPLACE INTO $table ($fields) VALUES($values)";
## Everything meaningfull lies within the object
## If no bind should be done _save_bind does nothing
$self->_save_bind();
## Query string should lie within the object
## _cache_this sends back an object no matter what or unde() if an error occurs
my $sth = $tbl_o->_cache_this( $self );
## STOP! No need to go further
if( !defined( $sth ) )
{
return( $self->error( "Error while preparing query to replace data into table '$table':\n$query", $self->errstr() ) );
}
if( !defined( wantarray() ) )
{
$sth->execute() ||
return( $self->error( "Error while executing query to replace data to table '$table':\n$query" ) );
}
return( $sth );
}
sub reset
{
my $self = shift( @_ );
if( !$self->{query_reset} )
{
my $keys = [qw( alias binded binded_values binded_where binded_limit binded_group binded_having binded_order from_unixtime group_by limit local _on_conflict on_conflict order_by reverse sorted unix_timestamp where )];
CORE::delete( @$self{ @$keys } );
$self->{query_reset}++;
$self->{enhance} = 1;
}
return( $self );
}
sub reset_bind
{
my $self = shift( @_ );
my @f = qw( binded binded_where binded_group binded_having binded_order binded_limit );
foreach my $field ( @f )
{
$self->{ $field } = [];
}
return( $self );
}
# Not supported in MySQL
# sub returning
# Inherited from DB::Object::Query
# sub update
sub _query_components
{
my $self = shift( @_ );
my $type = ( @_ > 0 && lc( shift( @_ ) ) ) || $self->_query_type() || return( $self->error( "You must specify a query type: select, insert, update or delete" ) );
my $opts = $self->_get_args_as_hash( @_ );
# ok options:
# no_bind_copy: because join for example does it already and this would duplicate the binded types, so we use this option to tell this method to set an exception. Kind of a hack that needs clean-up in the future from a design point of view.
$opts->{no_bind_copy} //= 0;
my( $where, $group, $having, $sort, $order, $limit, $on_conflict );
$where = $self->where();
if( $type eq 'select' )
{
$group = $self->group;
$having = $self->having;
$sort = $self->reverse ? 'DESC' : $self->sort ? 'ASC' : '';
$order = $self->order;
}
$limit = $self->limit;
$on_conflict = $self->on_conflict;
my @query = ();
push( @query, "WHERE $where" ) if( $where && $type ne 'insert' );
if( $where && $where->elements->length )
{
$self->elements->push( $where ) unless( $opts->{no_bind_copy} );
}
push( @query, "GROUP BY $group" ) if( $group && $type eq 'select' );
push( @query, "HAVING $having" ) if( $having && $type eq 'select' );
push( @query, "ORDER BY $order" ) if( $order && $type eq 'select' );
push( @query, $sort ) if( $sort && $order && $type eq 'select' );
if( $limit && $type eq 'select' )
{
push( @query, "$limit" );
if( $limit->elements->length )
{
$self->elements->push( $limit ) unless( $opts->{no_bind_copy} );
}
}
if( $on_conflict )
{
if( $type eq 'insert' )
{
push( @query, $on_conflict );
}
else
{
warn( "Warning only: the MySQL ON CONFLICT clause is only supported for INSERT queries. Your query was of type \"$type\".\n" );
}
}
return( \@query );
}
1;
# NOTE: POD
__END__
=encoding utf-8
=head1 NAME
( run in 1.083 second using v1.01-cache-2.11-cpan-39bf76dae61 )