Dimedis-Sql
view release on metacpan or search on metacpan
lib/Dimedis/SqlDriver/ASAny.pm view on Meta::CPAN
binmode $val;
$$blob = join ("", <$val>);
} elsif ( not ref $val ) {
# keine Referenz
# => Dateiname
# => reinlesen den Kram
my $fh = new FileHandle;
open ($fh, $val) or croak "can't open file '$val'";
binmode $fh;
$$blob = join ("", <$fh>);
$self->{debug} && print STDERR "$exc:db_blob2memory: blob_size ($val): ", length($$blob), "\n";
close $fh;
} else {
# andernfalls ist val eine Skalarreferenz mit dem Blob
# => nix tun
$blob = $val;
}
return $blob;
}
1;
__END__
=head1 NAME
Dimedis::SqlDriver::ASAny - SQL Anywhere Treiber für das Dimedis::Sql Modul
=head1 SYNOPSIS
siehe Dimedis::Sql
=head1 DESCRIPTION
siehe Dimedis::Sql
=head1 BESONDERHEITEN DER IMPLEMENTIERUNG
=head2 SERIAL BEHANDLUNG
Spalten, die mit dem 'serial' Datentyp angegeben sind, müssen in der
Datenbank als primary key integer Spalten deklariert sein, z.B.
id integer primary key not null
Aufgrund von Restriktionen der Sybase Datenbank im Zusammenhang mit
Parameter Binding kann der Sybase eigene identity Mechanismus nicht
verwendet werden.
Stattdessen legt die $sqlh->install Methode eine eigene Tabelle für
die Verwaltung von serials an.
create table dim_serial (
name varchar(32),
id integer default 0,
primary key(name)
)
Die Verwaltung dieser Tabelle erfolgt durch Dimedis::Sql vollkommen
transparent.
=head2 BLOB BEHANDLUNG
Blobs werden vollständig über eine eigene Implementierung innerhalb
von Dimedis::Sql verwaltet. Hierzu legt die $sqlh->install Methode
eine Tabelle an, die Blobs in Form von einzelnen Datensätzen mit
einer maximalen Größe von derzeit knapp 16KB aufnimmt.
create table dim_blob (
id integer not null,
pos integer not null,
chunk image null,
primary key(id, pos)
)
Eine Tabelle, die einen Blob aufnehmen soll, enthält nun nur eine
integer Referenz auf die ID des Blobs (dim_blob.id), da der Blob
selbst ja in der dim_blob Tabelle gespeichert wird. Der Zugriff
auf den Blob (lesend wie schreibend) wird durch Dimedis::Sql
vollkommen transparent durchgeführt.
Sybase Blobs machen keinen Unterschied zwischen textuellen (CLOB)
und binären (BLOB) Daten.
Beispiel für eine Tabelle mit Blobs:
create table test (
id integer primary key not null,
bild_blob integer null,
text_blob integer null
)
Damit Blobs, die auf diese Weise von einer Tabelle aus referenziert
werden, auch beim Löschen von Datensätzen mit entfernt werden,
muß ein Trigger angelegt werden, für jede Tabelle, die Blobs enthält:
create trigger test_del
on test
for delete as
delete from dim_blob
where id in (select bild_blob from deleted) or
id in (select text_blob from deleted)
Die where Bedingung des 'delete' Statements muß natürlich
entsprechend der Haupttabelle angepaßt werden. (Die 'deleted'
Tabelle in der where Bedingung ist eine Pseudo Tabelle, die
alle Datensätze der Haupttabelle enthält, die im Begriff sind
durch das aktuell durchgeführte delete Statement entfernt zu
werden).
=head2 NULL VALUES
Dies ist keine Besonderheit von Dimedis::SqlDriver::Sybase,
sie betrifft Sybase Datenbanken grundsätzlich. Per Default sind
Spalten in Sybase stets mit NOT NULL deklariert. Um eine Spalte
zu erzeugen, die NULL Werte aufnehmen darf, muß explizit NULL
angegeben werden. (Siehe Beispieltabelle bei BLOB BEHANDLUNG).
=head2 LEFT OUTER JOIN METHODE
Sybase kennt keine nested outer Joins. Derzeit liefert Dimedis::Sql
zwar Werte für diesen Fall zurück, diese werden jedoch bei Ausführung
von Sybase als fehlerhaft abgewiesen.
Nested outer Joins müssen demzufolge per Hand in der Applikation
realisiert werden. (Ob eine Datenbank nested outer Joins unterstützt,
kann mit der Methode $sqlh->get_features abgefragt werden).
=head2 CONTAINS METHODE
Diese Methode ist z.Zt. nicht implementiert, d.h. liefert B<immer> undef
zurück.
=head2 INSTALL METHODE
Die $sqlh->install Methode legt zwei Tabellen an, sofern sie
nicht schon existieren:
dim_serial verwaltet Serials (siehe SERIAL BEHANDLUNG)
dim_blob verwaltet Blobs (sie BLOB BEHANDLUNG)
( run in 2.386 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )