enum-optionen => perl

enum-optionen => perl

am 18.03.2007 11:26:37 von Patrick Bates

hallo!

ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
machen.

hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
enum-optionen auslesen lassen.


greets
-/--\-
alex

Re: enum-optionen => perl

am 18.03.2007 11:52:34 von Christian Winter

Alexander Kainz schrieb:
> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.
>
> hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
> enum-optionen auslesen lassen.

Deine Angaben sind ein wenig dürftig. Welche enums?

Falls Du mögliche Werte für ein MySQL-Enum-Feld meinst, dann
sollte Dir
SELECT COLUMNS FROM [TABELLENNAME] LIKE '[SPALTENNAME]';
helfen. Aus dem Rückgabe-Record brauchst Du dann das "Type"-Feld,
das etwa wie
enum('WERTA','WERTB','WERTC')
aussieht.

Mit einem kleinen Trick kannst Du sogar Perl das Parsen überlassen:

my @werte = eval $row->{"Type"};
sub enum {
return @_
}

-Christian

Re: enum-optionen => perl

am 18.03.2007 14:14:49 von Mirco Wahab

Alexander Kainz wrote:
> hallo!
>
> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.
>
> hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
> enum-optionen auslesen lassen.
>

Ich rate mal was Du machen willst.
Letztens habe ich sowas mal übungs-
weise probiert (selbst MySQL-Anfänger).

Vielleicht kann mir auch jemand sagen, wie
das mit MySQL-Boardmitteln (5.0.x) besser
zu realisieren wäre.

Viele Grüße

M.

(Du wirst Dich schon durchfitzeln) ==>


use strict;
use warnings;

use Sys::Hostname;
use DBI;

my $dbhost = $^O=~/win/i ? 'fremderserver' : hostname();
my $dbname = 'meinedatenbank';
my %enums;

retrieve_enums($dbname, $dbhost, 'sqluser', 'sqlpasswd', \%enums);

print "[$dbname] $_ ==> $enums{$_}\n" for sort keys %enums;

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #

sub retrieve_enums
{
my ($dbn, $server, $usr, $pw, $rh) = @_;
my $dbh = DBI->connect("dbi:mysql:$dbn:$server", $usr, $pw) || die "$DBI::errstr $!";
my (@tablenames, $sth);

$sth = $dbh->prepare('SHOW TABLES') or die "prepare failed:" . $dbh->errstr . "\n";
$sth->execute() or die "execute failed:" . $dbh->errstr . "\n";
while(my @stuff = $sth->fetchrow) { push @tablenames, $stuff[0] }
$sth->finish();

for( @tablenames ) {
$sth = $dbh->prepare("SHOW COLUMNS FROM $_") or die "prepare failed:" . $dbh->errstr . "\n";
$sth->execute() or die "execute failed:" . $dbh->errstr . "\n";
while( my @stuff = $sth->fetchrow_array ) {
$rh->{"$_.$stuff[0]"} = join '|', split /,/, $1 if $stuff[1] =~ /enum\(([^\)]+)/
}
$sth->finish();
}
$dbh->disconnect or warn "Disconnection failed: $DBI::errstr\n";
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #

Re: enum-optionen => perl

am 18.03.2007 16:34:39 von Patrick Bates

"Mirco Wahab" schrieb im Newsbeitrag
news:etjecf$k21$1@mlucom4.urz.uni-halle.de...
> Ich rate mal was Du machen willst.
> Letztens habe ich sowas mal übungs-
> weise probiert (selbst MySQL-Anfänger).
>
> Vielleicht kann mir auch jemand sagen, wie
> das mit MySQL-Boardmitteln (5.0.x) besser
> zu realisieren wäre.
>
> Viele Grüße
>
> M.

hello!

ich hab das jetzt etwa so gelöst:

my @enum_select = &enum_set("TABELLE","TABELLENFELD");



sub enum_set {
my $sql_anw = "SHOW COLUMNS from $_[0] LIKE '$_[1]'";
$sth = $dbh->prepare($sql_anw);

my $enum_set = $dbh->selectrow_hashref($sql_anw);
my $enum = $enum_set->{Type};
$enum =~ s/enum//gi; # enum entfernen
$enum =~ s/\(|\)//gi; # klammern entfernen
$enum =~ s/\'//gi; # anführungszeichen entfernen

my @enum_data = split(/,/,$enum);

return @enum_data
}


greets
-/--\-
alex

Re: enum-optionen => perl

am 18.03.2007 17:09:36 von Christian Winter

Alexander Kainz schrieb:
> "Mirco Wahab" schrieb im Newsbeitrag
> news:etjecf$k21$1@mlucom4.urz.uni-halle.de...
>> Ich rate mal was Du machen willst.
>> Letztens habe ich sowas mal übungs-
>> weise probiert (selbst MySQL-Anfänger).
>>
>> Vielleicht kann mir auch jemand sagen, wie
>> das mit MySQL-Boardmitteln (5.0.x) besser
>> zu realisieren wäre.
>>
>> Viele Grüße
>>
>> M.
>
> hello!
>
> ich hab das jetzt etwa so gelöst:
>
> my @enum_select = &enum_set("TABELLE","TABELLENFELD");

Lass das "&" hier weg, es würde nur Sinn machen, wenn Du explizit
eine Prototyp-Deklaration übergehen wolltest.

> sub enum_set {
> my $sql_anw = "SHOW COLUMNS from $_[0] LIKE '$_[1]'";
> $sth = $dbh->prepare($sql_anw);
>
> my $enum_set = $dbh->selectrow_hashref($sql_anw);
> my $enum = $enum_set->{Type};
> $enum =~ s/enum//gi; # enum entfernen

$enum = substr( $enum, 4 );

ist schneller.

> $enum =~ s/\(|\)//gi; # klammern entfernen

$enum = tr/()//d;

ist ebenfalls schneller und auch besser lesbar. Der "i"-Modifier
ist unnötig.

> $enum =~ s/\'//gi; # anführungszeichen entfernen

$enum =~ s/(?
portabler, da escapede Anführungszeichen drin gelassen werden. Das
Hochkomma muss nicht escaped werden. "i" ist wieder überflüssig.

> my @enum_data = split(/,/,$enum);
>
> return @enum_data
> }

Oder kürzer:

sub get_enum {
return eval
$dbh->selectrow_hashref(
"SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
)->{"Type"};
}

sub enum {
return @_;
}

Das hat natürlich seine Einschränkungen, wenn dritte Schreibzugriff
auf die Datenbank haben, ist das eval vielleicht kein so guter
Einfall.

Ansonsten ließe sich das ganze auch mit weniger Schritten parsen:

sub get_enum
{
my $enum = $dbh->selectrow_hashref(
"SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
)->{"Type"};

return $enum =~ /^enum\('(.*)'\)$/ ? split(/','/, $1) : ();
}

-Christian

Re: enum-optionen => perl

am 19.03.2007 16:58:22 von Michael Panteleit

"Alexander Kainz" writes:

> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.

Da gibt's schöne Module für:
MySQL::TableInfo
CGI

Das sieht dann im Endeffekt so aus (Kopie aus perldoc MySQL::TableInfo)

use CGI;
use DBI;
use MySQL::TableInfo;

my $CGI = new CGI:
my $dbh = DBI->connect(....);
my $table = new MySQL::TableInfo($dbh, "bio");

print $CGI->header,
$CGI->start_html("MySQL::TableInfo"),
$CGI->start_form,
$CGI->div("Do you have beard?"),
$CGI->popup_menu(-name=>'has_beard',
-values=>[$table->enum('has_beard')],
-default=>$table->default('has_beard')),
$CGI->end_form,
$CGI->end_html;


Gruß,
Meikel

Re: enum-optionen => perl

am 19.03.2007 19:11:03 von Patrick Bates

> Ansonsten ließe sich das ganze auch mit weniger Schritten parsen:
>
> sub get_enum
> {
> my $enum = $dbh->selectrow_hashref(
> "SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
> )->{"Type"};
>
> return $enum =~ /^enum\('(.*)'\)$/ ? split(/','/, $1) : ();
> }
>
> -Christian

danke!

ich habe selten in so kurzer zeit so viel gelernt!


greets
-/--\-
alex