2009-01-09 22:25:35 +00:00
#!/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 ) ) {
2009-01-13 21:29:34 +00:00
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 } ;
}
2009-01-09 22:25:35 +00:00
}
} 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";
2009-09-23 14:09:12 +00:00
#print "\n";
2009-01-09 22:25:35 +00:00
foreach ( keys % ext_tabspec ) {
my $ table = xCAT::Table - > new ( $ _ , - create = > 1 , - autocommit = > 1 ) ;
}
}
1 ;