#!/usr/bin/perl package Sdbm; my($SDBM_VERSION) = "3.0"; my($DSWITCH) = 1; my(@DATABASE) = undef; my(@FTYPE) = undef; my(@FNAME) = undef; my(@FTEXT) = undef; my(@FOPTION) = undef; my($TOTAL_ROWS) = undef; my($TOTAL_FIELDS) = undef; my($MEMO_DIR) = "./memo/"; my($BIN_DIR) = "./binary/"; my($PTR) = &GET_SCRIPT_PATH_TRANSLATED; my($_D_S_) = "²·°˜÷"; my($DELETED_LOG) = "./logs/deleted.txt"; ########################################################################################### ########################################################################################### BEGIN { use Exporter(); @ISA = qw(Exporter); @EXPORT = qw ( @FNAME @FTYPE @FOPTION @FTEXT @DATABASE $DATABASE_FILENAME $FSEPARATOR $DSEPARATOR $MEMO_DIR &SELECT &INSERT &DELETE &UPDATE $DSWITCH $SDBM_VERSION &GET_FTEXT &GET_FTYPE &GET_TOTALRECORDS &SORTBY &GET_SORTBY &GET_JUMPID &GET_IDFTYPE &CONVERT_DATE &GET_FNAMES &SORTBY_FORCED ); @EXPORT_OK = qw(); } ########################################################################################### sub GET_PROCESSED_DATA { my($columnid) = $_[0]; my($data) = $_[1]; my($d_type) = $FTYPE[$columnid]; my($memofilename) = undef; my($temp) = undef; my($returndata) = undef; my($savefilename) = undef; my($deletefilename) = undef; my($ltemp,$rtemp) = undef; if ($d_type eq "DATE") { if ($data =~ m/NOW/ig) { $returndata = time; } else { $returndata = $data; }; }; if ($d_type eq "WEBLINK") { if ($data) { $returndata = "WEBLINK"; }; }; if ($returndata) {return $returndata} else {return $data}; }; ########################################################################################### sub GET_JUMPID { my($jstart) = $_[0]; my($sfield) = $_[1]; my(@SELECTED) = undef; my($TEMP) = undef; #$DSWITCH = 1; #&CHECK_DSWITCH; my($sql) = "ID where $sfield LIKE "."^"."$jstart"."*"; @SELECTED = SELECT("$sql","1","1"); my($count) = undef; foreach (@SELECTED) { $r_line = $_; if ($$r_line[0]) {$TEMP[$count] = $$r_line[0]; last}; $count++; }; return $TEMP[0]; }; sub GET_SORTBY { my($sortby) = undef; my($sortbyfile) = "sortby"; my(@RAW) = undef; my(@RETURN) = undef; my($temp) = undef; my($count) = undef; if (-e $sortbyfile) {@RAW = READ_FILE("$sortbyfile")}; foreach (@RAW) { $temp = $_; if ($temp) {$temp = CLEAN_LINE($temp); $RETURN[$count] = $temp; $count++}; }; return @RETURN; }; sub GET_FTEXT { my($fname) = $_[0]; my($ftext) = undef; my($found) = 0; my($count) = undef; while ($count < @FNAME) { if ($fname eq $FNAME[$count]) {$ftext = $FTEXT[$count]; $found=1; last}; $count++; }; return $ftext; }; sub GET_FID { my($fname) = $_[0]; my($fid) = undef; my($found) = 0; my($count) = undef; while ($count < @FNAME) { if ($fname eq $FNAME[$count]) {$fid = $count; $found=1; last}; $count++; }; return $fid; }; sub GET_TOTALRECORDS { my($total) = undef; $total = @DATABASE; return $total; }; sub GET_IDFTYPE { my($fid) = $_[0]; my($ftype) = undef; my($found) = 0; my($count) = undef; return $FTYPE[$fid]; }; sub GET_FTYPE { my($fname) = $_[0]; my($fource) = $_[1]; my($ftype) = undef; my($found) = 0; my($count) = undef; if ($fource) {READ_DATABASE($DATABASE_FILENAME,$FSEPARATOR,$DSEPARATOR)}; while ($count < @FNAME) { if ($fname eq $FNAME[$count]) {$ftype = $FTYPE[$count]; $found=1; last}; $count++; }; return $ftype; }; sub GET_FNAMES { my($fource) = $_[1]; my($ftype) = undef; my($found) = 0; my($count) = undef; if ($fource) {READ_DATABASE($DATABASE_FILENAME,$FSEPARATOR,$DSEPARATOR)} else {&CHECK_DSWITCH}; return @FNAME; }; ########################################################################################### ########################################################################################### sub UPDATE { my($sql) = $_[0]; $sql = TODB($sql); my(@update) = @_[1..@_-1]; my(@UPDATE_ID) = undef; my($rcount,$fcount) = undef; &CHECK_DSWITCH; my($sqlprobe) = "ID "."$sql"; my(@COLUMN) = undef; my(@LINE) = undef; my($r_line) = undef; my($count) = undef; my($delfilename,$memofilename,$binfilename) = undef; #print "
UPDATE: $sqlprobe\n
"; $uline = ":"; @COLUMN = SELECT("$sqlprobe"); #print "UPDATE: \@COLUMN = @COLUMN\n
"; $count=0; foreach (@COLUMN) { $r_line = $_; @LINE = @$r_line; $UPDATE_ID[$count] = $LINE[0]; if ($UPDATE_ID[$count]) {$uline = "$uline"."$UPDATE_ID[$count]".":";}; $count++; }; #print "
UPDATE: UPDATING: @UPDATE_ID\n\$uline = $uline\n
"; $count = 0; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { if ($uline =~ m/:$DATABASE[$rcount][0]:/) { # print "UPDATE: Updating: $DATABASE[$rcount][0] - $DATABASE[$rcount][1] - $DATABASE[$rcount][2]\n"; # $DATABASE[$rcount][0] = ""; foreach (@update) { ($fid, $data) = split(/=/,$_); $fid = CLEAN_LINE($fid); $data = CLEAN_ENDS($data); $columnid = GET_COLUMNID($fid); # print "UPDATE: UPDATING FIELD: $fid DATA: $data\n\$columnid = $columnid\n"; if ($columnid > 0) { if (PROCESS_DATA_TYPE($columnid,$data)) { # PROCESS MEMO FIELD if ($FTYPE[$columnid] eq "MEMO") { if ($data) { $memofilename = $DATABASE[$rcount][$columnid]; $delfilename = "$MEMO_DIR"."$memofilename"; # print "Unlinking Memo $data = $delfilename ?
"; if ((-e $delfilename) && ($memofilename) ) { unlink "$delfilename"; SAVE_REPORT("$DELETED_LOG","$delfilename"," - ",time," - ",scalar localtime(time),"\n"); }; }; }; if ($FTYPE[$columnid] eq "DATE") { if ($FOPTION[$columnid] =~ m/CONSTANT/gi) { $data = $DATABASE[$rcount][$columnid]; }; }; if ($FTYPE[$columnid] eq "DATABASE") { $data = $DATABASE[$rcount][$columnid]; }; if ($FTYPE[$columnid] eq "BINARY") { if ($data) { $binfilename = $DATABASE[$rcount][$columnid]; $delbinfilename = "$BIN_DIR"."$binfilename"; if ((-e $delbinfilename) && ($binfilename ) ) { unlink "$delbinfilename"; SAVE_REPORT("$DELETED_LOG","$delbinfilename"," - ",time," - ",scalar localtime(time),"\n"); }; }; }; $data = GET_PROCESSED_DATA($columnid,$data); if ($data) {$DATABASE[$rcount][$columnid] = $data}; }; }; }; }; $rcount++; }; if ($ERROR_MESSAGE) { # print "$ERROR_MESSAGE"; return 0; } else { &REPUBLISH_DATABASE; return 1; }; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub DELETE { my($sql) = $_[0]; $sql = TODB($sql); my(@DELETE_ID) = undef; my($rcount,$fcount) = undef; &CHECK_DSWITCH; my($sqlprobe) = "ID "."$sql"; my(@COLUMN) = undef; my(@LINE) = undef; my($r_line) = undef; my($delfilename,$memofilename,$binfilename) = undef; #print "DELETE: $sqlprobe\n"; $dline = ":"; @COLUMN = SELECT("$sqlprobe"); #print "DELETE: \@COLUMN = @COLUMN"; $count=0; foreach (@COLUMN) { $r_line = $_; @LINE = @$r_line; $DELETE_ID[$count] = $LINE[0]; $dline = "$dline"."$LINE[0]".":"; $count++; }; #print "DELETE: DELETING: @DELETE_ID\n\$dline = $dline\n"; $count = 0; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { if ($dline =~ m/:$DATABASE[$rcount][0]:/) { # print "DELETE: Deliting: $DATABASE[$rcount][0] - $DATABASE[$rcount][1] - $DATABASE[$rcount][2]\n"; $DATABASE[$rcount][0] = ""; $fcount = 0; foreach (@FTYPE) { $temp = undef; $temp = $_; if ($temp eq "MEMO") { $memofilename = $DATABASE[$rcount][$fcount]; $delfilename = "$MEMO_DIR"."$memofilename"; if ((-e $delfilename) && ($memofilename) ) { unlink "$delfilename"; SAVE_REPORT("$DELETED_LOG","$delfilename"," - ",time," - ",scalar localtime(time),"\n"); }; }; # CREATE DELETE DATABASE PROCEDURE! if ($temp eq "DATABASE") { $dbfilename = $DATABASE[$rcount][$fcount]; $dbfilename = "$PTR"."database/"."$dbfilename"; #HANDLING WIN32 ENVIRONMENT: if ($^O =~ m/Win32/i) { $dbfilename =~ s!/!\\!g; $command = "RD /S /Q \"$dbfilename\""; # print "COMMAND: $command
"; system("$command"); } else { #print "removing $dbfilename
"; system("rm -r -f $dbfilename"); }; SAVE_REPORT("$DELETED_LOG","DATABASE: $dbfilename"," - ",time,"-",scalar localtime(time),"\n"); }; if ($temp eq "BINARY") { $binfilename = $DATABASE[$rcount][$fcount]; $delbinfilename = "$PTR"."binary/"."$binfilename"; $delbininfofilename = "$PTR"."binary/"."_"."$binfilename"; # print "DELETING: $delbinfilename\n
"; if ((-e $delbinfilename) && ($binfilename ) ) { unlink "$delbinfilename"; unlink "$delbininfofilename"; # print "DELETING: $delbinfilename\n
"; SAVE_REPORT("$DELETED_LOG","$delbinfilename"," - ",time," - ",scalar localtime(time),"\n"); }; }; $fcount++; }; }; $rcount++; }; &REPUBLISH_DATABASE; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub INSERT { @add=@_; &CHECK_DSWITCH; my($id,$fid,$data) = undef; $id = &GET_UNUSED_ID; # print "ADD: UNUSED ID: $id\n
"; $newposition = $#DATABASE+2; $DATABASE[$newposition][0] = "$id"; foreach (@add) { ($fid, @adddata) = split(/=/); $data = join("=",@adddata); $fid = CLEAN_LINE($fid); if ($fid eq "ID") {next}; $data = CLEAN_ENDS($data); # print "INSERT: ADDING to FIELD: $fid DATA: $data\n
"; # sleep(2); $columnid = GET_COLUMNID($fid); # identify the type of a column if (PROCESS_DATA_TYPE($columnid,$data)) { $data = GET_PROCESSED_DATA($columnid,$data); $DATABASE[$newposition][$columnid] = $data; }; }; if ($ERROR_MESSAGE) { print "$ERROR_MESSAGE"; return 0; } else { &REPUBLISH_DATABASE; return 1; }; }; ########################################################################################### ########################################################################################### ########################################################################################### sub PROCESS_DATA_TYPE { my($columnid) = $_[0]; my($data) = $_[1]; my($d_type) = $FTYPE[$columnid]; my($rcount) = undef; my($check) = 1; my($returnvalue) = 1; if (($d_type =~ m/INDEX/i) && ($check)) { # print "PROCESS_DATA_TYPE: Checking id $data is an INDEX\n"; if (CHECK_INDEX($columnid,$data)) {$returnvalue = 1} else {$returnvalue= 0;$ERROR_MESSAGE = $ERROR_MESSAGE."Error: FIELD:$FNAME[$columnid]=\"$data\" is not a unique value.
\n";}; $check = 0; }; if (($d_type =~ m/NUMBER/i) && ($check)) { # print "PROCESS_DATA_TYPE: Checking id $data is a NUMBER\n"; if ($data =~ /^\d+$/) {$returnvalue = 1; } else {$returnvalue = 0;$ERROR_MESSAGE = $ERROR_MESSAGE."Error: FIELD:$FNAME[$columnid]=\"$data\" is not a digit value.
\n";}; $check = 0; }; return $returnvalue; }; ########################################################################################### ########################################################################################### sub CHECK_INDEX { my($columnid) = $_[0]; my($data) = $_[1]; my($rcount) = undef; my($returnvalue) = 1; $rcount = 1; while ($rcount < $#DATABASE) { if ($data eq $DATABASE[$rcount][$columnid]) {$returnvalue = 0;}; $rcount++; }; return $returnvalue; }; ########################################################################################### sub ADD_TO_DATABASE { my($count) = undef; my($fcount) = undef; my($position) = $_[0]; my($LINE) = undef; my($fline) = undef; $count = 0; while ($count < @FNAME) { $LINE = "$LINE"."$DATABASE[$position][$count]"."$DSEPARATOR"; $count++; }; $LINE = "$LINE"."\n"; # print "ADD_TO_DATABASE: \$LINE = $LINE"; SAVE_REPORT("$DATABASE_FILENAME",$LINE); }; ########################################################################################### sub REPUBLISH_DATABASE { my($count) = undef; my($fcount) = undef; my(@LINE) = undef; my($fline) = undef; $count = 0; foreach (@FNAME) { $temp[$count] = "$FTYPE[$count]"."$DSEPARATOR"."$FNAME[$count]"."$DSEPARATOR"."$FOPTION[$count]"."$DSEPARATOR"."$FTEXT[$count]"; $count++; }; $LINE[0] = join "$FSEPARATOR", @temp; $LINE[0] = "$LINE[0]"."\n"; $count = 1; foreach (@DATABASE) { if (@$_[0]) { $TEMP = undef; $TEMP = join ("$DSEPARATOR", @$_[1..@$_-1]); $TEMP = "$count"."$DSEPARATOR".$TEMP; push(@LINE,("$TEMP"."\n")); $count++; }; }; SAVE_FILE("$DATABASE_FILENAME",@LINE); @LINE = undef; }; ########################################################################################### ########################################################################################### sub SORTBY { &CHECK_DSWITCH; my($count) = undef; my(@TEMP) = undef; my(@LINE) = undef; my($sfield) = $_[0]; $sortfield = GET_FID($sfield); my($order) = 1; my(@RAW) = undef; @RAW = GET_SORTBY; if ($sfield eq $RAW[0]) { $order = $RAW[1]; if ($order > 0) {$order = 0} else {$order = 1}; }; SAVE_FILE("sortby","$sfield\n","$order"); if ($sortfield) { my(%SORTHASH) = undef; $count = @DATABASE; # SAVE_REPORT("report.txt","$count\n"); $count = 1; foreach (@DATABASE) { $SORTHASH{@$_[0]} = @$_[$sortfield]; }; if ($order > 0) { @LINE = sort { $SORTHASH{$a} <=> $SORTHASH{$b} || $SORTHASH{$a} cmp $SORTHASH{$b} || $a <=> $b } keys %SORTHASH; } else { @LINE = sort { $SORTHASH{$b} <=> $SORTHASH{$a} || $SORTHASH{$b} cmp $SORTHASH{$a} || $b <=> $a } keys %SORTHASH; }; $count = 1; $rcount = 1; foreach (@LINE) { if ($_) { $checkline = $_; $rcount = 1; # SAVE_REPORT("sorted1.txt","line : $checkline\n"); $TEMP[$count][0] = $checkline; while ($rcount < @FNAME) { # SAVE_REPORT("sorted1.txt","row: $rcount DATA: $DATABASE[$checkline][$rcount]\n"); $TEMP[$count][$rcount] = $DATABASE[$checkline][$rcount]; $rcount++; }; $count++; }; }; @DATABASE = @TEMP; @LINE = undef; @TEMP = undef; $count = undef; &REPUBLISH_DATABASE; }; }; ########################################################################################### ########################################################################################### sub SORTBY_FORCED { &CHECK_DSWITCH; my($count) = undef; my(@TEMP) = undef; my(@LINE) = undef; my($sfield) = $_[0]; my($order) = $_[1]; $sortfield = GET_FID($sfield); my(@RAW) = undef; if ($sortfield) { my(%SORTHASH) = undef; $count = @DATABASE; # SAVE_REPORT("report.txt","$count\n"); $count = 1; foreach (@DATABASE) { $SORTHASH{@$_[0]} = @$_[$sortfield]; }; if ($order > 0) { @LINE = sort { $SORTHASH{$a} <=> $SORTHASH{$b} || $SORTHASH{$a} cmp $SORTHASH{$b} || $a <=> $b } keys %SORTHASH; } else { @LINE = sort { $SORTHASH{$b} <=> $SORTHASH{$a} || $SORTHASH{$b} cmp $SORTHASH{$a} || $b <=> $a } keys %SORTHASH; }; $count = 1; $rcount = 1; foreach (@LINE) { if ($_) { $checkline = $_; $rcount = 1; # SAVE_REPORT("sorted1.txt","line : $checkline\n"); $TEMP[$count][0] = $checkline; while ($rcount < @FNAME) { # SAVE_REPORT("sorted1.txt","row: $rcount DATA: $DATABASE[$checkline][$rcount]\n"); $TEMP[$count][$rcount] = $DATABASE[$checkline][$rcount]; $rcount++; }; $count++; }; }; @DATABASE = @TEMP; @LINE = undef; @TEMP = undef; $count = undef; &REPUBLISH_DATABASE; }; }; ########################################################################################### ########################################################################################### sub GET_UNUSED_ID { my($rcount) = undef; my($fcount) = undef; my($freeid) = undef; my($found) = 0; $freeid = $#DATABASE+1; $found = 1; $rcount = 1; while ($rcount <= $#DATABASE) { # print "GET_UNUSED_ID:checking if: \$DATABASE[$rcount][0]=$DATABASE[$rcount][0]\n"; if ($DATABASE[$rcount][0]== $freeid) { # print "GET_UNUSED_ID: \$DATABASE[$rcount][0]=$DATABASE[$rcount][0]\n"; $found = 0; }; $rcount++; }; unless ($found) { while (!$found) { $freeid++; $found = 1; $rcount = 1; while ($rcount <= $#DATABASE) { # print "GET_UNUSED_ID:checking if: \$DATABASE[$rcount][0]=$DATABASE[$rcount][0]\n"; if ($DATABASE[$rcount][0]== $freeid) { # print "GET_UNUSED_ID: \$DATABASE[$rcount][0]=$DATABASE[$rcount][0]\n"; $found = 0; }; $rcount++; }; }; if ($freeid == ($#DATABASE+1)) { SAVE_FILE("c_trigger")}; } else { # print "GET_UNUSED_ID: Skipped long process :)\n"; }; #print "GET_UNUSED_ID: \$freeid = $freeid\n"; #sleep(2); return $freeid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub RETURN_COLUMN { my($rcount,$fcount) = undef; my($columnid) = $_[0]; my($totalrecords) = undef; my(@column) = undef; &CHECK_DSWITCH; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { $column[$rcount] = $DATABASE[$rcount][$columnid]; $rcount++; }; return @column; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub SELECT { my($sql) = $_[0]; $sql = TODB($sql); my($readforce) = $_[1]; my($exact) = $_[2]; my($rcount,$fcount) = undef; my($fieldid,$condition,$cond_count) = undef; my($returnfieldcount) = undef; my($columnid) = undef; my(@ID,@RETURN,@IDLIST,@TEMP,@REF_IDLIST) = undef; my($returnfieldcount,$returnfieldcount,$idlistcount,$fname) = undef; my(@MATRIX) = undef; $sql = UPPER_CASE($sql); my(@cond_list) = undef; ($fieldid,$condition) = split(/WHERE/,$sql); $fieldid =~ s/\s+//g; #print "SELECT: \$DSWITCH = $DSWITCH $FSEPARATOR - $DSEPARATOR\n"; unless ($readforce) {&CHECK_DSWITCH} else {READ_DATABASE($DATABASE_FILENAME,$FSEPARATOR,$DSEPARATOR)}; $columnid = GET_COLUMNID($fieldid); # Processing AND conditions; if ($condition =~ m/\s+AND\s+/i) { @cond_list = split(/AND/,$condition); # print "SELECT: \$condition contains AND\n"; foreach (@cond_list) { $cond_line = CLEAN_ENDS($_); # print "SELECT: \$cond_line = $cond_line\n"; unless ($cond_count) { @REF_IDLIST = GET_IDLIST($cond_line); # print "SELECT: \@REF_IDLIST[$cond_count] = @REF_IDLIST\n"; } else { $TEMPLINE = join(":",GET_IDLIST($cond_line)); $TEMP[$cond_count] = ":"."$TEMPLINE".":"; # print "SELECT: \$TEMP[$cond_count] = $TEMP[$cond_count]\n"; }; $cond_count++; # sleep(1); }; $count =1; $id_count = 0; @IDLIST = undef; while ($count < @TEMP) { foreach (@REF_IDLIST) { $refline = CLEAN_ENDS($_); if ($TEMP[$count] =~ m/:$refline:/i) { $IDLIST[$id_count] = $refline; $id_count++; }; }; @REF_IDLIST = @IDLIST; # print "SELECT: \@IDLIST = @IDLIST :\n \@REF_IDLIST=@REF_IDLIST\n"; # sleep(1); $id_count = 0; @IDLIST = undef; $count++; }; @IDLIST = @REF_IDLIST; } else { @IDLIST = GET_IDLIST($condition,$exact); }; # @IDLIST = GET_IDLIST($condition,$exact); $temp = @IDLIST; # print "SELECT: \@IDLIST = @IDLIST = $temp\n"; if (@IDLIST) { $returnfieldcount = 0; @RETURN_FIELDS = split(/,/,$fieldid); # print "SELECT: \@RETURN_FIELDS = @RETURN_FIELDS\n"; # while ($returnfieldcount < @RETURN_FIELDS) { $fname = CLEAN_LINE($RETURN_FIELDS[$returnfieldcount]); $columnid = GET_COLUMNID($fname); $idlistcount = 0; # print "SELECT: FIELDNAME: $fname FIELDID:$columnid\n"; while ($idlistcount < @IDLIST) { # $MATRIX[$idlistcount][$returnfieldcount] = $DATABASE[$IDLIST[$idlistcount]][$columnid]; $MATRIX[$idlistcount][$returnfieldcount] = FROMDB($DATABASE[$IDLIST[$idlistcount]][$columnid]); # print "SELECT: MATRIX=$MATRIX[$idlistcount][$returnfieldcount]\n"; $idlistcount++; }; $returnfieldcount++; }; }; return @MATRIX; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_IDLIST { my($condition) = $_[0]; my($exact) = $_[1]; my($opfield,$opdata,$opcolumnid) = undef; my($operation) = 0; my(@ID) = undef; #print "GET_IDLIST: \$condition = $condition\n"; unless ($operation) { if ($condition =~ m/=/) { ($opfield,$opdata) = split(/=/,$condition); $opfield = CLEAN_LINE($opfield); $opdata = CLEAN_ENDS($opdata); $opcolumnid = GET_COLUMNID($opfield); @ID = GET_EQUAL($opcolumnid,$opdata); $operation = 1; }; }; unless ($operation) { if ($condition =~ m//) { ($opfield,$opdata) = split(/>/,$condition); $opfield = CLEAN_LINE($opfield); $opdata = CLEAN_ENDS($opdata); $opcolumnid = GET_COLUMNID($opfield); @ID = GET_LESSTHAN($opcolumnid,$opdata); $operation = 1; }; }; unless ($operation) { if ($condition =~ m/\s+LIKE\s+/) { ($opfield,$opdata) = split(/\s+LIKE\s+/,$condition); $opfield = CLEAN_LINE($opfield); $opdata = CLEAN_ENDS($opdata); $opcolumnid = GET_COLUMNID($opfield); @ID = GET_LIKE($opcolumnid,$opdata,$exact); $operation = 1; }; }; #print "GET_IDLIST: \$operation=$operation\n"; unless ($operation) { $condition = CLEAN_ENDS($condition); if ($condition =~ m/DISTINCT/i) { ($opfield,$opdata) = split(/\s+DISTINCT/,$condition); # print "GET_IDLIST: \$condition = $condition, \$opfield = $opfield, \$opdata=$opdata\n"; $opfield = CLEAN_LINE($opfield); $opdata = CLEAN_ENDS($opdata); $opcolumnid = GET_COLUMNID($opfield); # print "GET_DISTINCT: \$opfield = $opfield, \$opcolumnid = $opcolumnid\n"; @ID = GET_DISTINCT($opcolumnid); $operation = 1; }; }; #print "GET_IDLIST: \@ID = @ID\n"; return @ID; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub CLEAN_ENDS { my($line) = $_[0]; $line =~ s/^\s+//; $line =~ s/\s+$//; return $line; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_EQUAL { my($columnid) = $_[0]; my($data) = $_[1]; my($rcount,$fcount) = undef; my(@returnid) = undef; my($idcount) = undef; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { # print "testing if $data is equal to $DATABASE[$rcount][$columnid]\n"; if ($DATABASE[$rcount][$columnid] eq $data) { $returnid[$idcount] = $rcount; # print "EQUAL FOUND! $returnid[$idcount]\n"; $idcount++; }; $rcount++; }; #print "GET_EQUAL: \@returnid = @returnid\n"; return @returnid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_LIKE { my($columnid) = $_[0]; my($data) = $_[1]; my($exact) = $_[2]; my($rcount,$fcount) = undef; my(@returnid) = undef; my($idcount) = undef; #$data =~ s/*//g; $rcount = 1; if ($exact) { if($data) {$data =~ s/\*/\.\*/g; $pattern = "$data"}; } else { if($data) {$data =~ s/\*/\.\*/g; $pattern = "^"."$data"."\$"}; }; while ($rcount <= $TOTAL_ROWS) { # print "\ntesting if $data is equal to $DATABASE[$rcount][$columnid]\n"; if ( ( $DATABASE[$rcount][$columnid] =~ m/$data/ig ) && ( CLEAN_LINE($DATABASE[$rcount][$columnid]) ) ) { $returnid[$idcount] = $rcount; # print "EQUAL FOUND! $returnid[$idcount]\n"; $idcount++; }; $rcount++; }; #print "GET_LIKE: \@returnid = @returnid\n"; return @returnid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_DISTINCT { my($columnid) = $_[0]; my($data) = $_[1]; my($rcount,$fcount,$idcount) = undef; my(@returnid) = undef; my($idcount) = undef; my(%DISTINCT) = undef; my($h_elem) = undef; my($temp) = undef; foreach $h_elem (sort(keys(%DISTINCT))) { $DISTINCT{$h_elem} = undef;; }; #$data =~ s/*//g; $rcount = 1; if($data) {$data =~ s/\*/\.\*/g; $pattern = "^"."$data"."\$"}; while ($rcount < $TOTAL_ROWS) { $temp = undef; # print "\ntesting if $data is equal to $DATABASE[$rcount][$columnid]\n"; $temp = $DATABASE[$rcount][$columnid]; unless ($DISTINCT{$temp}) { if (CLEAN_LINE($temp)) {$DISTINCT{$temp} = $rcount;print "GET_DISTINCT: DISTINCT= $temp\n";}; }; $rcount++; }; foreach $h_elem (sort(keys(%DISTINCT))) { $returnid[$idcount] = $DISTINCT{$h_elem}; $idcount++; }; #print "GET_LIKE: \@returnid = @returnid\n"; return @returnid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_GREATERTHAN { my($columnid) = $_[0]; my($data) = $_[1]; my($rcount,$fcount) = undef; my(@returnid) = undef; my($idcount) = undef; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { if ($DATABASE[$rcount][$columnid] < $data) { $returnid[$idcount] = $rcount; $idcount++; }; $rcount++; }; #print "GET_GREATERTHAN: \@returnid = @returnid\n"; return @returnid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_LESSTHAN { my($columnid) = $_[0]; my($data) = $_[1]; my($rcount,$fcount) = undef; my(@returnid) = undef; my($idcount) = undef; $rcount = 1; while ($rcount <= $TOTAL_ROWS) { if ($DATABASE[$rcount][$columnid] > $data) { $returnid[$idcount] = $rcount; $idcount++; }; $rcount++; }; #print "GET_LESSTHAN: \@returnid = @returnid\n"; return @returnid; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub GET_COLUMNID { my($fieldid) = $_[0]; my($fcount) = undef; #print "GET_COLUMNID: for $fieldid\n"; while ($fcount < $TOTAL_FIELDS) { # print "GET_COLUMNID: checking if $FNAME[$fcount] = $fieldid\n"; if ($FNAME[$fcount] eq $fieldid) { return $fcount; last; }; $fcount++; }; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub CHECK_DSWITCH { my(@RAW) = undef; if ($DSWITCH) {@RAW = READ_DATABASE($DATABASE_FILENAME,$FSEPARATOR,$DSEPARATOR)}; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### ##################################################################### # ID:002 # TITLE:Function - Convert string to Uppercase (UPPER_CASE) # AUTHOR: SERGY STOUK # SUBMITTED: Sunday, December 10, 2000 ##################################################################### sub UPPER_CASE { my($string)= $_[0]; $string =~ tr/a-z/A-Z/; return $string; }; ##################################################################### # END OF:002 ##################################################################### ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub READ_DATABASE { my($datafile) = $_[0]; my($fieldseparator) = $_[1]; my($dataseparator) = $_[2]; my($filedsline) = undef; my(@rows) = undef; my($fcount) = 0; my($rcount) = 0; my(@fields) = undef; my($line) = undef; my(@rawdata) = undef; my($totalrows) = undef; my($totalfields) = undef; my($line) = undef; my(@temp) = undef; my(@ftype) = undef; my(@fname) = undef; my(@ftext) = undef; my(@foption) = undef; my(@database) = undef; # reading database file: my(@rawdata) = READ_FILE("$datafile"); # getting the first line with field definition: $fieldsline = $rawdata[0]; $fieldsline = CLEAN_LINE($fieldsline); # getting the rest of the database: @rows = @rawdata[1..@rawdata-1]; # identifying fields: @fields = split(/$fieldseparator/,$fieldsline); #identifying field typesm names and options; foreach (@fields) { $line = $_; $line = CLEAN_LINE($line); if ($line) { # print "READ_DATABASE:$line\n"; ($ftype[$fcount],$fname[$fcount],$foption[$fcount],$ftext[$fcount]) = split(/$dataseparator/,$line); # print "READ_DATABASE:TYPE: $fcount = $ftype[$fcount]\n"; # print "READ_DATABASE:TYPE: $fcount = $fname[$fcount]\n"; # print "READ_DATABASE:TYPE: $fcount = $foption[$fcount]\n"; # print "READ_DATABASE:TYPE: $fcount = $ftext[$fcount]\n"; $fcount++; }; }; $totalfields = $fcount; #generating array of arrays of database data: $line = undef; $rcount = 0; while ($rcount <= @rows) { $line = $rows[$rcount]; $line = CLEAN_LINE($line); $fcount = undef; if ($line) { @temp = split(/$dataseparator/,$line); $fcount = 0; foreach (@temp) { $templine = $_; $templine = CLEAN_LINE($templine); $database[$rcount+1][$fcount] = $templine; # print "READ_DATABASE: ROW=$rcount,FIELD=$fcount,DATA=$database[$rcount][$fcount]\n"; $fcount++; }; }; $rcount++; }; $totalrows = $rcount; @RETURN = (\@database,\@ftype,\@fname,\@ftext,\@foption,\$totalrows,\$totalfields); $DSWITCH = 0; $TOTAL_ROWS = $totalrows; $TOTAL_FIELDS = $totalfields; #print "READ DATABASE: \$TOTAL_FIELDS = $TOTAL_FIELDS\n"; @FOPTION = @foption; @FTYPE = @ftype; @FNAME = @fname; @FTEXT = @ftext; @DATABASE = @database; return @RETURN; }; ########################################################################################### ########################################################################################### ########################################################################################### ########################################################################################### sub CLEAN_LINE { my($line) = $_[0]; $line =~ s/\n//g; $line =~ s/^\s+//g; $line =~ s/\s+$//g; return $line; }; ##################################################################### # ID:024 # TITLE:Function - READ_FROM_FILE - Reads data from file and returns as an array. # SUBMITTED BY: SERGY STOUK # DATE: Monday, December 11, 2000 ##################################################################### sub READ_FILE { my($filename) = $_[0]; my($count) = 0; my(@result) = undef; open (INPUT, "$filename") || die "Could not open file $filename : $!\n"; while () { ($result[$count]) =$_; $count++; }; close (INPUT); return @result; }; ##################################################################### # END OF:024 ##################################################################### ##################################################################### # ID:022 # TITLE:Function - Save Array Parameter to file (SAVE_TO_FILE) # SUBMITTED BY: SERGY STOUK # DATE: Monday, December 11, 2000 ##################################################################### sub SAVE_FILE { my($filename) = $_[0]; my(@send) = @_[1..@_-1]; my($count) = 0; open (FILE, ">$filename") || die "Can’t write to $filename: error $!\n"; while ($count < @_) { print FILE $send[$count]; $count++ }; close FILE; return $count; }; ##################################################################### # END OF:022 ##################################################################### sub TODB { my($RESULT) = $_[0]; $RESULT =~ s/$DSEPARATOR/$_D_S_/g; return $RESULT; }; sub FROMDB { my($RESULT) = $_[0]; $RESULT =~ s/$_D_S_/$DSEPARATOR/g; return $RESULT; }; ########################### GET_SCRIPT_PATH_TRANSLATED ##################################### sub GET_SCRIPT_PATH_TRANSLATED { my($temp) = undef; my($PATH_TRANSLATED) = undef; $PATH_TRANSLATED= $ENV{"PATH_TRANSLATED"}; $_ = $PATH_TRANSLATED; if ($PATH_TRANSLATED =~ /\//) { ($PATH_TRANSLATED,$temp) = /(.*)\/(.*)$/; $PATH_TRANSLATED = "$PATH_TRANSLATED"."/"; } else { ($PATH_TRANSLATED,$temp) = /(.*)\\(.*)$/; $PATH_TRANSLATED = "$PATH_TRANSLATED"."\\"; }; $PATH_TRANSLATED =~ s/\\/\//g; if ($PATH_TRANSLATED eq "/") {$PATH_TRANSLATED = "./";}; return $PATH_TRANSLATED; }; ############################################################################################## ############################################################################################## sub GET_SCRIPT_PATH { my($temp) = undef; my($LOCAL_ADDR) = undef; my($SCRIPT_NAME) = undef; my($SCRIPT_PATH) = undef; $LOCAL_ADDR= $ENV{"SERVER_NAME"}; $SCRIPT_NAME= $ENV{"SCRIPT_NAME"}; $_ = $SCRIPT_NAME; ($SCRIPT_PATH,$right) = /(.*)\/(.*)$/; $SCRIPT_PATH = "http://$LOCAL_ADDR"."$SCRIPT_PATH"."/"; return $SCRIPT_PATH; }; ############################################################################################## ##################################################################### # ID:010 # TITLE:Function - Get Current Date and/or Time (GET_DATE) # AUTHOR: SERGY STOUK # SUBMITTED: Sunday, December 10, 2000 ##################################################################### sub CONVERT_DATE { my($partime) = $_[0]; my($date_format) = $_[1]; my($SECONDS) = 0; my($MINUTES) = 0; my($HOUR) = 0; my($MONTHDAY)= 0; my($WEEKDAY) = 0; my($YEARDAY) = 0; my($YEAR) = 0; my($MONTH) = 0; my($DAY) = 0; my($result) = ""; ($SECONDS,$MINUTES,$HOUR,$MONTHDAY,$MONTH,$YEAR,$WEEKDAY,$YEARDAY,$DST_FLAG)=localtime($partime); $YEAR = $YEAR + 1900; $MONTH = $MONTH + 1; if ($HOUR > 11 ){$HOUR_ID = "PM"} else {$HOUR_ID = "AM"}; if ($MONTHDAY < 10 ) {$MONTHDAY = "0"."$MONTHDAY"}; if ($MONTH < 10 ) {$MONTH = "0"."$MONTH"}; if ($HOUR < 10 ) {$HOUR = "0"."$HOUR"}; if ($MINUTES < 10 ) {$MINUTES = "0"."$MINUTES"}; if ($SECONDS < 10 ) {$SECONDS = "0"."$SECONDS"}; if ($WEEKDAY < 10 ) {$WEEKDAY = "0"."$WEEKDAY"}; # Unformatted. Example - Sun Nov 19 16:26:38 2000 if ($date_format == 0) {$result = localtime($partime)}; # General. Example - 11/19/2000 4:26:38 PM if ($date_format == 1) { $HOUR = GET_12_HOUR_TIME($HOUR); $result = "$MONTH"."/"."$MONTHDAY"."/"."$YEAR"." "."$HOUR".":"."$MINUTES".":"."$SECONDS"." $HOUR_ID" }; # Long date. Example - Sunday, November 19, 2000 if ($date_format == 2) { $WEEKDAY = GET_WEEKDAY_LONG_NAME($WEEKDAY); $MONTH = GET_MONTH_LONG_NAME($MONTH); $result = "$WEEKDAY".", "."$MONTH"." "."$MONTHDAY".", "."$YEAR"}; # Medium Date. Example - 19-Nov-2000 if ($date_format == 3) { $MONTH = GET_MONTH_SHORT_NAME($MONTH); $result = "$MONTHDAY"."-"."$MONTH"."-"."$YEAR"}; # Short date. Example - 11/19/2000 if ($date_format == 4) { $result = "$MONTH"."/"."$MONTHDAY"."/"."$YEAR"}; # Long Time. Example - 16:45:09 if ($date_format == 5) { $result = "$HOUR".":"."$MINUTES".":"."$SECONDS"}; # Medium Time. Example - 4:45 PM if ($date_format == 6) { $HOUR = GET_12_HOUR_TIME($HOUR); $result = "$HOUR".":"."$MINUTES"." $HOUR_ID"}; # Short Time. Example - 16:45 if ($date_format == 7) { $result = "$HOUR".":"."$MINUTES"}; return $result; # BELOW IS A BUNCH OF SUBROUTINES TO SERVE THE DATE FORMAT CHANGE sub GET_12_HOUR_TIME { my($HOUR) = $_[0]; if ($HOUR == 0) {$HOUR = 12}; if ($HOUR > 12) {$HOUR = $HOUR - 12}; return $HOUR; }; sub GET_WEEKDAY_LONG_NAME { my($WEEKDAY) = $_[0]; if ($WEEKDAY == 0) {$WEEKDAY = "Sunday"}; if ($WEEKDAY == 1) {$WEEKDAY = "Monday"}; if ($WEEKDAY == 2) {$WEEKDAY = "Tuesday"}; if ($WEEKDAY == 3) {$WEEKDAY = "Wednsday"}; if ($WEEKDAY == 4) {$WEEKDAY = "Thursday"}; if ($WEEKDAY == 5) {$WEEKDAY = "Friday"}; if ($WEEKDAY == 6) {$WEEKDAY = "Saturday"}; return $WEEKDAY; }; sub GET_WEEKDAY_SHORT_NAME { my($WEEKDAY) = $_[0]; if ($WEEKDAY == 0) {$WEEKDAY = "Sun"}; if ($WEEKDAY == 1) {$WEEKDAY = "Mon"}; if ($WEEKDAY == 2) {$WEEKDAY = "Tue"}; if ($WEEKDAY == 3) {$WEEKDAY = "Wed"}; if ($WEEKDAY == 4) {$WEEKDAY = "Thu"}; if ($WEEKDAY == 5) {$WEEKDAY = "Fri"}; if ($WEEKDAY == 6) {$WEEKDAY = "Sat"}; return $WEEKDAY; }; sub GET_MONTH_LONG_NAME { my($MONTH) = $_[0]; if ($MONTH == 1) {$MONTH = "January"}; if ($MONTH == 2) {$MONTH = "February"}; if ($MONTH == 3) {$MONTH = "March"}; if ($MONTH == 4) {$MONTH = "April"}; if ($MONTH == 5) {$MONTH = "May"}; if ($MONTH == 6) {$MONTH = "June"}; if ($MONTH == 7) {$MONTH = "July"}; if ($MONTH == 8) {$MONTH = "August"}; if ($MONTH == 9) {$MONTH = "September"}; if ($MONTH == 10) {$MONTH = "October"}; if ($MONTH == 11) {$MONTH = "November"}; if ($MONTH == 12) {$MONTH = "December"}; return $MONTH; }; sub GET_MONTH_SHORT_NAME { my($MONTH) = $_[0]; if ($MONTH == 1) {$MONTH = "Jan"}; if ($MONTH == 2) {$MONTH = "Feb"}; if ($MONTH == 3) {$MONTH = "Mar"}; if ($MONTH == 4) {$MONTH = "Apr"}; if ($MONTH == 5) {$MONTH = "May"}; if ($MONTH == 6) {$MONTH = "Jun"}; if ($MONTH == 7) {$MONTH = "Jul"}; if ($MONTH == 8) {$MONTH = "Aug"}; if ($MONTH == 9) {$MONTH = "Sep"}; if ($MONTH == 10) {$MONTH = "Oct"}; if ($MONTH == 11) {$MONTH = "Nov"}; if ($MONTH == 12) {$MONTH = "Dec"}; return $MONTH; }; # END OF FUNCTION GET_DATE }; ##################################################################### # END OF:010 ##################################################################### ##################################################################### # ID:022 # TITLE:Function - Save Array Parameter to file (SAVE_TO_FILE) # SUBMITTED BY: SERGY STOUK # DATE: Monday, December 11, 2000 ##################################################################### sub SAVE_FILE { my($filename) = $_[0]; my(@send) = @_[1..@_-1]; my($count) = 0; open (FILE, ">$filename") || die "Can’t write to $filename: error $!\n"; while ($count < @_) { print FILE $send[$count]; $count++ }; close FILE; return $count; }; ##################################################################### # END OF:022 ##################################################################### ##################################################################### # ID:024 # TITLE:Function - READ_FROM_FILE - Reads data from file and returns as an array. # SUBMITTED BY: SERGY STOUK # DATE: Monday, December 11, 2000 ##################################################################### sub READ_FILE { my($filename) = $_[0]; my($count) = 0; my(@result) = undef; open (INPUT, "$filename") || die "Could not open file $filename : $!\n"; while () { ($result[$count]) =$_; $count++; }; close (INPUT); return @result; }; ##################################################################### # END OF:024 ##################################################################### ##################################################################### # ID:081 # TITLE:Function - SAVE_TO_REPORT # SUBMITTED BY: SERGY STOUK # DATE: Thursday, June 21, 2001 ##################################################################### sub SAVE_REPORT { my($filename) = $_[0]; my(@send) = @_[1..@_-1]; my($count) = 0; my($totallines) = 0; if ($filename) { open (FILE, ">>$filename") || die "Can’t write to $filename: error $!\n"; while ($count < @_) { print FILE $send[$count]; $count++ }; close FILE; }; return $count; }; ##################################################################### # END OF:081 ##################################################################### return 1;