# Pass these items # DBI object # table name # id column name # and id looking for # Example to get a row with id from user table # my $data = $r2h->($db, 'users', 'id', 10); my $r2h = sub { my $db = shift; my $table_name = shift; my $key_name = shift; my $id = shift; my $data = undef; eval { my $res = $db->prepare( "select * from `$table_name` where `$key_name`=? limit 1") or die $db->errstr(); $res->execute($id) or die $res->errstr(); my $name = $res->{'NAME'}; while(my @c = $res->fetchrow_array()) { my $x = 0; foreach my $n (@{$name}) { $data->{$n} = $c[$x]; $x++; } $data->{'HEADERS'} = $name; } $res->finish(); }; if($@) { $data = undef; } return $data; }; # r2h's in other modules return an array instead # ($data, $err) so that caller can distinguish between no # entry in the table and a real error. #### sub create_lead { my $self = shift; my $uuid = undef; my $data = undef; eval { $uuid = $self->gen_uuid(); # This is where I saw the abstraction. # I built $get_factory off of the table descriptions $data = $get_factory->('leads'); $data->{'id'} = $uuid; $data->{'first_name'} = $uuid; $data->{'last_name'} = $uuid; $data->{'date_entered'} = $get_now->(); $data->{'date_modified'} = $get_now->(); $data->{'created_by'} = 1; $data->{'modified_user_id'} = 1; $data->{'description'} = 'Sugar::create_lead()'; }; if($@) { $self->{'ERRSTR'} = $@; $uuid = undef; $data = undef; } return $data; } #### sub save_lead { my $self = shift; my $data = shift; my $t_name = $self->get_table_name('leads'); eval { my $count = 0; die "No id in data!\n" unless $data->{'id'}; # Get our database handle; my $dbh = $self->get_db(); if(not $dbh) { $dbh = $self->connect() or die $self->errstr(); } # Validate this id does exist my $res = $dbh->prepare( "select count(*) from `$t_name` where id=?") or die $dbh->errstr(); $res->execute($data->{'id'}) or die $res->errstr(); $res->bind_columns(\$count) or die $res->errstr(); while($res->fetchrow()) { } $res->finish(); # We need to create one! if(not $count) { $res = $dbh->prepare( "insert into `$t_name` (id,description,date_entered,date_modified,created_by,modified_user_id) values (?,?,?,?,?,?) ") or die $dbh->errstr(); $res->execute($data->{'id'}, 'Sugar::save_lead()', $get_now->(),$get_now->(), 1,1) or die $res->errstr(); } $data->{'date_modified'} = $get_now->(); # Build our SQL statement and add values to array my $sql = "update `$t_name` set \n"; my @v; foreach my $header (@{$data->{'HEADERS'}}) { next if $header eq 'id'; $sql .= " `$header`=?,\n"; push @v, $data->{$header}; } chop($sql); chop($sql); $sql .= "\n where id=?;\n"; # Do update my $res = $dbh->prepare($sql) or die $dbh->errstr(); $res->execute(@v, $data->{'id'}) or die $res->errstr(); }; if($@) { $self->{'ERRSTR'} = $@; return 0; } return 1; } #### r2h(..) { my $dbh = shift; my $table_name = shift; my $col_name = shift; my $v = shift; my $where = shift; my @w_conds = @_; my $sql = ... if($where) { $sql .= "($where) and `$col_name`= ?". } else { $sql .= "where `$col_name` = ?"; } ... } #### create_tmp_table('leads'); .. creates leads_XXXXX in MySQL DB .. methods like save_lead() will create the row or update the row in that table instead.