DB-Object
view release on metacpan or search on metacpan
lib/DB/Object/SQLite/Query.pm view on Meta::CPAN
}
$hash->{query} = join( ' ', @comp );
$self->{_on_conflict} = $hash;
$self->{on_conflict} = $self->new_clause({ value => join( ' ', @comp ) });
}
# We are being called possibly by _query_components
# If we have a callback, we execute it
if( $self->{_on_conflict_callback} && !scalar( @_ ) )
{
# This will use the insert components set up to format our on conflict clause properly
# The callback is needed, because the query formatting occurs after the calling of our method on_conflict()
$self->{_on_conflict_callback}->();
}
return( $self->{on_conflict} );
}
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 );
}
# Supported by SQLite since 3.35.0 (2021-03-12)
# <https://www.sqlite.org/lang_returning.html>
sub returning
{
my $self = shift( @_ );
my $tbl_o = $self->{table_object} || return( $self->error( "No table object is set." ) );
if( @_ )
{
my $pg_version = $self->database_object->version;
return( $self->error( "Cannot use returning for PostgreSQL version lower than 3.35.0 (released on 2021-03-12). This server version is: $pg_version" ) ) if( $pg_version < '3.35.0' );
# It could be a field name or a wildcard
return( $self->error( "A reference was provided (", ref( $_[0] ), "), but I was expecting a string, which could be a field name or even a star (*) indicating all fields." ) ) if( ref( $_[0] ) );
$self->{returning} = $self->new_clause({ value => shift( @_ ) });
}
# return( wantarray() ? () : undef() ) if( !$self->{returning} );
# return( wantarray() ? ( $self->{returning} ) : "RETURNING $self->{returning}" );
return( $self->{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( @_ );
my $tbl_o = $self->{table_object} || return( $self->error( "No table object is set." ) );
my( $where, $group, $having, $sort, $order, $limit, $returning, $on_conflict );
$where = $self->where();
$limit = $self->limit();
$returning = $self->returning;
$on_conflict = $self->on_conflict;
if( $type eq 'select' )
{
$group = $self->group();
$having = $self->having();
$sort = $self->reverse() ? 'DESC' : $self->sort() ? 'ASC' : '';
$order = $self->order();
$limit = $self->limit();
}
elsif( $type eq 'update' || $type eq 'delete' )
{
if( $tbl_o->can_update_delete_limit )
{
$limit = $self->limit();
}
}
my @query = ();
push( @query, "WHERE $where" ) if( $where && $type ne 'insert' );
push( @query, "GROUP BY $group" ) if( $group );
push( @query, "HAVING $having" ) if( $having );
push( @query, "ORDER BY $order" ) if( $order );
push( @query, $sort ) if( $sort && $order);
push( @query, $limit ) if( $limit );
if( $on_conflict )
{
if( $type eq 'insert' )
{
push( @query, $on_conflict );
}
else
{
warn( "The SQLite ON CONFLICT clause is only supported for INSERT queries. Your query was of type \"$type\".\n" );
}
}
# Supported as of 3.35.0 (2021-03-12)
push( @query, "RETURNING $returning" ) if( $returning && ( $type eq 'insert' || $type eq 'update' || $type eq 'delete' ) );
return( \@query );
}
1;
# NOTE: POD
__END__
=encoding utf-8
=head1 NAME
DB::Object::SQLite::Query - SQLite Query Object
( run in 0.652 second using v1.01-cache-2.11-cpan-39bf76dae61 )