Objekte in MySQL Datenbank speichern

Objekte in MySQL und Objektmanager in Perl

DB-Design: Create Statement

CREATE TABLE `objects` ( `oid` varchar(128) NOT NULL DEFAULT '', `att` varchar(128) NOT NULL DEFAULT '', `val` longtext NOT NULL DEFAULT '', PRIMARY KEY (`oid`,`att`), KEY `oid` (`oid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin

Wie zu sehen ist hat die Tabelle lediglich 3 Felder. Das ermöglicht Objekte mit beliebig vielen Eigenschafen als Attribut => Value Paare. Mit der für das Feld oid (Object-ID) gesetzten Collation wird ebendieses Feld case-sensitive.

Objektmanager in Perl

use lib qw( /var/www/vhosts/rolfrost.de/files/fwlib ); # Objekte in/aus MySQL # oid => { att => val } # Tabelle objects package Objects; use strict; use warnings; use Factory; use Tie::Hash; use base ('Tie::StdHash'); my $OID; # Object ID my $DBH; # MySQL Handle sub TIEHASH{ my $class = shift; $OID = shift; return eval{ my $factory = Factory->new; $DBH = $factory->dbh; my $r = $DBH->selectall_arrayref("select * from objects where oid=?", {Slice=>{}}, $OID); my %self = scalar @$r ? map{ $_->{att}, $_->{val} } @$r : (); bless \%self, $class; } } sub write{ my $self = shift; my $sth = $DBH->prepare_cached(qq( insert into objects (oid,att,val)values(?,?,?) )); $DBH->do("delete from objects where oid=?",{},$OID); foreach my $att(keys %$self){ $sth->execute($OID,$att,$self->{$att}); } } sub drop{ my $self = shift; %$self = (); $DBH->do("delete from objects where oid=?",{},$OID); } sub merge{ my $self = shift; my %in = @_; %$self = (%$self, %in); } sub delete{ my $self = shift; delete $self->{$_} for @_; } 1;######################################################################### __END__ package main; use strict; use warnings; use Data::Dumper; tie my %ussd, 'Objects', 'ussd' or die $@; print Dumper \%ussd;

Alle Funktionen sind statisch, also Klassenmethoden.

Anwendung

use strict; use warnings; use Objects; Objects::store( foo => {name => 'foo'}); Objects::store( bar => {name => 'bar'}); my $foo = Objects::fetch('foo'); my $bar = Objects::fetch('bar','Foo'); # $bar as instance of Class Foo print Objects::names(); # foo bar print Objects::rm('foo','bar'); # 2

Die zu speichernden Objekte haben also einen Namen und die Eigenschaften als Schlüssel => Werte - Paare. Mit der fetch()-Methode gibt es die Möglichkeit das Objekt als Instanz derjenigen Klasse zu übergeben deren Name gleich mit übergeben wird.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de. Entity: 1ef23fd0eb3646a5357e8b438dff617e