#!/usr/bin/perl use strict; use warnings; use Cache::FastMmap; package MultiDesk::DB; use base 'Class::DBI::Sweet'; MultiDesk::DB->iterator_class('MultiDesk::Iterator'); sub new() { my $class=shift; my %params=@_; my $self={}; bless $self,$class; die ("MultiDesk: Bad parameters") unless ($params{db} && $params{host} && $params{user} && $params{password}); $self=MultiDesk::DB->connection("dbi:mysql:".$params{db}, $params{user}, $params{password}); MultiDesk::DB->cache( Cache::FastMmap->new( share_file => '/tmp/cdbi', expire_time => 3600) ); return $self; } sub set_userid { my $class=shift; my $userid=shift; my $ticket_list=" SELECT __ESSENTIAL(me)__ FROM %s WHERE %s AND (`reseller`,`departament`) IN (SELECT `reseller`, `departament` FROM `acl` WHERE `userid`=?) %s %s"; my $ticket_count=" SELECT COUNT(*) FROM %s WHERE %s AND (`reseller`,`departament`) IN (SELECT `reseller`, `departament` FROM `acl` WHERE `userid`=?)"; $ticket_list=~s/\?/"'".$userid."'"/eg; $ticket_count=~s/\?/"'".$userid."'"/eg; MultiDesk::Ticket->set_sql(ticket_list => $ticket_list); MultiDesk::Ticket->set_sql(ticket_list_Count => $ticket_count); $ticket_list=" SELECT __ESSENTIAL(me)__ FROM %s WHERE %s AND `reseller` IN (SELECT `reseller` FROM `acl` WHERE `userid`=?) %s %s"; $ticket_count=" SELECT COUNT(*) FROM %s WHERE %s AND `reseller` IN (SELECT `reseller` FROM `acl` WHERE `userid`=?)"; $ticket_list=~s/\?/"'".$userid."'"/eg; $ticket_count=~s/\?/"'".$userid."'"/eg; MultiDesk::Ticket->set_sql(ticket_list_by_reseller => $ticket_list); MultiDesk::Ticket->set_sql(ticket_list_by_reseller_Count => $ticket_count); } sub get_handle { my @db_names = MultiDesk::DB->db_names; my $db_meth = 'db_'.$db_names[0]; return MultiDesk::DB->$db_meth; } sub get_fields { my $class=shift; return map { $class->$_(); } @_; } sub associate { my $class=shift; my %assoc=@_; my %res; foreach my $key (keys %assoc) { my $method=$assoc{$key}; $res{$key}=$class->$method(); } return \%res; } package MultiDesk::Iterator; use base 'Class::DBI::Iterator'; sub make_list { my $iterator=shift; my %map=@_; my @resultset; while(my $ent=$iterator->next()) { my %row; foreach my $key (keys %map) { unless (defined $map{$key}) { $row{$key}=$ent->$key(); next; } if (ref($map{$key}) ne 'CODE') { die __PACKAGE__.": Bad param to make list."; } $row{$key}=&{ $map{$key} }($ent); } push @resultset,\%row; } return \@resultset; }