#!/usr/bin/perl
#
# This script is to manually create a schema cache entry for a mSQL
# database such that RDBAL may be then used with the DBI layer.
#
use RDBAL::Config;
$server = shift;
$database = shift;
if (!defined($database)) {
die "Usage is: msql_pqedit_schema server database\n";
}
$msql_home = $ENV{'MSQL_HOME'};
$relshow = "$msql_home/bin/relshow";
open(TABLE,"$relshow $database |");
$section_break = 0;
while(
) {
if (/^\s*\+\-+\+\s*$/) {
++$section_break;
next;
}
if ($section_break == 2) {
s/\|/\t/g;
s/^\s*//g;
s/\s*$//g;
push @table, ($_);
} elsif ($section_break == 3) {
last;
}
}
close(TABLE);
$cache_file = "$RDBAL::Config::cache_directory/$server$database.cache";
open(CACHE,">$cache_file");
map {
$section_break = 0;
$table = $_;
open(FIELD,"$relshow $database $table |");
while() {
if (/^\s*\+\-.*\-+\+\s*$/) {
++$section_break;
next;
}
if ($section_break == 2) {
s/\s*\|\s*/\|/g;
s/\|/\t/g;
s/^\s*//g;
s/\s*$//g;
($field, $type, $length, $null, $unique_index) = split("\t");
if ($type ne 'index') {
print CACHE join("\t",('O', $table, 'U', $field, $type, $length, '', '', '', $null)),"\n";
} else {
push @index, ("$table\t$field");
if (!defined($primary_index{$table}) &&
$unique_index eq 'Y') {
$primary_index{$table} = $field;
push @primary_index, ("$table\t$field");
}
if ($unique_index eq 'Y') {
$UNIQUE_INDEX{"$table\t$field"} = 1;
}
}
} elsif ($section_break == 3) {
last;
}
}
close(FIELD);
} @table;
print CACHE "\f\n";
map {
($table, $pindex) = split("\t");
$section_break = 0;
$field_number = 0;
open(PINDEX,"$relshow $database $table $pindex |");
while() {
if (/^\s*\+\-+\+\s*$/) {
++$section_break;
next;
}
if ($section_break == 2) {
s/\|/\t/g;
s/^\s*//g;
s/\s*$//g;
$field_number++;
print CACHE join("\t",('PK', $table, 'User Table', $database, 'dbo', $table, $_, $field_number, $index)),"\n";
} elsif ($section_break == 3) {
last;
}
}
close(PINDEX);
} @primary_index;
print CACHE "\f\n";
# No Foreign Key Section
print CACHE "\f\n";
# Index Section
print CACHE "\f\n";
map {
$section_break = 0;
($table,$index) = split("\t");
undef @field;
undef $index_type;
open(INDEX,"$relshow $database $table $index |");
while() {
if (/^\s*\+\-+\+\s*$/) {
++$section_break;
next;
}
if (/Index\s*Type\s*\=\s*/) {
($index_type) = /Index\s*Type\s*\=\s*(.*)\s*$/;
}
if ($section_break == 2) {
s/\|/\t/g;
s/^\s*//g;
s/\s*$//g;
push @field, ($_);
} elsif ($section_break == 3) {
last;
}
}
close(INDEX);
undef @description;
if (defined($UNIQUE_INDEX{"$table\t$index"})) {
push @description, ('unique');
}
if (defined($primary_index{$table}) &&
$primary_index{$table} eq $index) {
push @description, ('primary key');
}
print CACHE join("\t",('I', $table, 'User Table', $index,
join(' ',(join(', ',@description),$index_type)),
join(', ',@field))),"\n";
} @index;
# View section
print CACHE "\f\n";
close(CACHE);