DB-Object
view release on metacpan or search on metacpan
lib/DB/Object/Query/Element.pm view on Meta::CPAN
my $self = CORE::shift( @_ );
my $serialiser = CORE::shift( @_ ) // '';
my $class = CORE::ref( $self );
# We keep a strict allow-list to avoid accidentally freezing DBI handles or other
# process-local state.
my @props = @{$self->{_fields}};
my $hash = {};
foreach my $prop ( @props )
{
if( CORE::exists( $self->{ $prop } ) &&
defined( $self->{ $prop } ) &&
CORE::ref( $self->{ $prop } ) ne 'CODE' )
{
$hash->{ $prop } = $self->{ $prop };
}
}
# Return an array reference rather than a list so this works with Sereal and CBOR.
# Before Sereal version 4.023, Sereal did not support multiple values returned.
if( $serialiser eq 'Sereal' )
{
require Sereal::Encoder;
require version;
if( version->parse( Sereal::Encoder->VERSION ) < version->parse( '4.023' ) )
{
CORE::return( [$class, $hash] );
}
}
# But Storable wants a list with the first element being the serialised element
CORE::return( $class, $hash );
}
sub STORABLE_freeze { return( shift->FREEZE( @_ ) ); }
sub STORABLE_thaw { return( shift->THAW( @_ ) ); }
sub THAW
{
# STORABLE_thaw would issue $cloning as the 2nd argument, while CBOR would issue
# 'CBOR' as the second value.
my( $self, undef, @args ) = @_;
my $ref = ( CORE::scalar( @args ) == 1 && CORE::ref( $args[0] ) eq 'ARRAY' ) ? CORE::shift( @args ) : \@args;
my $class = ( CORE::defined( $ref ) && CORE::ref( $ref ) eq 'ARRAY' && CORE::scalar( @$ref ) > 1 ) ? CORE::shift( @$ref ) : ( CORE::ref( $self ) || $self );
my $hash = CORE::ref( $ref ) eq 'ARRAY' ? CORE::shift( @$ref ) : {};
my $new;
# Storable pattern requires to modify the object it created rather than returning a new one
if( CORE::ref( $self ) )
{
foreach( CORE::keys( %$hash ) )
{
$self->{ $_ } = CORE::delete( $hash->{ $_ } );
}
$new = $self;
}
else
{
$new = CORE::bless( $hash => $class );
}
CORE::return( $new );
}
1;
# NOTE: POD
__END__
=encoding utf-8
=head1 NAME
DB::Object::Query::Element - Database Object Interface
=head1 SYNOPSIS
use DB::Object::Query::Element;
my $this = DB::Object::Query::Element->new(
# a scalar, or an DB::Object::Fields::Field object
field => $some_sql_field,
# designed to be used for insert statements
format => $some_format,
# The position, if any, of this new object
# This is used for numbered placeholders only,
# such as $1, $2, or ?1, ?2 depending on the driver
index => $integer,
# Could also be $1, $2, ?1, ?2 depending on the driver
placeholder => '?',
# a DB::Object::Query object
query_object => $object,
type => $sql_type,
value => $some_value,
) || die( DB::Object::Query::Element->error );
=head1 VERSION
v0.3.1
=head1 DESCRIPTION
This class represent a L<query|DB::Object::Query> element as used throughout this API. It can represent the formatting of some part of an insert query, or some placeholder and its type and field, or just a field and its value, or a combination of tho...
It makes it more efficient to build query with their associated binded values and types in the proper order, possibly using numbered placeholder, if the SQL driver (such as L<PostgreSQL|DBD::Pg> or L<SQLite|DBD::sqlite>) support them.
=head1 CONSTRUCTOR
=head2 new
Takes an hash or hash reference of key-value pairs matching any of the methods below.
Returns a newly instantiated object upon success, or sets an L<error|Module::Generic/error> and return C<undef> or an empty list, depending on the caller's context.
=head1 METHODS
=head2 as_is
Sets or gets the boolean value. If true, then the format specified will be used as-is during execution. This is aimed for value representing SQL functions or other values passed through that the user wants no optimisation.
For example:
( run in 1.774 second using v1.01-cache-2.11-cpan-f56aa216473 )