#!/usr/bin/perl
#
# mdef generate def files for PPC
#(PPC PHP + PostgreSQL wide use Class)
#
#use Digest::MD5  qw(md5_hex);
print "generate def file & sql file for PPC\n";
$filename = "";
$deffile = "";
$DEF_GEN = "on";
$SQL_GEN = "on";
$SQL_EXEC = "off";
$HELP = "off";
$DEF_PATH = $ENV{'PPC_DEF'};
$SQL_PATH = $ENV{'PPC_SQL'};
$HOME = $ENV{'HOME'};
if($DEF_PATH eq "") { $DEF_PATH = $HOME."/public_html/def"; }
if($SQL_PATH eq "") { $SQL_PATH = $HOME."/sql"; }

for(@ARGV) {
	if(index($_,"--") == 0) {
		if($_ eq "--def-nogen") {	$DEF_GEN = "off";
									$SQL_GEN = "off";
									$SQL_EXEC = "off"; }
		if($_ eq "--sql-nogen") {	$SQL_GEN = "off";
									$SQL_EXEC = "off"; }
		if($_ eq "--sql-exec") {	$SQL_EXEC = "on"; }
		if($_ eq "--help") {			$HELP = "on"; }
	} else {
		$filename = $_;
	}
}
#print "DEF_GEN : $DEF_GEN\n";
#print "SQL_GEN : $SQL_GEN\n";
#print "SQL_EXEC : $SQL_EXEC\n";
#print "HELP : $HELP\n";
if($filename eq "" or $HELP eq "on") {
	print "mdef [option] source_file_name\n";
	print "\toptions:\n";
	print "\t--def-nogen\tDon't generate def file. Out to stdout\n";
	print "\t--sql-nogen\tDon't generate sql file.\n";
	print "\t--sql-exec\tDon't exec sql file. Only generate\n";
	print "\t--help \tShow this message.\n";
	exit;
}
print "source file = $filename \n";
open FILE,$filename;
@all = <FILE>;
$n = 0;
$seq = 0;
$this = "\t\$this->";
$thisf = $this."field";
$dbname = "database";
$dbuser = "";
$dbpasswd = "";
$table = "table"; 
$tableTitle = "TABLE";
$mPF = "TT";
$listname = "listCode$mPF";
$cmdHandler = "default_cmd.def";
$defaultPerm = 4;
for(@all) { $max++; }
for($i=0; $i < $max; $i++) {
	$L = @all[$i];
	chomp $L;
	if(substr($L,0,6) eq "dbname") {
		$p = index $L,"=";
		$dbname = substr($L,$p+1);
	} elsif(substr($L,0,6) eq "dbuser") {
		$p = index $L,"=";
		$dbuser = substr($L,$p+1);
	} elsif(substr($L,0,8) eq "dbpasswd") {
		$p = index $L,"=";
		$dbpasswd = substr($L,$p+1);
	} elsif(substr($L,0,5) eq "table") {
		$p = index $L,"=";
		$table = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "deffile") {
		$p = index $L,"=";
		$deffile = substr($L,$p+1);
	} elsif(substr($L,0,5) eq "Title") {
		$p = index $L,"=";
		$tableTitle = substr($L,$p+1);
	} elsif(substr($L,0,3) eq "mPF") {
		$p = index $L,"=";
		$mPF = substr($L,$p+1);
		$listname = "listCode$mPF";
	} elsif(substr($L,0,10) eq "cmdHandler") {
		$p = index $L,"=";
		$cmdHandler = substr($L,$p+1);
	} elsif(substr($L,0,11) eq "defaultPerm") {
		$p = index $L,"=";
		$defaultPerm = substr($L,$p+1);
	} elsif(substr($L,0,4) eq "auth") {
		$AUTH = "on";
		$ssField = "sessid";
		$ssId = "SESSID";
	} elsif(substr($L,0,7) eq "idField") {
		$p = index $L,"=";
		$idField = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "pwField") {
		$p = index $L,"=";
		$pwField = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "xpField") {
		$p = index $L,"=";
		$xpField = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "lvField") {
		$p = index $L,"=";
		$lvField = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "ssField") {
		$p = index $L,"=";
		$ssField = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "ssId") {
		$p = index $L,"=";
		$ssId = substr($L,$p+1);
	} elsif(substr($L,0,9) eq "adminname") {
		$p = index $L,"=";
		$adminname = substr($L,$p+1);
	} elsif(substr($L,0,9) eq "adminpass") {
		$p = index $L,"=";
		$adminpass = substr($L,$p+1);
	} elsif(substr($L,0,7) eq "readkey") {
		$p = index $L,"=";
		$readkey = substr($L,$p+1);
	} elsif(substr($L,0,2) eq "//") {
		$n++;
		$tmp = substr($L,2);
		$p = index($tmp,"%n%");
		if($p > 0) { 
			$seq++;
			$title = substr($tmp,0,$p).$seq.substr($tmp,$p+3);
		} elsif($p==0) {
			$seq++;
			$title = $seq.substr($tmp,$p+3);
		} else {
			$title = $tmp;
		}
		@title[$n] = $thisf."Title[$n] = \"$title\";";
		@name[$n] = $thisf."Name[$n] = \"field$n\";";
		@name_base[$n] = "field$n;";
		@perm[$n] = $thisf."Perm[$n] = \"$defaultPerm\";";
		@width[$n] = $thisf."Width[$n] = \"120\";";
		@sqlname[$n] = "field$n";
	} elsif(substr($L,0,4) eq "text") {
		@type[$n] = $thisf."Type[$n] = \"text\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,8) eq "password") {
		@type[$n] = $thisf."Type[$n] = \"password\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,3) eq "int") {
		@type[$n] = $thisf."Type[$n] = \"int\";";
		@size[$n] = $thisf."Size[$n] = \"8\";";
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,5) eq "float") {
		@type[$n] = $thisf."Type[$n] = \"text\";";
		@size[$n] = $thisf."Size[$n] = \"12\";";
		@sqltype[$n] = "float8";
	} elsif(substr($L,0,4) eq "read") {
		@type[$n] = $thisf."Type[$n] = \"read\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,8) eq "alphabet") {
		@type[$n] = $thisf."Type[$n] = \"alphabet\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,3) eq "tel") {
		@type[$n] = $thisf."Type[$n] = \"tel\";";
		@size[$n] = $thisf."Size[$n] = \"20\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,5) eq "email") {
		@type[$n] = $thisf."Type[$n] = \"email\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,3) eq "url") {
		@type[$n] = $thisf."Type[$n] = \"url\";";
		@size[$n] = $thisf."Size[$n] = \"30\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,4) eq "date") {
		@type[$n] = $thisf."Type[$n] = \"date\";";
		@default[$n] = $thisf."Default[$n] = \"now\";";
		@sqltype[$n] = "timestamp";
	} elsif(substr($L,0,4) eq "time") {
		@type[$n] = $thisf."Type[$n] = \"time\";";
		@default[$n] = $thisf."Default[$n] = \"00:00\";";
		@sqltype[$n] = "time";
	} elsif(substr($L,0,7) eq "sec=yes") {
		@sec[$n] = $thisf."Sec[$n] = \"yes\";";
	} elsif(substr($L,0,7) eq "txtarea") {
		@type[$n] = $thisf."Type[$n] = \"textarea\";";
		@size[$n] = $thisf."Size[$n] = \"30:2\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,6) eq "select") {
		@type[$n] = $thisf."Type[$n] = \"select\";";
		$p = index $L,"=";
		if($p > -1) {
			$choice = substr($L,$p+1); 
		} else {
			$choice = "";
		}
		@clist[$n] = makelist($choice);
		if(@pl[$choice] ne "") {
			@choice_pl[$n] = $thisf."Choice_pl[$n] = \"@pl[$choice]\";";
		}
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,7) eq "mselect") {
		@type[$n] = $thisf."Type[$n] = \"mselect\";";
		$p = index $L,"=";
		if($p > -1) {
			$choice = substr($L,$p+1); 
		} else {
			$choice = "";
		}
		@clist[$n] = makelist($choice);
		@cols[$n] = $thisf."Cols[$n] = \"2\";";
		@sqltype[$n] = "text";
	} elsif(substr($L,0,7) eq "summary") {
		$p = index $L,"=";
		if($p > -1) {
			$scale = substr($L,$p+1); 
		} else {
			$scale = "";
		}
		@slist[$n] = makescale($scale);
	} elsif(substr($L,0,5) eq "type=") {
		$p = index $L,"=";
		$type_name = substr($L,$p+1); 
		@type[$n] = $thisf."Type[$n] = \"$type_name\";";
		@type_options[$n] = makeoptions();
	} elsif(substr($L,0,5) eq "radio") {
		@type[$n] = $thisf."Type[$n] = \"radio\";";
		@clist[$n] = makelist();
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,8) eq "checkbox") {
		@type[$n] = $thisf."Type[$n] = \"checkbox\";";
		@default[$n] = $thisf."Default[$n] = \"1\"";
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,6) eq "entuid") {
		@type[$n] = $thisf."Type[$n] = \"entuid\";";
		@rfield[$n] = $thisf."ReferField[$n] = \"email\";";
		$entuid = @name_base[$n] ;
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,5) eq "level") {
		@type[$n] = $thisf."Type[$n] = \"select\";";
		@choice[$n] = $thisf."Choice[$n] = \"userLevel\";";
		@default[$n] = $thisf."Default[$n] = \"3\";";
		@perm[$n] = $thisf."Perm[$n] = \"1\";";
		@sqltype[$n] = "int4";
	} elsif(substr($L,0,4) eq "name") {
		$p = index $L,"=";
		$tmp = substr($L,$p+1);
		$p = index($tmp,"%n%");
		if($p > 0) { 
			$name = lc(substr($tmp,0,$p).$seq.substr($tmp,$p+3));
		} elsif($p==0) {
			$name = lc($seq.substr($tmp,$p+3));
		} else {
			$name = lc($tmp);
		}
		@sqlname[$n] = @name_base[$n] = $name;
		@name[$n] = $thisf."Name[$n] = \"$name\";";
	} elsif(substr($L,0,4) eq "perm") {
		$p = index $L,"=";
		$perm = substr($L,$p+1);
		@perm[$n] = $thisf."Perm[$n] = \"$perm\";";
	} elsif(substr($L,0,4) eq "size") {
		$p = index $L,"=";
		$size = substr($L,$p+1);
		@size[$n] = $thisf."Size[$n] = \"$size\";";
	} elsif(substr($L,0,6) eq "custom") {
		$p = index $L,"=";
		$custom = substr($L,$p+1);
		@custom[$n] = $thisf."Custom[$n] = \"$custom\";";
	} elsif(substr($L,0,6) eq "printf") {
		$p = index $L,"=";
		$printf = substr($L,$p+1);
		@printf[$n] = $thisf."Printf[$n] = \"$printf\";";
	} elsif(substr($L,0,6) eq "choice") {
		$p = index $L,"=";
		$choice = substr($L,$p+1);
		@choice[$n] = $thisf."Choice[$n] = \"$choice\";";
	} elsif(substr($L,0,8) eq "onchange") {
		$p = index $L,"=";
		$onchange = substr($L,$p+1);
		@onchange[$n] = $thisf."Onchange[$n] = \"$onchange\";";
	} elsif(substr($L,0,4) eq "cols") {
		$p = index $L,"=";
		$cols = substr($L,$p+1);
		@cols[$n] = $thisf."Cols[$n] = \"$cols\";";
	} elsif(substr($L,0,7) eq "default") {
		$p = index $L,"=";
		$default = substr($L,$p+1);
		@default[$n] = $thisf."Default[$n] = \"$default\";";
	} elsif(substr($L,0,7) eq "postfix") {
		$p = index $L,"=";
		$postfix = substr($L,$p+1);
		@postfix[$n] = $thisf."Postfix[$n] = \"$postfix\";";
	} elsif(substr($L,0,5) eq "width") {
		$p = index $L,"=";
		$width = substr($L,$p+1);
		@width[$n] = $thisf."Width[$n] = \"$width\";";
	} elsif(substr($L,0,5) eq "alias") {
		$p = index $L,"=";
		$alias = substr($L,$p+1);
		@alias[$n] = $thisf."Alias[$n] = \"$alias\";";
	} elsif(substr($L,0,9) eq "sortalias") {
		$p = index $L,"=";
		$sortalias = substr($L,$p+1);
		@sortalias[$n] = $thisf."SortAlias[$n] = \"$sortalias\";";
	} elsif(substr($L,0,10) eq "referfield") {
		$p = index $L,"=";
		$rfield = substr($L,$p+1);
		@rfield[$n] = $thisf."ReferField[$n] = \"$rfield\";";
	} elsif(substr($L,0,6) eq "subdir") {
		$p = index $L,"=";
		$subdir = substr($L,$p+1);
		@subdir[$n] = $thisf."Subdir[$n] = \"$subdir\";";
	} elsif(substr($L,0,10) eq "refertable") {
		$p = index $L,"=";
		$rtable = substr($L,$p+1);
		@rtable[$n] = $thisf."ReferTable[$n] = \"$rtable\";";
	} elsif(substr($L,0,4) eq "omit") {
		$p = index $L,"=";
		$omit = substr($L,$p+1);
		@omit[$n] = $thisf."Omit[$n] = \"$omit\";";
	} elsif(substr($L,0,4) eq "must") {
		@must[$n] = $thisf."Must[$n] = \"yes\";";
	} elsif(substr($L,0,4) eq "uniq") {
		@must[$n] = $thisf."Uniq[$n] = \"yes\";";
	} elsif(substr($L,0,6) eq "hidden") {
		@hidden[$n] = $thisf."Hidden[$n] = \"yes\";";
	} elsif(substr($L,0,10) eq "searchlink") {
		@searchlink[$n] = $thisf."SearchLink[$n] = \"yes\";";
	} elsif(substr($L,0,8) eq "external") {
		@external[$n] = $thisf."External[$n] = \"yes\";";
	}
}
if($AUTH eq "on") {
	for($i=1; $i<=$n; $i++) {
		$p = rindex(@name[$i]," ");
		$tmp = substr(@name[$i],$p+2);
		$tmp = substr($tmp,0,length($tmp)-2);
		if($tmp eq $idField) {
			$idFieldNo = $i;
		} elsif($tmp eq $pwField) {
			$pwFieldNo = $i;
		} elsif($tmp eq $xpField) {
			$xpFieldNo = $i;
		}
	}
}
if($readkey ne "") {
	for($i=1; $i<=$n; $i++) {
		$p = rindex(@name[$i]," ");
		$tmp = substr(@name[$i],$p+2);
		$tmp = substr($tmp,0,length($tmp)-2);
		if($tmp eq $readkey) {
			$readkeyNo = $i;
		}
	}
}

if($DEF_GEN eq "on") {
	if($deffile eq "") { $deffile = $table; }
	print "def file = $DEF_PATH/$deffile.def\n";
	open DEF,">$DEF_PATH/$deffile.def";
} else {
	print "don't generate def file\n";
	open DEF, ">-";
}
print DEF "<?\n";
print DEF $this."dbname = \"$dbname\";\n";
print DEF $this."dbuser = \"$dbuser\";\n";
print DEF $this."dbpasswd = \"$dbpasswd\";\n";
print DEF $this."table = \"$table\";\n"; 
print DEF $this."tableTitle = \"$tableTitle\";\n";
print DEF $this."mPF = \"$mPF\";\n";
print DEF $this."cmdHandler = \"$cmdHandler\";\n";
if($entuid ne "") { 
	print DEF $this."entuid = \"$entuid\";\n"; }
if($readkey ne "") { 
	print DEF $this."ReadKey = \"$readkeyNo\";\n"; }
if($AUTH eq "on") {
	print DEF "// for user auth\n";
	print DEF $this."idFieldNo = \"$idFieldNo\";\n";
	print DEF $this."pwFieldNo = \"$pwFieldNo\";\n";
	print DEF $this."xpFieldNo = \"$xpFieldNo\";\n";
	print DEF $this."levelF = \"$lvField\";\n";
	print DEF $this."sessidF = \"$ssField\";\n";
	print DEF $this."SESSID = \"$ssId\";\n";
}
print DEF "\t//\n";
for($i=1; $i<=$n; $i++) {
	if(@clist[$i] ne "") { print DEF @clist[$i]."\n"; }
	if(@plist[$i] ne "") { print DEF @plist[$i]."\n"; }
	if(@slist[$i] ne "") { print DEF @slist[$i]."\n"; }
	print DEF @title[$i]."\n";
	print DEF @name[$i]."\n";
	print DEF @type[$i]."\n";
	if(@type_options[$i] ne "") { print DEF @type_options[$i]."\n"; }
	if(@size[$i] ne "") { print DEF @size[$i]."\n"; }
	if(@custom[$i] ne "") { print DEF @custom[$i]."\n"; }
	if(@printf[$i] ne "") { print DEF @printf[$i]."\n"; }
	if(@choice[$i] ne "") { print DEF @choice[$i]."\n"; }
	if(@choice_pl[$i] ne "") { print DEF @choice_pl[$i]."\n"; }
	if(@scale[$i] ne "") { print DEF @scale[$i]."\n"; }
	if(@onchange[$i] ne "") { print DEF @onchange[$i]."\n"; }
	if(@cols[$i] ne "") { print DEF @cols[$i]."\n"; }
	if(@default[$i] ne "") { print DEF @default[$i]."\n"; }
	if(@postfix[$i] ne "") { print DEF @postfix[$i]."\n"; }
	if(@width[$i] ne "") { print DEF @width[$i]."\n"; }
	if(@omit[$i] ne "") { print DEF @omit[$i]."\n"; }
	if(@must[$i] ne "") { print DEF @must[$i]."\n"; }
	if(@uniq[$i] ne "") { print DEF @uniq[$i]."\n"; }
	if(@hidden[$i] ne "") { print DEF @hidden[$i]."\n"; }
	if(@searchlink[$i] ne "") { print DEF @searchlink[$i]."\n"; }
	if(@external[$i] ne "") { print DEF @external[$i]."\n"; }
	if(@alias[$i] ne "") { print DEF @alias[$i]."\n"; }
	if(@sortalias[$i] ne "") { print DEF @sortalias[$i]."\n"; }
	if(@sec[$i] ne "") { print DEF @sec[$i]."\n"; }
	if(@rfield[$i] ne "") { print DEF @rfield[$i]."\n"; }
	if(@subdir[$i] ne "") { print DEF @subdir[$i]."\n"; }
	if(@rtable[$i] ne "") { print DEF @rtable[$i]."\n"; }
	print DEF @perm[$i]."\n";
	print DEF "\t//\n";
	if(@name_base[$i] ne "oid") { $sqlfields .= "\t".@sqlname[$i]." ".@sqltype[$i].",\n"; }
}
print DEF "?>\n";
close DEF;
if($DEF_GEN eq "on") { print "generate def complete\n"; }
#
# Generate SQL
#
if($SQL_GEN eq "on") {
	if($AUTH eq "on") {
		$sqlfields .= "\t$ssField text\n";
	} else {
		$sqlfields = substr($sqlfields,0,length($sqlfields)-2)."\n";
	}
	$tmp = "drop table $table;\n";
	$tmp .= "drop sequence $table"."_id_seq;\n";
	$tmp .= "create table $table(\n";
	$tmp .= "\t"."id serial,\n";
	$tmp .= $sqlfields;
	$tmp .= ");\n";
	$tmp .="grant all on $table to public;\n";
	$tmp .= "grant all on $table"."_id_seq to public;\n";
	if($adminname ne "" and $adminpass ne "") {
		$passwd = md5_hex($adminpass);
		$tmp .= "insert into $table\n";
		$tmp .= "\t($idField,$pwField,$lvField)\n";
		$tmp .= "\tvalues('$adminname','$passwd',0);\n";
	}
	print "sql file = $SQL_PATH/$table.sql\n";
	open SQL,">$SQL_PATH/$table.sql";
	print SQL $tmp;
	close SQL;
	print "generate sql complete\n";
} else {
	print "don't generate sql\n";
}
if($SQL_EXEC eq "on") {
	print "psql -f$SQL_PATH/$table.sql $dbname\n";
	$rtn = system("psql","-f$SQL_PATH/$table.sql","$dbname");
	print "psql return = $rtn\n";
} else {
	print "don't exec sql\n";
}
print "mdef complete\n";
exit;
#
# make list for select or mselect
#
sub makelist{
	if(@_[0] ne "") {
		$choice_list = @_[0];
	} else {
		$choice_list = "$listname$n";
	}
	$clist = "\t\$GLOBALS[\"$choice_list\"] = array(1=>";
	$i++;
	$cnt = 0;
	$point_list = "";
	$choice_list_pl = $choice_list."_pl";
	while(substr(@all[$i],0,3) ne "end") {
		#$clist .= "\"".substr(@all[$i],0,length(@all[$i])-1)."\",";
		$tmp = substr(@all[$i],0,length(@all[$i])-1);
		$p = index $tmp,"\@:";
		if($p>0) {
			$word = substr($tmp,0,$p);
			$point = substr($tmp,$p+2);
			$point_list .= "\"".$point."\",";
		} else {
			$word = $tmp;
		}
		$clist .= "\"$word\",";
		$cnt++;
		$i++;
	}
	if($cnt != 0) {
		$clist = substr($clist,0,length($clist)-1).");";
		@choice[$n] = $thisf."Choice[$n] = \"$choice_list\";";
		if($point_list ne "") {
			$phead = "\t\$GLOBALS[\"$choice_list_pl\"] = array(1=>";
			$plist[$n] = $phead.substr($point_list,0,length($point_list)-1).");";
			@choice_pl[$n] = $thisf."Choice_pl[$n] = \"$choice_list_pl\";";
			@pl[$choice_list] = $choice_list_pl;
		}
	} else {
		$clist = "";
	}
	return $clist;
}
#
# make sumary scale
#
sub makescale{
	if(@_[0] ne "") {
		$scale_list = @_[0];
	} else {
		$scale_list = "$listname$n";
	}
	$slist = "\t\$GLOBALS[\"$scale_list\"] = array(1=>";
	$i++;
	$cnt = 0;
	while(substr(@all[$i],0,3) ne "end") {
		$slist .= "\"".substr(@all[$i],0,length(@all[$i])-1)."\",";
		$cnt++;
		$i++;
	}
	if($cnt != 0) {
		$slist = substr($slist,0,length($slist)-1).");";
		@scale[$n] = $thisf."Scale[$n] = \"$scale_list\";";
	} else {
		$slist = "";
	}
	return $slist;
}
#
# make type options
#
sub makeoptions{
	$i++;
	$fieldProp = "";
	while(substr(@all[$i],0,3) ne "end") {
		$L = @all[$i];
		chomp $L;
		$p = index $L,"=";
		$PropName = substr($L,0,$p);
		$PropData = substr($L,$p+1);
		if($PropName eq "sqltype") {
			@sqltype[$n] = $PropData;
		} else {
			$fieldProp .= $thisf.$PropName."[$n] = \"$PropData\";\n";
		}
		$i++;
	}
	return $fieldProp;
}

