The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Class::AutoDB::BaseTable;

use vars qw(@ISA @AUTO_ATTRIBUTES @OTHER_ATTRIBUTES %SYNONYMS %DEFAULTS);
use strict;
use Class::AutoClass;
use Text::Abbrev;
use Class::AutoDB::Table;
@ISA = qw(Class::AutoDB::Table);

@AUTO_ATTRIBUTES=qw();
@OTHER_ATTRIBUTES=qw();
Class::AutoClass::declare(__PACKAGE__);

# NG 09-03-19: commented out _init_self -- stub not needed
# sub _init_self {
#   my($self,$class,$args)=@_;
#   return unless $class eq __PACKAGE__; # to prevent subclasses from re-running this
# }
# TODO: this is re-used in Database.pm.  find a single place for this.
# TODO: this is re-used in Table.pm.  Reimplement as method
my %TYPES=(string  =>'longtext',
	   integer =>'int',
	   float   =>'double',
	   object  =>'bigint unsigned',);
my @TYPES=keys %TYPES;
my %TYPES_ABBREV=abbrev @TYPES;

sub put {
  my($self,$oid,$key_values)=@_;
  my %keys=$self->keys;
  my $dbh=$self->dbh;
  my $name=$self->name;
  my @columns=('oid');
  my @values=($oid);
  while(my($key,$type)=each %keys) {
    my $value=$key_values->{$key};
    # NG 09-12-17: line below causes 0's to be stored as NULLs. breaks queries
    #              selecting on 0. scary this wasn't caught earlier!
    # next unless $value;
    push(@columns,$key);
    push(@values,$dbh->quote($value,$TYPES{$type}));
  }
  my $columns='('.join(',',@columns).')';
  my $values='values('. join(',',@values).')';
  my $sql="REPLACE $name $columns $values";
  wantarray? ($sql): [$sql];
}
# NG 10-09-06: added 'del' method
sub del {
  my($self,$oid)=@_;
  my $dbh=$self->dbh;
  my $name=$self->name;
  my $sql="DELETE FROM $name WHERE oid=$oid";
  wantarray? ($sql): [$sql];
}
sub create {
  my($self)=@_;
  my $name=$self->name;
  my $keys=$self->keys;
  my $index = defined $self->index ? $self->index : 1; # indexing is default
  my @columns=('oid bigint unsigned not null, primary key (oid)');
  while(my($key,$type)=each %$keys) {
    my $sql_type=$TYPES{$TYPES_ABBREV{$type}} or
      $self->throw("Invalid data type for key $key: $type. Should be one of: ".join(' ',@TYPES));
    if($index) {
      $index=$sql_type ne 'longtext'? "index($key)": "index($key(255))";
      push(@columns,"$key $sql_type,$index");     
    } else {
      push(@columns,"$key $sql_type");
    }
  }
  my $sql=@columns? "create table $name \(".join(',',@columns)."\)": '';
  wantarray? ($sql): [$sql];
}
sub alter {
  my($self)=@_;
  my $name=$self->name;
  my $keys=$self->keys;
  my $index = defined $self->index ? $self->index : 1; # indexing is default
  my @columns;
  while(my($key,$type)=each %$keys) {
    my $sql_type=$TYPES{$TYPES_ABBREV{$type}} or
      $self->throw("Invalid data type for key $key: $type. Should be one of: ".join(' ',@TYPES));
    if($index) {
      $index=$sql_type ne 'longtext'? "index($key)": "index($key(255))";
      push(@columns,"add $key $sql_type,add $index");     
    } else {
      push(@columns,"add $key $sql_type");
    }
  }
  my $sql=@columns? "alter table $name ".join(',',@columns): '';
  wantarray? ($sql): [$sql];
}

1;