git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4210 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			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;
 |