--- /dev/null
+#!/usr/bin/env perl
+use warnings; use strict;
+use Syntax::Keyword::Try;
+use Benchmark;
+
+use lib "tests";
+use lib '/home/will/dev_new/PerlCNF/system/modules';
+# use lib "system/modules";
+
+
+require TestManager;
+require CNFParser;
+require CNFSQL;
+
+my $test = TestManager -> new($0);
+my $cnf;
+
+ `rm -f tests/test_db_central.db`;
+
+try{
+
+ die $test->failed() if not $cnf = CNFParser->new();
+ $test->case("Passed new instance CNFParser.");
+ $test->subcase('CNFParser->VERSION is '.CNFParser->VERSION);
+ #
+ $test->nextCase();
+ #
+
+
+ $test->case("Test CNFSQL script to data synch and map.");
+ $cnf = CNFParser->new(undef,{DO_ENABLED=>1,DEBUG=>1,'%LOG'=>{console=>1}});
+ ###
+ # Here the table is mapped to CNF data property that is auto-numbered.
+ # But the table itself is not reflected to this so inserts and updates are different.
+ # Then directly making an SQL table from an CNF Data header.
+ $cnf->parse(undef,q(
+
+ <<<CONST
+ DB = tests/test_db_central.db
+ DB_CREDENTIALS = admin/admin
+ DB_SQL_SOURCE = DBI:SQLite:
+
+ >>>
+
+
+
+ <<TBL_A<TABLE> _MAP_TO_ TBL_A_DATA
+ "name" varchar(28) NOT NULL,
+ "ID" INTEGER NOT NULL,
+ "Gender" varchar(10),
+ PRIMARY KEY ("ID")
+ >>
+ <<TBL_A_DATA<DATA> __HAS_HEADER__ __AUTONUMBER__
+ ID`NAME`Gender~
+ #`Mickey Mouse`rat~
+ 5`Donald Duck`food~
+ #`Captain Cook`crook~
+ >>
+ ));
+ #
+ $test->nextCase();
+ #
+
+
+ my $db = CNFSQL::_connectDB('test','test',$cnf->{DB_SQL_SOURCE},$cnf->{DB});
+ my $sql = $cnf->SQL();
+ $sql -> {data } = $sql->{parser}->data();
+ $sql -> initDatabase($db,0);
+ $db -> disconnect();
+
+ #
+ $test->nextCase();
+ #
+
+ $test->case("Test db view to existing database.");
+ $cnf = CNFParser->new(undef,{DO_ENABLED=>1,DEBUG=>1,'%LOG'=>{console=>1}});
+ $cnf->parse(undef,qq(
+<<DB_CENTRAL<PLUGIN>
+ DB = tests/test_db_central.db
+ DB_CREDENTIALS = admin/admin
+ DB_SQL_SOURCE = DBI:SQLite:
+ package : DatabaseCentralPlugin
+ subroutine : executeStatements
+ property : VIEW_TBL_A
+>>
+
+# This is the table spec for an unknown to this script physical SQL database table.
+# Its selection statement is mapped with __MAP_CNF_DB_VIEW__ VIEW_TBL_A, without this meta instruction
+# auto resolving will not work.
+#
+<<SPEC_TBL_A<TABLE> __MAP_CNF_DB_VIEW__ VIEW_TBL_A
+ID _INT_`NAME _TEXT_~
+>>
+
+# It is more readable not to map the above to an CNF <VIEW> instruction.
+# The following statement can be both table and a view, which is recommended.
+#
+<<VIEW_TBL_A<SQL>select ID, Name from TBL_A;>>
+));
+ my $central = $cnf->property('DB_CENTRAL');
+ my $view = $cnf->data()->{VIEW_TBL_A};
+ my @data = @{$$view->{data}};
+ $test->evaluate("Mapped view has selected three records?",3,scalar @data);
+ $test->evaluate("Mapped view has record 5 -Donald Duck at index 2?",'Donald Duck', $data[2][1]); #<-view is ID-0, Name is 1.
+#
+#
+$test->done();
+#
+}
+catch{
+ $test -> dumpTermination($@);
+ $test -> doneFailed();
+}
--- /dev/null
+#!/usr/bin/env perl
+use warnings; use strict;
+use Syntax::Keyword::Try;
+use Benchmark;
+use lib "tests";
+use lib '/home/will/dev_new/PerlCNF/system/modules';
+# use lib "system/modules";
+
+require TestManager;
+require CNFParser;
+require CNFSQL;
+
+my $test = TestManager -> new($0);
+my $cnf;
+my $DB_SETTINGS = qq(
+<<<CONST
+ DB = nomad_network
+ DB_CREDENTIALS = tester/tester2025
+ DB_SQL_SOURCE = DBI:Pg:host=elite;port=5432;
+>>>
+);
+try{
+
+ die $test->failed() if not $cnf = CNFParser->new(undef,{'%LOG'=>{console=>1}});
+ $test->case("Passed new instance CNFParser.");
+ #
+ our $sql;
+ $cnf->parse(undef,$DB_SETTINGS);
+ my($user,$pass,$source,$store)=(CNFSQL::_credentialsToArray($cnf->{DB_CREDENTIALS}),$cnf->{DB_SQL_SOURCE},$cnf->{DB});
+ our ($db,$test_further) = (undef,1);
+ try{
+ $db = CNFSQL::_connectDB($user,$pass,$source,$store);
+ }catch($e){
+ $test_further = 0;
+ $test->unsuited()->passed("Skipping further testing unable to connect to <<<DB_SQL_SOURCE $cnf->{DB_SQL_SOURCE} >>> \n$e");
+ $test->done();
+ exit;
+
+ }
+ if($test_further){
+ $test->case("initDatabase");
+ my $content = do {local $/;<DATA>};
+ $cnf->parse(undef, $content);
+
+ $cnf->SQL()->initDatabase($db);
+ }
+
+ my %schema = $cnf->SQL()->schema();
+
+ if(!$schema{CMD_HISTORY}){
+ my $tbl_cmd_history_statement = $cnf->SQL()->{CMD_HISTORY};
+ $test->fail("SQL Statement for CMD_HISTORY");
+ $db ->do($tbl_cmd_history_statement);
+ }else{
+ $cnf->warn('Skipping SQL Statement for CMD_HISTORY, table exists!');
+ }
+ #
+ $test->done();
+ #
+}
+catch{
+ $test -> dumpTermination($@);
+ $test -> doneFailed();
+}
+
+
+=begin postgreSQL setup
+$> psql -U postgres -p 5433 -h localhost
+
+CREATE USER admin SUPERUSER LOGIN PASSWORD 'admin';
+CREATE DATABASE test_db_central;
+grant all privileges on database test_db_central to admin;
+=cut
+
+__DATA__
+!CNF3.0
+// The spaced out data column header and its meta type settings are spaced out,
+// bellow for your readability, this is allowed in CNF. not in any other scripted data format.
+<< TASKS <DATA> __SQL_TABLE__ __SQL_PostgreSQL__
+ID _CNF_ID_
+ `Date _DATE_
+ `Due _DATE_
+ `Task _TEXT_
+ `Completed _BOOL_
+ `Priority _ID__~
+#`2023-10-18`2023-11-22`Write test.`0`1~
+#`2023-10-18`2023-12-01`Implement HSHContact.`0`5~
+#`2023-12-1`2023-12-21`Deploy HSHContact.`0`5~
+>>
+
+<< TASKS_AUTO_VARIANT <DATA> __SQL_TABLE__ __SQL_PostgreSQL__
+ID`Date _DATE_`Due _DATE_
+ `Task _TEXT_
+ `Completed _BOOL_
+ `Priority _ID__~
+#`2023-10-18`2023-11-22`Write test.`0`1~
+#`2023-10-18`2023-12-01`Implement HSHContact.`0`5~
+#`2023-12-1`2023-12-21`Deploy HSHContact.`0`5~
+>>
+
+<<cmd_history<SQL>
+
+CREATE TABLE IF NOT EXISTS public.cmd_history
+(
+ "ID" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
+ "DATE" timestamp without time zone,
+ "CMD" character varying(2024) COLLATE pg_catalog."default" NOT NULL,
+ "COUNT" integer,
+ CONSTRAINT cmd_history_pkey PRIMARY KEY ("ID"),
+ CONSTRAINT "cmd_history_CMD_key" UNIQUE ("CMD")
+)
+
+WITH (
+ autovacuum_enabled = TRUE
+)
+TABLESPACE pg_default;
+CREATE INDEX idx_cmd_history_cmd ON public.cmd_history ("CMD");
+
+
+
+ALTER TABLE IF EXISTS public.cmd_history
+ OWNER to tester;
+
+GRANT ALL ON TABLE public.cmd_history TO tester;
+
+>>
\ No newline at end of file