From 4ca2eb240c795e5420caa0ec146770f8926add81 Mon Sep 17 00:00:00 2001 From: Will Budic Date: Tue, 25 Nov 2025 05:52:46 +1100 Subject: [PATCH] fix. writeToDataFile and row referencing. --- system/modules/CNF.pm | 20 ++++++++++--------- system/modules/CNFMeta.pm | 38 +++++++++++++++++++++++++------------ system/modules/CNFParser.pm | 5 +++-- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/system/modules/CNF.pm b/system/modules/CNF.pm index 451ded7..b03b52c 100644 --- a/system/modules/CNF.pm +++ b/system/modules/CNF.pm @@ -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 __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 $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); diff --git a/system/modules/CNFMeta.pm b/system/modules/CNFMeta.pm index 1d88ad0..d126bfa 100644 --- a/system/modules/CNFMeta.pm +++ b/system/modules/CNFMeta.pm @@ -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 diff --git a/system/modules/CNFParser.pm b/system/modules/CNFParser.pm index a2bbc3c..022fede 100644 --- a/system/modules/CNFParser.pm +++ b/system/modules/CNFParser.pm @@ -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}; -- 2.34.1