diff --git a/reference/SQL_MultiDB/SQL_MultiDB.upp b/reference/SQL_MultiDB/SQL_MultiDB.upp index 5e168ba18..4e339282c 100644 --- a/reference/SQL_MultiDB/SQL_MultiDB.upp +++ b/reference/SQL_MultiDB/SQL_MultiDB.upp @@ -6,9 +6,10 @@ uses plugin/sqlite3; file + multidb.h, mysql_schema.sch, sqlite3_schema.sch, - multidb.h, + db2schema.cpp, main.cpp; mainconfig diff --git a/reference/SQL_MultiDB/db2schema.cpp b/reference/SQL_MultiDB/db2schema.cpp new file mode 100644 index 000000000..ac71a99d8 --- /dev/null +++ b/reference/SQL_MultiDB/db2schema.cpp @@ -0,0 +1,17 @@ +#include "multidb.h" + +namespace DB2 { + +#define SCHEMADIALECT +#define MODEL +#include +#include +#undef MODEL +#undef SCHEMADIALECT + +void DB2_All_Tables(SqlSchema& sch) +{ // we need a distinct name for second database schema creation function + All_Tables(sch); +} + +}; diff --git a/reference/SQL_MultiDB/main.cpp b/reference/SQL_MultiDB/main.cpp index 0b111aa94..1a0ebc24d 100644 --- a/reference/SQL_MultiDB/main.cpp +++ b/reference/SQL_MultiDB/main.cpp @@ -1,55 +1,62 @@ -#include - -using namespace Upp; +#include "multidb.h" #define SCHEMADIALECT #define MODEL -#include // creates the code for mapping schema structures to database rows +#include // creates the code for mapping schema structures to database rows and SqlIds #include // creates the code to generate sql scripts that upload schema to DB +#undef MODEL #undef SCHEMADIALECT -namespace DB2 { -#define SCHEMADIALECT -#define MODEL -#include -#include -#undef SCHEMADIALECT -} - CONSOLE_APP_MAIN { + StdLogSetup(LOG_COUT|LOG_FILE); + Sqlite3Session sqlite3; MySqlSession mysql; // edit the connection parameters if necessary - if(mysql.Connect("root", "Passw0rd", "test")) { - Cout() << "Connected\n"; - SQL = mysql; - + if(!mysql.Connect("root", "Passw0rd", "test")) { + LOG("Failed to connect MySQL!"); + Exit(1); + } + mysql.SetTrace(); + + if(!sqlite3.Open(ConfigFile("test.db"))) { + LOG("Failed to connect Sqlite3!"); + Exit(1); + } + sqlite3.SetTrace(); + + SQL = mysql; // MySql will be our default database + + { // Create/Upgrade DB schema in MySql SqlSchema sch(MY_SQL); All_Tables(sch); - // create the table if necessary SqlPerformScript(sch.Upgrade()); SqlPerformScript(sch.Attributes()); SQL.ClearError(); - - try { - // insert some random data - SQL & Insert(TEST_TABLE)(VALUE, Uuid::Create().ToString()); - // fetch some data - Sql sql; - sql * Select(ID, VALUE).From(TEST_TABLE) - .OrderBy(Descending(ID)) - .Limit(5); - while(sql.Fetch()) - Cout() << AsString(sql[0]) << ": " << AsString(sql[VALUE]) << "\n"; - } - catch(SqlExc &ex) { - Cerr() << "ERROR: " << ex << "\n"; - SetExitCode(1); - } } - else { - Cerr() <<"ERROR: Unable to connect to database\n"; - SetExitCode(1); + + { // Create/Upgrade DB schema in Sqlite3 + SqlSchema sch(SQLITE3); + DB2::DB2_All_Tables(sch); + SqlPerformScript(sqlite3, sch.Upgrade()); + SqlPerformScript(sqlite3, sch.Attributes()); + SQL.ClearError(); + } + + { // Do something with MySql + SQL * Insert(TEST_TABLE)(VALUE, FormatIntBase(Random(), 36)); + Sql sql; + sql * Select(ID, VALUE).From(TEST_TABLE); + while(sql.Fetch()) + LOG("ID: " << sql[ID] << ", VALUE: " << sql[VALUE]); + } + + { // Do something with Sqlite3; ID and VALUE SqlIds are from mysql schema, but these are just text, so no problem + Sql sql(sqlite3); // need to specify non-default session in the constructor! + sql * Insert(TEST_TABLE)(VALUE, FormatIntBase(Random(), 36))(DB2::NAME, AsString(Random())); + sql * Select(ID, VALUE, DB2::NAME).From(DB2::TEST_TABLE); // the value of DB2::TEST_TABLE and TEST_TABLE is the same, using DB2:: here just for demonstration + while(sql.Fetch()) + LOG("ID: " << sql[ID] << ", VALUE: " << sql[VALUE] << ", NAME: " << sql[DB2::NAME]); } } diff --git a/reference/SQL_MultiDB/multidb.h b/reference/SQL_MultiDB/multidb.h index 3419f1024..d43b40cda 100644 --- a/reference/SQL_MultiDB/multidb.h +++ b/reference/SQL_MultiDB/multidb.h @@ -1,16 +1,27 @@ #ifndef _SQL_MultiDB_multidb_h_ #define _SQL_MultiDB_multidb_h_ +#include +#include + +using namespace Upp; + #define SCHEMADIALECT #define MODEL #include -#undef SCHEMADIALECT +#undef MODEL // with multiple schemas, we need to do cleanup so that MODEL and +#undef SCHEMADIALECT // SCHEMDIALECT can be redefined to second schema values namespace DB2 { + #define SCHEMADIALECT #define MODEL #include +#undef MODEL #undef SCHEMADIALECT + +void DB2_All_Tables(SqlSchema& sch); + }; #endif diff --git a/reference/SQL_MultiDB/sqlite3_schema.sch b/reference/SQL_MultiDB/sqlite3_schema.sch index ba090da93..786aa6aa6 100644 --- a/reference/SQL_MultiDB/sqlite3_schema.sch +++ b/reference/SQL_MultiDB/sqlite3_schema.sch @@ -1,5 +1,5 @@ -TABLE(TEST_TABLE) // Note that column names definition is simply shared between schemas - INT (ID) PRIMARY_KEY AUTO_INCREMENT - STRING (VALUE, 32) +TABLE_(TEST_TABLE) + INT_ (ID) PRIMARY_KEY AUTO_INCREMENT + STRING_ (VALUE, 32) STRING_ (NAME, 200) END_TABLE