/SQLShell.pm

http://cupsfilter.googlecode.com/ · Perl · 164 lines · 131 code · 14 blank · 19 comment · 14 complexity · 3de8b12df011a0ec11245dc14581caf2 MD5 · raw file

  1. package SQLShell;
  2. use strict;
  3. use Carp;
  4. use DBI;
  5. # For some advanced uses you may need PostgreSQL type values:
  6. use DBD::Pg qw(:pg_types);
  7. use base qw[ISQLDriver];
  8. use utf8;
  9. BEGIN {
  10. our $VERSION = '0.04';
  11. our $AUTHORITY = 'freelance:SLANT';
  12. }
  13. my $Count = 0;
  14. sub new {
  15. my $proto = shift; # ????????? ??? ?????? ??? ????????? ?? ??????
  16. my $class = ref($proto) || $proto; # ???? ?????????, ?? ????? ?? ???? ??? ??????
  17. $Count++; # ?????????? ?????????? ???????????? ??????????? ??????
  18. my $self = {};
  19. $self->{DB_TRACE} =[]; # ????? ??????? ?????????? ? ?? log_level,filename
  20. $self->{OPTIONS} = []; # ?????? ?? ?????????? ?????? ??????
  21. $self->{DBH}=undef; # Pointer to database handler
  22. bless($self, $class); # ?????? ????? ??????? bless
  23. return $self;
  24. }
  25. sub just_do {
  26. my ($self,$func,$param)=@_;
  27. if (defined $self->{DBH}){
  28. my $p =undef;
  29. foreach my $item(@$param){
  30. #$item ="\'$item\'";
  31. $item =$self->{DBH}->quote($item);
  32. }
  33. $p= join(",",@$param);
  34. my $q="SELECT $func($p)";
  35. #$self->{DBH}->begin_work();
  36. my $sth = $self->{DBH}->prepare($q);
  37. $sth->execute() || croak("SQLShell.pm:: Can't execute sql query. Error $self->{DBH}->errstr\n");
  38. #$self->{DBH}->commit();
  39. return $sth->fetchall_arrayref();# Returns pointer to array of result
  40. }else{
  41. croak("SQLShell.pm:: Can't execute sql query. Database not connected \n");
  42. }
  43. }
  44. sub debug {
  45. my $self = shift;
  46. if (@_) {
  47. @{ $self->{DB_TRACE} } = @_;
  48. #TODO Add validation log_level must from 1 to 7
  49. if ($self->{DB_TRACE}->[0] < 0){
  50. $self->{DB_TRACE}->[0]=0;
  51. }
  52. if ($self->{DB_TRACE}->[0] > 7){
  53. $self->{DB_TRACE}->[0]=7;
  54. }
  55. if ((scalar(@{$self->{DB_TRACE}})== 2)&& defined $self->{DBH}){
  56. $self->{DBH}->trace($self->{DB_TRACE}->[0],$self->{DB_TRACE}->[1]);
  57. }
  58. #TODO check file name or not what's the question ?
  59. }
  60. return $self->{DB_TRACE};
  61. }
  62. sub disconnect {
  63. my ($self) = @_;
  64. $self->{DBH}->disconnect() if defined($self->{DBH});
  65. }
  66. sub connect{
  67. my $self = shift;
  68. if (scalar(@{$self->{OPTIONS}})== 7){
  69. my ($dbname,$username,$password,$dbhost,$dbport,$dboptions,$dbtty)=@{$self->{OPTIONS}};
  70. #TODO ???????? ????? ??????? ??? - ??????? ??????? ? ???? ?? ????????? postgres ????? ??????? ????? ????
  71. $self->{DBH} = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport;options=$dboptions",$username,$password,
  72. {PrintError => 0, RaiseError => 1,AutoCommit => 1});
  73. #Test connection
  74. croak("SQLShell.pm::connect Erorr $DBI::errstr\n") unless (defined $self->{DBH});
  75. #????? ???? ???? ? ??????? DD.MM.YYYY, ? ?? ??? ?? ????????? ? ??????? ISO ??? ??? ? ????? ???? ??????? ?????.
  76. $self->{DBH}->do("SET DATESTYLE TO GERMAN");
  77. }else{
  78. croak("SQLShell.pm::connect Can't connect to BD. becouse arument's list not full");
  79. }
  80. }
  81. sub select {
  82. my($self, $fields,$table, $cond) = @_;
  83. #TODO add check $fields,$table,$cond
  84. if (defined $self->{DBH}){
  85. #$self->{DBH}->begin_work();
  86. my $q="SELECT $fields FROM $table WHERE $cond";
  87. my $sth = $self->{DBH}->prepare($q);
  88. my $rv = $sth->execute();
  89. #$self->{DBH}->commit();
  90. if (!defined $rv) {
  91. my $e="SQLShell.pm:: When execute query $q:".$self->{DBH}->errstr."\n";
  92. croak ($e);
  93. }else{
  94. return $sth->fetchall_arrayref();# Returns pointer to array of result
  95. }
  96. }else{
  97. croak("SQLShell.pm:: Can't execute sql query. Database not connected \n");
  98. }
  99. }
  100. #TODO need function for packet's data insert, update(use ??? and prepare)
  101. sub _doexec{# Private function !!!
  102. my ($self,$query)=@_;
  103. if (defined $self->{DBH}){
  104. #$self->{DBH}->begin_work();
  105. my $rv = $self->{DBH}->do($query);
  106. #$self->{DBH}->commit();
  107. if (!defined $rv) {
  108. my $e="SQLShell.pm:: When execute query $query\n:".$self->{DBH}->errstr."\n";
  109. croak ($e);
  110. }else{
  111. return $rv;# Returns count records
  112. }
  113. }else{
  114. croak("SQLShell.pm:: Can't execute sql query. Database not connected \n");
  115. }
  116. }
  117. sub delete{
  118. my($self,$table,$cond) = @_;
  119. #TODO add check $table,$cond
  120. my $q="DELETE FROM $table WHERE $cond";
  121. return $self->_doexec($q);
  122. }
  123. sub update{
  124. my($self,$table,$field,$value,$cond) = @_;
  125. #TODO add check $table, $fields,$values,$cond
  126. my $q="UPDATE $table SET $field=$self->{DBH}->quote($value) WHERE $cond";
  127. return $self->_doexec($q);
  128. }
  129. sub insert {
  130. my($self, $table, $fields,$values) = @_;
  131. #TODO add check $table, $fields,$values
  132. my $q="INSERT INTO $table ($fields) VALUES (E$values)";
  133. return $self->_doexec($q);
  134. }
  135. sub options {
  136. my $self = shift;#
  137. if (@_) { @{ $self->{OPTIONS} } = @_ }
  138. return $self->{OPTIONS};
  139. }
  140. sub DESTROY {
  141. $Count--;
  142. }
  143. sub total {
  144. return $Count;
  145. }
  146. END{
  147. #Dirty hack, but reliably!!!
  148. SQLShell::disconnect();
  149. }
  150. 1; # ??? ??????? require ??? use