Crop-Config

 view release on metacpan or  search on metacpan

lib/Crop/Object/Warehouse/Pg.pm  view on Meta::CPAN

package Crop::Object::Warehouse::Pg;
use base qw/ Crop::Object::Warehouse /;

=begin nd
Class: Crop::Object::Warehouse::Pg
	General Postgres driver.

	Attribute 'dbi' keeps a connection to db.
=cut

use v5.14;
use warnings;
no warnings 'experimental::smartmatch';

use Crop::Error;
use Crop::Util;
use Crop::Object::Warehouse::Agent::DBI;
use Crop::Object::Constants;
use Crop::Object::Warehouse::Lang::SQL::Query::Select;
use Crop::Object::Warehouse::Lang::SQL::Query::Insert;
use Crop::Object::Warehouse::Lang::SQL::Query::Delete;
use Crop::Object::Warehouse::Lang::SQL::Query::Update;

use Crop::Debug;

=begin nd
Constant: KEYWORDS
	Key words for build query to a database.
=cut
use constant { KEYWORDS => [qw/ EXT LIMIT LOCK OFFSET ORDER SLICEN SORT /] };

=begin nd
Constructor: new ($conn)
	Establish connection to a specified database.
	
Parameters:
	$conn - credentials for database connection (login, pass, etc.)
	
Returns:
	$self - if OK
	undef - if connection to database fails
=cut
sub new {
	my ($class, @conn) = @_;
	
	my $self = bless {
		dbi => undef,
	}, $class;

	$self->{dbi} = Crop::Object::Warehouse::Agent::DBI->new(@conn);
	
	$self;
}

=begin nd
Method: all ($object, @filter)
	Get all exemplars that match the @filter clause.

Parameters:
	$object - class name of objects
	@filter - complex clause contains WHERE, ORDER BY, and EXT tokens
	
Returns:
	collection of objects - if ok
	undef                 - otherwise
	
=cut
sub all {
	my ($self, $object, @filter) = @_;
	my $in = {@filter};
	my $class = ref $self || $self;
	
	for my $field (keys %{$in}) {
		next if $field ~~ KEYWORDS;

		for (split ' OR ', $field) {
		    return warn "OBJECT|ALERT: Unknown attribute: $object.$_" unless $object->Attributes->have(STORED, $_);
		}
	}

	if (exists $in->{SORT}) {
		$in->{ORDER} = delete $in->{SORT};
		$in->{ORDER} = [$in->{ORDER}] unless ref $in->{ORDER};
	}
	
	my %clause = %$in;
	my $ext    = delete $clause{EXT};
	my $sort   = delete $clause{ORDER};
	my $limit  = delete $clause{LIMIT};
	my $offset = delete $clause{OFFSET};
	
# 	my %key;
	
	my $q = Crop::Object::Warehouse::Lang::SQL::Query::Select->new(
		start_class => $object,
		clause      => \%clause,
		order       => $sort,



( run in 0.905 second using v1.01-cache-2.11-cpan-39bf76dae61 )