]> lifelog.hopto.org Git - PerlCNF.git/commitdiff
fix. writeToDataFile and row referencing.
authorWill Budic <redacted>
Mon, 24 Nov 2025 18:52:46 +0000 (05:52 +1100)
committerWill Budic <redacted>
Mon, 24 Nov 2025 18:52:46 +0000 (05:52 +1100)
system/modules/CNF.pm
system/modules/CNFMeta.pm
system/modules/CNFParser.pm

index 451ded7199f9454b7e60de405fbf8d5b59989002..b03b52ccb17179bb6f4be35766d79391bb7fa7e8 100644 (file)
@@ -212,18 +212,20 @@ sub writeToDataFile {  my ($self, $path, $property, $fh)=@_;
             my @head       = @{$table_spec -> {header}};
             my @data       = @{$table_spec -> {data}};
             foreach my $next(@data){
-                    my $transition = join '`', @$next;
-                    if(!$cnf_tagged){
-                       $cnf_tagged = 1;
-                       my $header = join '`', @{ $head[$CNFMeta::TABLE_HEADER{COL_NAMES}] };
-                       $fh->print(
-qq(<<$key<DATA>  __HAS_HEADER__
+                    my $transition = join '`', CNFMeta::_deRefArray($next);
+if(!$cnf_tagged){
+my $header = join '`', @{ $head[$CNFMeta::TABLE_HEADER{COL_NAMES}] };
+my $meta_tag = '__HAS_HEADER__';
+$meta_tag.= ' __AUTO_NUMBERED__' if ${$head[$CNFMeta::TABLE_HEADER{ID_TYPE}]} eq 'AUTOINCREMENT';
+$cnf_tagged = 1;
+$fh->print(
+qq(<<$key<DATA>  $meta_tag
 $header~
 ))
-                    }
-                    $fh->print ($transition, "~\n");
+}
+               $fh->print ($transition, "~\n");
             }
-            print $fh->print(">>\n") if($cnf_tagged)
+               $fh->print(">>\n") if($cnf_tagged)
         }
     }catch($e){
         CNFParserException->throw(error=>$e);
index 1d88ad0ec0b862d19453f492cb8f79d9e903fcf5..d126bfa93111ef60616e600ef2806464e27d3f4d 100644 (file)
@@ -42,7 +42,7 @@ our %TABLE_HEADER;
 our %REL_IDX;
 ###
 BEGIN {
-my $cnt =0; foreach(qw{BOOL INT CNFID NUMBER DATE TEXT}){$CNF_DATA_TYPES{$_}=++$cnt} lock_hash(%CNF_DATA_TYPES);
+my $cnt =0; foreach(qw{BOOL INT CNFID NUMBER DATE TEXT UNIQUE}){$CNF_DATA_TYPES{$_}=++$cnt} lock_hash(%CNF_DATA_TYPES);
    $cnt =0; foreach(qw{COL_NAMES COL_TYPES RELATIONS TABLE_META ID_TYPE ID_PRIMARY T_BODY F_NAMES F_VALUES F_UPDATES F_WHERE DB META_V})
                                                        {$TABLE_HEADER{$_}=$cnt++} lock_hash(%TABLE_HEADER);
    $cnt =0; foreach(qw{IDX TABLE COLNAME})             {$REL_IDX{$_}=$cnt++}      lock_hash(%REL_IDX);
@@ -93,9 +93,9 @@ sub _import_into_this_package {
 ###
 # Data base conversion types supported from the CNF side.
 ###
-    our ($INT,$NUM,$BOOL,$TEXT,$DATE,$ID, $CNF_ID, $INDEX, $AUTO, $REL) = (
-         _meta('INT'),_meta('NUM'),_meta('BOOL'),_meta('TEXT'),_meta('DATE'),
-         _meta('ID'),_meta('CNF_ID'),_meta('CNF_INDEX'),_meta('AUTO'),_meta('REL')
+    our ($INT, $NUM, $BOOL, $TEXT, $DATE, $UNIQUE, $ID, $CNF_ID, $INDEX, $AUTO, $REL) = (
+         _meta('INT'),_meta('NUM'),_meta('BOOL'),_meta('TEXT'),_meta('DATE'),_meta('UNIQUE'),
+         _meta('ID'),_meta('CNF_ID'),_meta('CNF_INDEX'),_meta('AUTO'),_meta('REL'),
         );
 
 ###
@@ -193,6 +193,9 @@ sub _metaTranslateDataHeader {
                $body   .= "\"$hdr\" TIMESTAMP with time zone NOT NULL,\n"; 
             }
             $spec[$i] = $CNF_DATA_TYPES{DATE};
+        }elsif($hdr =~ s/$UNIQUE/""/ei){
+            $body   .= "\"$hdr\" TEXT UNIQUE NOT NULL,\n";
+            $spec[$i] = $CNF_DATA_TYPES{UNIQUE};
         }else{
             $body   .= "\"$hdr\" TEXT NOT NULL,\n";
             $spec[$i] = $CNF_DATA_TYPES{TEXT};
@@ -266,14 +269,7 @@ sub _deRefArray {
     return $ret
 }
 
-sub _obtainColumnMap {
-    my $table  = shift;
-    my @header = CNFMeta::_deRefArray($$table->{header});
-    my @names  = CNFMeta::_deRefArray($header[$TABLE_HEADER{COL_NAMES}]);
-    my %ret;
-    foreach my $i(0..$#names){ $ret{$names[$i]}=$i }
-    return \%ret
-}
+
 use feature qw(signatures);
 use Scalar::Util qw(looks_like_number);
 sub _matchType($type, $val, @rows) {
@@ -296,6 +292,24 @@ sub _zero_prefix ($times, $val) {
     }
 }
 
+sub _obtainColumnMap($table) {    
+    my @header = _deRefArray($$table->{header});
+    my @names  = _deRefArray($header[$TABLE_HEADER{COL_NAMES}]);
+    my %ret;
+    foreach my $i(0..$#names){ $ret{$names[$i]}=$i }
+    return \%ret
+}
+sub _getColumnIndex($table, $name){
+    my @header    = _deRefArray($$table->{header});
+    my @col_names = _deRefArray($header[0]);
+    for my $index(0..$#col_names){
+        return $index if $name eq $col_names[$index];
+    }
+    warn "Not found column name:$name";
+}
+
+
+
 1;
 
 =begin copyright
index a2bbc3ce6a8f3132219ab33f254682870df7808c..022fede7c4206ced156ca33c130943b04ddfc9c2 100644 (file)
@@ -26,7 +26,8 @@ sub _import_into_this_package {
         *{"${caller}::const"}         = defined($parent)?sub{return const($parent,shift)}:\&const;
         *{"${caller}::CNFProperty"}   = \&property;
         *{"${caller}::TRUE"}          = 1;
-        *{"${caller}::FALSE"}         = 0;
+        *{"${caller}::FALSE"}         = 0;        
+        *{"${caller}::isTrue"}        = \&CNF::_isTrue;
 
     }
     return 1;
@@ -817,7 +818,7 @@ sub doDATAInstructions_{ my ($self,$e,$v,$t,$d)=@_;
                 }
             }elsif(scalar @a > 0){
                $isHeader =  0; #autocorrect if _HAS_HEADER_ header was accidentally set.
-               push @rows, [@a] if not $hasPreRunRefs; $hasPreRunRefs=0;
+               push @rows,\@a if not $hasPreRunRefs; $hasPreRunRefs=0;
             }
         }
         my $ret = {name=>$e,header=>\@hdr,data=>\@rows,auto=>$autonumber};