The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bio::DB::Tagger::mysql;

use strict;
use warnings;
use base 'Bio::DB::Tagger';

sub _table_definitions {
    my $self = shift;
    my $init = '';
    while (<DATA>) {
	last if /^__END__/;
	$init .= $_;
    }
    return split ";\n",$init;
}

sub _add_tags {
    my $self = shift;
    my ($objectname,$tags) = @_;

    my $dbh = $self->dbh;
    # create/get object id
    my $oid = $self->object_to_id($objectname,1);
    for my $tag (@$tags) {
	my $tid = $self->tag_to_id($tag->name,1);
	my $aid = $self->author_to_id($tag->author,1);
	my $value = $tag->value;
	$dbh->begin_work;
	eval {
	    local $dbh->{RaiseError}=1;
	    my $sth = $self->dbh->prepare(
		"REPLACE INTO tag (oid,tid,aid,tvalue) VALUES (?,?,?,?)"
		);
	    $sth->execute($oid,$tid,$aid,$value);
	    $dbh->commit;
	};
	if ($@) {
	    warn $@;
	    $dbh->rollback;
	}
    }
}


1;

__DATA__

DROP TABLE IF EXISTS tagname;
CREATE TABLE tagname (
    tid    int(11) auto_increment primary key,
    tname  varchar(255) not null,
    unique key(tname(64))
) ENGINE=InnoDB;

DROP TABLE IF EXISTS author;
CREATE TABLE author (
    aid     int(11) auto_increment primary key,
    aname   varchar(255) not null,
    unique key(aname(64))
) ENGINE=InnoDB;

DROP TABLE IF EXISTS object;
CREATE TABLE object (
    oid          int(11) auto_increment primary key,
    oname        varchar(512) not null,
    unique key(oname(64))
) ENGINE=InnoDB;

DROP TABLE IF EXISTS tag;
CREATE TABLE tag (
    oid         int(11) not null,
    tid         int(11) not null,
    aid         int(11) not null,
    tvalue      longblob,
    tmodified   timestamp,
    key(oid),
    key(tid,aid)
) ENGINE=InnoDB;

__END__