]> lifelog.hopto.org Git - PerlCNF.git/commitdiff
DATA Instruction column CNF data types.
authorWill Budic <redacted>
Wed, 15 May 2024 22:34:40 +0000 (08:34 +1000)
committerWill Budic <redacted>
Wed, 15 May 2024 22:34:40 +0000 (08:34 +1000)
system/modules/CNFMeta.pm

index e56910fb7d5be3b2464bca36464f7478ca5f732b..fc73cdc93a3bec91ff743fb563695ac0c8730a98 100644 (file)
@@ -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