# 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";
{
# 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.
###
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'),
$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;
}
}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