From 46d7a5ef562e7042507c7ae0c72d49b9de6fd2e8 Mon Sep 17 00:00:00 2001 From: Will Budic Date: Thu, 16 May 2024 08:34:40 +1000 Subject: [PATCH] DATA Instruction column CNF data types. --- system/modules/CNFMeta.pm | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/system/modules/CNFMeta.pm b/system/modules/CNFMeta.pm index e56910f..fc73cdc 100644 --- a/system/modules/CNFMeta.pm +++ b/system/modules/CNFMeta.pm @@ -28,6 +28,11 @@ sub _meta { # Priority order no. for instructions. use constant PRIORITY => qr/(\s*\_+PRIORITY\_(\d+)\_+\s*)/o; +### +# Global, there is possible only four CNF data types. +our %CNF_DATA_TYPES;# ^ # % @ $ (default) +BEGIN{my $cnt =0; foreach(qw{BOOL INT NUMBER DATE TEXT}){$CNF_DATA_TYPES{$_}=++$cnt}} + sub import { my $caller = caller; no strict "refs"; { @@ -47,12 +52,14 @@ sub import { # resulting in unintended placings. *{"${caller}::meta_node_in_shortife"} = sub {return _meta("IN_SHORTIFE")}; # Execute via system shell. + *{"${caller}::meta"} = \&_meta; *{"${caller}::SHELL"} = sub {return _meta("SHELL")}; # Returns the regular expresion for any of the meta constances. - *{"${caller}::meta"} = \&_meta; } return 1; } + + ### # CNF DATA instruction headers can contain extra expected data type meta info. # This will strip them out and build the best expected SQL create table body, based on this meta. @@ -60,7 +67,7 @@ sub import { ### sub _metaTranslateDataHeader { my $isPostgreSQL = shift; - my @array = @_; + my @array = @_; my @spec; my ($idType,$body,$primary)=('NONE'); my ($INT,$BOOL,$TEXT,$DATE,$ID, $CNFID, $INDEX) = ( _meta('INT'),_meta('BOOL'),_meta('TEXT'),_meta('DATE'), @@ -76,32 +83,41 @@ sub _metaTranslateDataHeader { $body .= "\"$hdr\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n"; } # DB provited sequence, you better don't set this when inserting a record. + $spec[$i] = $CNF_DATA_TYPES{INT}; $idType = 'AUTOINCREMENT' }elsif($hdr =~ s/$CNFID/""/ei){ #This is where CNF provides the ID uinque int value (which doesn't have to be autonumbered i.e. '#', but must be unique). $body .= "\"$hdr\" INTEGER NOT NULL PRIMARY KEY CHECK (\"$hdr\">0),\n"; + $spec[$i] = $CNF_DATA_TYPES{INT}; $idType = 'CNF_INDEX' }elsif($hdr =~ s/$ID/""/ei){ #This is ID prefix to some other data id stored in this table, usually one to one/many relationship. $body .= "\"$hdr\" INTEGER CHECK (\"$hdr\">0),\n"; + $spec[$i] = $CNF_DATA_TYPES{INT}; }elsif($hdr =~ s/$INDEX/""/ei){ # This is where CNF instructs to make a indexed lookup type field, # for inside database fast selecting, hashing, caching and other queries. $body .= "\"$hdr\" varchar(64) NOT NULL PRIMARY KEY,\n"; + $spec[$i] = $CNF_DATA_TYPES{TEXT}; }elsif($hdr =~ s/$INT/""/ei){ $body .= "\"$hdr\" INTEGER NOT NULL,\n"; + $spec[$i] = $CNF_DATA_TYPES{INT}; }elsif($hdr =~ s/$BOOL/''/ei){ if($isPostgreSQL){ $body .= "\"$hdr\" BOOLEAN NOT NULL,\n"; }else{ $body .= "\"$hdr\" BOOLEAN NOT NULL CHECK (\"$hdr\" IN (0, 1)),\n"; } + $spec[$i] = $CNF_DATA_TYPES{BOOL}; }elsif($hdr =~ s/$TEXT/""/ei){ $body .= "\"$hdr\" TEXT NOT NULL CHECK (length(\"$hdr\")<=2024),\n"; + $spec[$i] = $CNF_DATA_TYPES{TEXT}; }elsif($hdr =~ s/$DATE/""/ei){ $body .= "\"$hdr\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n"; + $spec[$i] = $CNF_DATA_TYPES{DATE}; }else{ $body .= "\"$hdr\" TEXT NOT NULL,\n"; + $spec[$i] = $CNF_DATA_TYPES{TEXT};; } $array[$i] = $hdr; } @@ -110,6 +126,21 @@ sub _metaTranslateDataHeader { }else{ $body =~ s/,$// } -return [\@array,\$body,$idType]; +return \[\@array,\$body,$idType,\@spec]; } + +sub _deRefArray { + my $ret = shift; + + if ( ref($ret) eq 'ARRAY' ){ + my @arr = @{$ret}; + if(@arr==1 && ref($arr[0]) eq 'ARRAY'){ + @arr = @{$arr[0]}; + } + return @arr + } + return $ret +} + + 1; \ No newline at end of file -- 2.34.1