#include #include #pragma hdrstop #define HAVE_ORACLE #ifndef flagNOSQLLITE #define HAVE_SQLLITE #include #endif #ifndef flagNOMYSQL #define HAVE_MYSQL #endif #if defined(PLATFORM_WIN32) && defined(COMPILER_MSC) #define HAVE_OLEDB #endif #ifdef HAVE_ORACLE #include #include #endif #ifdef HAVE_MYSQL #ifndef flagMT #error Must compile MySQL in multithreaded mode! #endif #include #endif using namespace Upp; #define LAYOUTFILE #include class SqlCommanderApp { public: SqlCommanderApp(); void Run(); void Serialize(Stream& s); private: WithLoginLayout login; enum SERVER_TYPE { SERVER_ORACLE, #ifdef HAVE_MYSQL SERVER_MYSQL #endif }; One session; }; SqlCommanderApp::SqlCommanderApp() { CtrlLayoutOKCancel(login, "Connect to server"); login.password.Password(); login.save_password = true; #ifdef HAVE_ORACLE login.connection.Add("OCI7"); login.connection.Add("OCI8"); #endif #ifdef HAVE_MYSQL login.connection.Add("MYSQL"); #endif #ifdef HAVE_SQLLITE login.connection.Add("SQLLITE"); #endif #ifdef HAVE_OLEDB Array providers = OleDBSession::EnumProviders(); for(int i = 0; i < providers.GetCount(); i++) login.connection.Add("OLEDB:" + providers[i].name); #endif } void SqlCommanderApp::Serialize(Stream& s) { int version = 3; s / version; if(version < 3) { s.SetError(); return; } String pwd; if(s.IsStoring() && login.save_password) pwd = Garble(~login.password); s % login.username % login.database % login.server % login.connection % login.save_password % pwd; if(s.IsLoading() && login.save_password) login.password <<= Garble(pwd); } void SqlCommanderApp::Run() { LoadFromFile(*this); do { if(login.Run() != IDOK) return; String un = ~login.username; String pw = ~login.password; String db = ~login.database; String sv = ~login.server; String co = ~login.connection; String connect = un; if(!pw.IsEmpty()) connect << '/' << pw; if(!sv.IsEmpty()) connect << '@' << sv; #ifdef HAVE_ORACLE if(co == "OCI7") { One oci7 = new Oracle7; if(!oci7->Open(connect)) { Exclamation(NFormat("OCI7 login failed: [* \1%s\1].", oci7->GetLastError())); continue; } session = -oci7; } if(co == "OCI8") { One oci8 = new Oracle8; if(!oci8->Open(connect, false)) { Exclamation(NFormat("OCI8 login failed: [* \1%s\1].", oci8->GetLastError())); continue; } session = -oci8; } #endif #ifdef HAVE_MYSQL if(co == "MYSQL") { One mysql = new MySqlSession; if(!mysql->Connect(un, pw, db, sv)) { Exclamation(NFormat("MySql login failed: [* \1%s\1].", mysql->GetLastError())); continue; } session = -mysql; } #endif #ifdef HAVE_SQLLITE if(co == "SQLLITE") { One sqlite = new Sqlite3Session; if(!sqlite->Open(db)) { Exclamation(NFormat("SQLite3 open failed, (db file = [* \1%s\1]): [* \1%s\1].", db, sqlite->GetLastError())); continue; } session = -sqlite; } #endif #ifdef HAVE_OLEDB if(!memcmp(co, "OLEDB:", 6)) { String conn = co.Mid(6); One oledb = new OleDBSession; if(!oledb->Open(un, pw, sv, conn)) { Exclamation(NFormat("OleDB login failed: [* \1%s\1].", oledb->GetLastError())); continue; } session = -oledb; } #endif if(!session) Exclamation(NFormat("Unsupported connection type: [* \1%s\1].", co)); } while(!session); login.Close(); SQLCommander(*session); StoreToFile(*this); } #ifdef flagMAIN GUI_APP_MAIN { // SetLanguage(LNGC_('E', 'N', 'U', 'S', CHARSET_WIN1252)); SetLanguage(LNGC_('C', 'S', 'C', 'Z', CHARSET_WIN1250)); // SetDefaultCharset(CHARSET_WIN1250); // Draw::XLFDArialFont = "-*-helvetica-*-*-*-*-*-*-*-*-*-*-*-*"; // Draw::SetStdFont(Arial(12)); SqlCommanderApp().Run(); } #endif//flagMAIN