xcat-core/perl-xCAT/xCAT/ExtTab.pm

119 lines
3.5 KiB
Perl

#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------
package xCAT::ExtTab;
BEGIN
{
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr';
}
use lib "$::XCATROOT/lib/perl";
use xCAT::MsgUtils;
use File::Path;
%ext_tabspec=();
$ext_defspec=();
# loads user defined table spec. They are stored under /opt/xcat/lib/perl/xCAT_schema directory
my $path="$::XCATROOT/lib/perl/xCAT_schema";
my @extSchema=glob($path."/*.pm");
# print "\nextSchema=@extSchema\n";
foreach (@extSchema) {
/.*\/([^\/]*).pm$/;
my $file=$_;
my $modname = $1;
no strict 'refs';
eval {require($_)};
if ($@) {
xCAT::MsgUtils->message('ES',"\n Warning: The user defined database table schema file $file cannot be located or has compiling errors.\n");
next;
}
if (${"xCAT_schema::" . "$modname" . "::"}{tabspec}) {
my %tabspec=%{${"xCAT_schema::" . "$modname" . "::"}{tabspec}};
foreach my $tabname (keys(%tabspec)) {
if (exists($ext_tabspec{$tabname})) {
xCAT::MsgUtils->message('ES', "\n Warning: File $file: the table name $tabname is used by other applications. Please rename the table.\n");
} else {
$ext_tabspec{$tabname}=$tabspec{$tabname};
}
}
} else {
xCAT::MsgUtils->message('ES', "\n Warning: Cannot find \%tabspec variable in the user defined database table schema file $file\n");
}
#get the defspec from each file and merge them into %ext_defspec
if (${"xCAT_schema::" . "$modname" . "::"}{defspec}) {
my %defspec=%{${"xCAT_schema::" . "$modname" . "::"}{defspec}};
foreach my $objname (keys(%defspec)) {
if (exists($defspec{$objname}->{'attrs'})) {
if (exists($ext_defspec{$objname})) {
#print "insert\n";
my @attr_new=@{$defspec{$objname}->{'attrs'}};
my @attr=@{$ext_defspec{$objname}->{'attrs'}};
my %tmp_hash=();
foreach my $orig (@attr) {
my $attrname=$orig->{attr_name};
$tmp_hash{$attrname}=1;
}
foreach my $h (@attr_new) {
my $attrname=$h->{attr_name};
if (exists($tmp_hash{$attrname})) {
xCAT::MsgUtils->message('ES', "\n Warning: Conflict when adding user defined defspec from file $file. Attribute name $attrname is already defined in object $objname. \n");
} else {
#print "\ngot here objname=$objname, attrname=" . $h->{attr_name} . "\n";
push(@{$ext_defspec{$objname}->{'attrs'}}, $h);
}
}
} else {
#print "\ngot here objname=$objname, file=$file\n";
$ext_defspec{$objname}=$defspec{$objname};
}
}
}
}
} #foreach
#print out the defspec
#print "\nexternal defspec:\n";
#foreach(%ext_defspec) {
# print " $_:\n";
# my @attr=@{$ext_defspec{$_}->{'attrs'}};
# foreach my $h (@attr) {
# print " " . $h->{attr_name} . "\n";
# }
#}
#-------------------------------------------------------
=head1 xCAT::ExtTab
Handles user defined database tables.
=cut
#------------------------------------------------------
#-------------------------------------------------------
=head3 updateTables
It is called by xcatd to generate the user-defined tables
if they do not exist, it also updates the tables if there is
Schmea change.
=cut
#-------------------------------------------------------
sub updateTables
{
#print "\nupdateTables\n";
#print "\n";
foreach (keys %ext_tabspec) {
my $table= xCAT::Table->new($_,-create=>1,-autocommit=>1);
}
}
1;