diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml
index 8eb257c8..5e7ec44f 100644
--- a/.github/workflows/windows-build.yml
+++ b/.github/workflows/windows-build.yml
@@ -5,9 +5,9 @@ env:
on:
push:
- branches: [ "master", "dev" ]
+ branches: [ "**" ]
pull_request:
- branches: [ "master", "dev" ]
+ branches: [ "**" ]
jobs:
build:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 54e9656f..61f4dbd3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
+cmake_minimum_required(VERSION 3.5)
project(flamerobin)
-cmake_minimum_required(VERSION 3.0)
# Don't allow in-source builds. Keeps things nice and tidy
if( "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}" )
diff --git a/docs/fr_whatsnew.html b/docs/fr_whatsnew.html
index b4d69530..ac25ba44 100644
--- a/docs/fr_whatsnew.html
+++ b/docs/fr_whatsnew.html
@@ -8,7 +8,25 @@
http://www.flamerobin.org/bugs.php or https://github.com/mariuz/flamerobin/issues
-Changes in FlameRobin 0.9.9 and 0.9.10
+Changes in FlameRobin 0.9.10
+
+New features
+- New "Volatile" SQL Editor, allows you to use CREATE DATABASE, CONNECT and DISCONNECT in your script, increasing the flexibility to do maintenance across several databases. To use this feature you need to go to Database->Open new Volatile SQL Editor. Use with attention
+
+Enhancements and Bug fixes
+
+- New collation tree view
+- Many other small fixes, see commit history for more details :)
+
+For more info please read commit history log
+
+
+
+
+
+
+
+Changes in FlameRobin 0.9.9
Enhancements and Bug fixes
diff --git a/src/frutils.cpp b/src/frutils.cpp
index eff857db..7008efa0 100644
--- a/src/frutils.cpp
+++ b/src/frutils.cpp
@@ -218,6 +218,17 @@ bool getService(Server* s, IBPP::Service& svc, ProgressIndicator* p,
return true;
}
+wxString unquote(const wxString& input, const wxString& quoteChar)
+{
+ wxString result = input;
+
+ if (result.StartsWith(quoteChar) && result.EndsWith(quoteChar) && result.length() >= 2) {
+ result = result.Mid(1, result.length() - 2);
+ }
+
+ return result;
+}
+
wxString getClientLibrary()
{
/*Todo: Implement FB library per conexion */
diff --git a/src/frutils.h b/src/frutils.h
index afd79de1..2bdeff97 100644
--- a/src/frutils.h
+++ b/src/frutils.h
@@ -55,6 +55,8 @@ bool connectDatabase(Database *db, wxWindow* parent,
bool getService(Server* s, IBPP::Service& svc, ProgressIndicator* p,
bool sysdba);
+wxString unquote(const wxString& input, const wxString& quoteChar = "\"");
+
wxString getClientLibrary();
#endif // FRUTILS_H
diff --git a/src/gui/CommandIds.h b/src/gui/CommandIds.h
index dc985ba5..859682cc 100644
--- a/src/gui/CommandIds.h
+++ b/src/gui/CommandIds.h
@@ -86,6 +86,7 @@ enum {
Menu_URLBugReport,
Menu_NewObject,
Menu_DatabaseRegistrationInfo,
+ Menu_NewVolatileSQLEditor,
Menu_RegisterDatabase,
Menu_CreateDatabase,
Menu_ManageUsers,
diff --git a/src/gui/ExecuteSqlFrame.cpp b/src/gui/ExecuteSqlFrame.cpp
index 4a587701..ea9c5ee6 100644
--- a/src/gui/ExecuteSqlFrame.cpp
+++ b/src/gui/ExecuteSqlFrame.cpp
@@ -520,13 +520,18 @@ ExecuteSqlFrame::ExecuteSqlFrame(wxWindow* WXUNUSED(parent), int id,
wxString title,
DatabasePtr db, const wxPoint& pos, const wxSize& size, long style)
: BaseFrame(wxTheApp->GetTopWindow(), id, title, pos, size, style),
- Observer(), databaseM(db.get())
+ Observer(), databasePtrM(db) //changed for volatile SQL Editor, as we only have a fake server and database
{
wxASSERT(db);
+ //Need this 2 PtrM lines especifically to keep a reference for both original objects in volatile SQL Editor else the serverptr is released as soon as exists MainFrame event call
+ databaseM = databasePtrM.get();
+ serverPtrM = databasePtrM->getServer();
loadingM = true;
updateEditorCaretPosM = true;
updateFrameTitleM = true;
+ if (db->getIsVolative())
+ prepareVolatileDatabase();
transactionIsolationLevelM = static_cast(config().get("transactionIsolationLevel", 0));
transactionLockResolutionM = config().get("transactionLockResolution", true) ? IBPP::lrWait : IBPP::lrNoWait;
@@ -575,11 +580,11 @@ ExecuteSqlFrame::ExecuteSqlFrame(wxWindow* WXUNUSED(parent), int id,
do_layout();
// observe database object to close on disconnect / destruction
- databaseM->attachObserver(this, false);
+ if (!db->getIsVolative()) databaseM->attachObserver(this, false);
executedStatementsM.clear();
inTransaction(false); // enable/disable controls
- setKeywords(); // set words for autocomplete feature
+ if (!db->getIsVolative()) setKeywords(); // set words for autocomplete feature
historyPositionM = StatementHistory::get(databaseM).size();
@@ -804,7 +809,8 @@ void ExecuteSqlFrame::set_properties()
int statusbar_widths[] = { -2, 100, 60, -1 };
statusbar_1->SetStatusWidths(4, statusbar_widths);
- statusbar_1->SetStatusText(databaseM->getConnectionInfoString(), 0);
+ if ( ! databaseM->getIsVolative() )
+ statusbar_1->SetStatusText(databaseM->getConnectionInfoString(), 0);
statusbar_1->SetStatusText("Rows fetched", 1);
statusbar_1->SetStatusText("Cursor position", 2);
statusbar_1->SetStatusText("Transaction status", 3);
@@ -879,7 +885,11 @@ void ExecuteSqlFrame::doBeforeDestroy()
if (grid_data->IsCellEditControlEnabled())
grid_data->EnableCellEditControl(false);
// make sure that further calls to update() will not call Close() again
+ if (databaseM->getIsVolative() && databaseM->isConnected())
+ databaseM->disconnect();
databaseM = 0;
+ databasePtrM = 0;
+ serverPtrM = 0;
}
void ExecuteSqlFrame::showProperties(wxString objectName)
@@ -2106,6 +2116,39 @@ void ExecuteSqlFrame::clearLogBeforeExecution()
styled_text_ctrl_stats->ClearAll();
}
+void ExecuteSqlFrame::prepareVolatileDatabase(wxString hostname, wxString port, wxString path, wxString user, wxString password, wxString role, wxString charset)
+{
+ /*DatabasePtr dbM = std::make_shared();
+ ServerPtr serverPtrM = std::make_shared();
+ dbM->setServer(serverPtrM);
+ databaseM = dbM.get();*/
+ //databaseM = new Database();
+ //databaseM = std::make_shared();
+ //databaseM->setId(UINT_MAX-30);
+ //this->serverM = new Server();
+ //serverPtrM = ServerPtr(serverM);
+ ServerPtr serverPtrM = databaseM->getServer();
+ if (!serverPtrM->getHostname().compare(hostname) || !serverPtrM->getPort().compare(port) || !databaseM->getPath().compare(path) || !databaseM->getUsername().compare(user) || !databaseM->getRawPassword().compare(password) || !databaseM->getRole().compare(role) || !databaseM->getDatabaseCharset().compare(charset))
+ {
+ databaseM->disconnect();
+ transactionM = 0;
+ }
+ else
+ return;
+
+ serverPtrM->setHostname(hostname);
+ serverPtrM->setPort(port);
+
+ databaseM->setPath(path);
+ databaseM->setName_("VOLATILECONNECTION");
+ databaseM->setUsername(user);
+ databaseM->setRawPassword(password);
+ databaseM->setRole(role);
+ databaseM->setConnectionCharset(charset);
+ //databaseM->setServer(serverPtrM);
+
+}
+
void ExecuteSqlFrame::prepareAndExecute(bool prepareOnly)
{
bool hasSelection = styled_text_ctrl_sql->GetSelectionStart()
@@ -2330,7 +2373,45 @@ bool ExecuteSqlFrame::execute(wxString sql, const wxString& terminator,
log(_("Empty statement detected, bailing out..."));
return true;
}
+
+
+ SqlStatement stm(sql, databaseM, terminator);
+
+ if ((stm.getAction() == actCONNECT) || (stm.getAction() == actCREATE_DATABASE))
+ {
+ if (!databaseM->getIsVolative())
+ {
+ log(_("Cannot use 'connect' or 'create' statement in a regular SQL Script"), ttError);
+ splitScreen();
+ return false;
+ }
+ wxString connHostM, connDatabasePortM, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM; int createPageSizeM, createDialecM;
+ stm.getCONNECTION(connHostM, connDatabasePortM, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM);
+ prepareVolatileDatabase(connHostM, connDatabasePortM, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM);
+ if (stm.getAction() == actCREATE_DATABASE) {
+ createPageSizeM = stm.getCreatePageSize();
+ createDialecM = stm.getCreateDialect();
+ log(wxString::Format("Creating database: %s, port: %s, database: %s, user: %s, password: %s, role: %s, charset: %s, page size: %d, dialect %d", connHostM, connDatabasePortM, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM, createPageSizeM, createDialecM), ttSql);
+ databaseM->create(createPageSizeM, createDialecM);
+ }
+ log(wxString::Format("Connecting to host: %s, port: %s, database: %s, user: %s, password: %s, role: %s, charset: %s", connHostM, connDatabasePortM, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM), ttSql);
+ databaseM->connect(databaseM->getRawPassword());
+ return databaseM->isConnected();
+ }
+ else
+ if (stm.getAction() == actDISCONNECT)
+ {
+ if (!databaseM->getIsVolative())
+ {
+ log(_("Cannot use 'disconnect' statement in a regular SQL Script"), ttError);
+ splitScreen();
+ return false;
+ }
+ databaseM->disconnect();
+ transactionM = 0;
+ return true;
+ }
if (styled_text_ctrl_sql->AutoCompActive())
styled_text_ctrl_sql->AutoCompCancel(); // remove the list if needed
notebook_1->SetSelection(0);
@@ -2513,7 +2594,6 @@ bool ExecuteSqlFrame::execute(wxString sql, const wxString& terminator,
{
}
}
- SqlStatement stm(sql, databaseM, terminator);
if (stm.isDDL())
type = IBPP::stDDL;
executedStatementsM.push_back(stm);
diff --git a/src/gui/ExecuteSqlFrame.h b/src/gui/ExecuteSqlFrame.h
index fdcc01a6..02a165fc 100644
--- a/src/gui/ExecuteSqlFrame.h
+++ b/src/gui/ExecuteSqlFrame.h
@@ -107,9 +107,12 @@ class ExecuteSqlFrame: public BaseFrame, public Observer
typedef enum { ttNormal, ttSql, ttError } TextType;
void log(wxString s, TextType type = ttNormal); // write messages to textbox
void clearLogBeforeExecution();
+ void prepareVolatileDatabase(wxString server = "", wxString port = "3050", wxString db = "", wxString user = "", wxString password = "", wxString role = "", wxString charset = "NONE");
void splitScreen();
Database* databaseM;
+ DatabasePtr databasePtrM;
+ ServerPtr serverPtrM;
StatementHistory::Position historyPositionM;
wxString localBuffer;
diff --git a/src/gui/MainFrame.cpp b/src/gui/MainFrame.cpp
index d072455a..c6df8376 100644
--- a/src/gui/MainFrame.cpp
+++ b/src/gui/MainFrame.cpp
@@ -190,6 +190,7 @@ void MainFrame::buildMainMenu()
menuBarM = new wxMenuBar();
databaseMenuM = new wxMenu();
+ databaseMenuM->Append(Cmds::Menu_NewVolatileSQLEditor, _("Open new Volatile &SQL Editor..."));
databaseMenuM->Append(Cmds::Menu_RegisterDatabase, _("R&egister existing database..."));
databaseMenuM->Append(Cmds::Menu_CreateDatabase, _("Create &new database..."));
databaseMenuM->Append(Cmds::Menu_RestoreIntoNew, _("Restore bac&kup into new database..."));
@@ -374,6 +375,7 @@ EVT_MENU(Cmds::Menu_URLFeatureRequest, MainFrame::OnMenuURLFeatureRequest)
EVT_MENU(Cmds::Menu_URLBugReport, MainFrame::OnMenuURLBugReport)
EVT_MENU(wxID_PREFERENCES, MainFrame::OnMenuConfigure)
+EVT_MENU(Cmds::Menu_NewVolatileSQLEditor, MainFrame::OnMenuNewVolatileSQLEditor)
EVT_MENU(Cmds::Menu_RegisterDatabase, MainFrame::OnMenuRegisterDatabase)
EVT_UPDATE_UI(Cmds::Menu_RegisterDatabase, MainFrame::OnMenuUpdateIfServerSelected)
EVT_MENU(Cmds::Menu_CreateDatabase, MainFrame::OnMenuCreateDatabase)
@@ -965,6 +967,20 @@ void MainFrame::OnMenuBrowseData(wxCommandEvent& WXUNUSED(event))
treeMainM->getSelectedMetadataItem(), this);
}
+void MainFrame::OnMenuNewVolatileSQLEditor(wxCommandEvent& WXUNUSED(event))
+{
+ DatabasePtr db;
+ ServerPtr serverPtrM;
+
+ db = std::make_shared();
+ serverPtrM = std::make_shared();
+ db->setServer(serverPtrM);
+ db->setId(UINT_MAX-30);
+ db->setIsVolatile(true);
+
+ ExecuteSqlFrame* eff = new ExecuteSqlFrame(this, -1, _("Omni SQL Editor"), db);
+ eff->Show();
+}
void MainFrame::OnMenuRegisterDatabase(wxCommandEvent& WXUNUSED(event))
{
ServerPtr s = getServer(treeMainM->getSelectedMetadataItem());
diff --git a/src/gui/MainFrame.h b/src/gui/MainFrame.h
index 2efe4d5b..f9cbb898 100644
--- a/src/gui/MainFrame.h
+++ b/src/gui/MainFrame.h
@@ -57,6 +57,7 @@ class MainFrame: public BaseFrame, private URIHandler,
void OnMenuURLFeatureRequest(wxCommandEvent& event);
void OnMenuURLBugReport(wxCommandEvent& event);
void OnMenuConfigure(wxCommandEvent& event);
+ void OnMenuNewVolatileSQLEditor(wxCommandEvent& event);
void OnMenuRegisterDatabase(wxCommandEvent& event);
void OnMenuCloneDatabase(wxCommandEvent& event);
void OnMenuDatabaseRegistrationInfo(wxCommandEvent& event);
diff --git a/src/metadata/database.cpp b/src/metadata/database.cpp
index d118fcc2..609c6aee 100644
--- a/src/metadata/database.cpp
+++ b/src/metadata/database.cpp
@@ -291,7 +291,7 @@ bool DatabaseAuthenticationMode::getUseEncryptedPassword() const
// Database class
Database::Database()
: MetadataItem(ntDatabase), metadataLoaderM(0), connectedM(false),
- connectionCredentialsM(0), dialectM(3), idM(0)
+ connectionCredentialsM(0), dialectM(3), idM(0), volatileM(false)
{
defaultTimezoneM.name = "";
defaultTimezoneM.id = 0;
@@ -394,6 +394,11 @@ void Database::getDatabaseTriggers(std::vector& list)
std::back_inserter(list), std::mem_fn(&DBTriggerPtr::get));
}
+bool Database::getIsVolative()
+{
+ return volatileM;
+}
+
CharacterSetPtr Database::getCharsetById(int id)
{
// if it contains both charset and collation as 2 bytes
@@ -1888,6 +1893,11 @@ IBPP::Database& Database::getIBPPDatabase()
return databaseM;
}
+void Database::setIsVolatile(const bool isVolatile)
+{
+ volatileM = isVolatile;
+}
+
void Database::setPath(const wxString& value)
{
pathM = value;
@@ -2197,7 +2207,7 @@ void Database::getConnectedUsers(wxArrayString& users) const
{
wxString name((*it).first);
if ((*it).second > 1)
- name += wxString::Format(" (%d)", (*it).second);
+ name += wxString::Format(" (%zu)", (*it).second);
users.Add(name);
}
}
diff --git a/src/metadata/database.h b/src/metadata/database.h
index 1c4c0de4..fca797cb 100644
--- a/src/metadata/database.h
+++ b/src/metadata/database.h
@@ -164,6 +164,7 @@ class Database: public MetadataItem,
MetadataLoader* metadataLoaderM;
bool connectedM;
+ bool volatileM;
wxString databaseCharsetM;
wxString connectionUserM;
wxString connectionRoleM;
@@ -322,6 +323,7 @@ class Database: public MetadataItem,
//! gets the database triggers (FB2.1+)
void getDatabaseTriggers(std::vector& list);
+ bool getIsVolative();
wxString getPath() const;
wxString getClientLibrary() const;
int getSqlDialect() const;
@@ -335,6 +337,7 @@ class Database: public MetadataItem,
DatabaseAuthenticationMode& getAuthenticationMode();
wxString getRole() const;
IBPP::Database& getIBPPDatabase();
+ void setIsVolatile(const bool isVolatile);
void setPath(const wxString& value);
void setClientLibrary(const wxString& value);
void setConnectionCharset(const wxString& value);
diff --git a/src/sql/SqlStatement.cpp b/src/sql/SqlStatement.cpp
index 1262a73d..10186a18 100644
--- a/src/sql/SqlStatement.cpp
+++ b/src/sql/SqlStatement.cpp
@@ -36,6 +36,7 @@
#include "metadata/procedure.h"
#include "metadata/relation.h"
#include "sql/SqlStatement.h"
+#include "frutils.h"
// TOKEN LIST - a helper class
@@ -122,7 +123,7 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
actionM = actCOMMENT;
break;
case kwCREATE:
- actionM = actCREATE;
+ actionM = (tokensM[1] == kwDATABASE ? actCREATE_DATABASE : actCREATE);
break;
case kwDECLARE:
actionM = actDECLARE;
@@ -145,6 +146,12 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
actionM = actUPDATE;
objectTypeM = ntTable;
break;
+ case kwCONNECT:
+ actionM = actCONNECT;
+ break;
+ case kwDISCONNECT:
+ actionM = actDISCONNECT;
+ break;
default:
return; // true;
}
@@ -238,7 +245,7 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
}
// get object type
- while (objectTypeM == ntUnknown && typeTokenIndex < tokensM.size())
+ while (objectTypeM == ntUnknown && typeTokenIndex < tokensM.size() && actionM != actCONNECT)
{
switch (tokensM[typeTokenIndex])
{
@@ -346,10 +353,11 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
}
- if (objectTypeM == ntUnknown || !databaseM)
+ if ((objectTypeM == ntUnknown || !databaseM) && (actionM != actCONNECT))
return; // false;
- objectM = databaseM->findByNameAndType(objectTypeM, nameM.get());
+ if ( actionM != actCONNECT )
+ objectM = databaseM->findByNameAndType(objectTypeM, nameM.get());
// map "CREATE OR ALTER" and "RECREATE" to correct action
@@ -366,7 +374,7 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
if (stt != tkCOMMENT && stt != tkWHITESPACE)
{
tokensM.add(stt);
- if (stt == tkIDENTIFIER || stt == tkSTRING)
+ //if (stt == tkIDENTIFIER || stt == tkSTRING) //Wy does this if exists?
{
wxString ts(tokenizer.getCurrentTokenString());
tokenStringsM[tokensM.size() - 1] = ts;
@@ -430,6 +438,78 @@ SqlStatement::SqlStatement(const wxString& sql, Database *db, const wxString&
}
}
}
+
+ // CONNECT "[database]" password '[password]' user '[username]' role '[role=]' character set '[charset=NONE]';
+ if ((actionM == actCONNECT) || (actionM == actCREATE_DATABASE))
+ {
+ //wxString database, user, password, role, charset;
+ size_t idx = 1;
+ if (actionM == actCREATE_DATABASE)
+ idx++;
+ connPathM = unquote(tokenStringsM[idx++], "'");
+
+
+ if (connPathM.Contains(":")) //split "server/port:database"
+ {
+
+ // find ':' pos
+ int colonPos = connPathM.Find(':');
+
+
+ connServerPort = "3050";
+ connHostM = connPathM.Left(colonPos);
+ // find '/' pos
+ int slashPos = connHostM.Find('/');
+
+ if (slashPos >= 0)
+ {
+ connHostM = connPathM.Left(slashPos);
+ connServerPort = connPathM.Mid(slashPos + 1, colonPos - slashPos - 1);
+ }
+ connPathM = connPathM.Mid(colonPos + 1);
+ }
+ connUsernameM = "";
+ connPasswordM = "";
+ connRoleM = "";
+ connCharsetM = "NONE";
+ createPageSizeM = 8096;
+ createDialectM = 3;
+ while (idx < tokensM.size())
+ {
+ if (tokensM[idx] == kwUSER)
+ {
+ idx++;
+ connUsernameM = unquote(tokenStringsM[idx],"'");
+ }
+ else if (tokensM[idx] == kwPASSWORD)
+ {
+ idx++;
+ connPasswordM = unquote(tokenStringsM[idx], "'");
+ }
+ else if (tokensM[idx] == kwROLE)
+ {
+ idx++;
+ connRoleM = unquote(tokenStringsM[idx], "'");
+ }
+ else if ((tokensM[idx] == kwCHARACTER) && (tokensM[idx + 1] == kwSET) && (tokensM[idx + 2] == tkSTRING))
+ {
+ idx++; idx++; //for character and set
+ connCharsetM = unquote(tokenStringsM[idx], "'");
+ }
+ else if (tokensM[idx] == kwPAGE_SIZE)
+ {
+ idx++;
+ tokenStringsM[idx].ToInt(&createPageSizeM);
+ }
+ else if (tokensM[idx] == kwDIALECT)
+ {
+ idx++;
+ tokenStringsM[idx].ToInt(&createDialectM);
+ }
+ idx++;
+ }
+ return;
+ }
}
wxString SqlStatement::getStatement() const
@@ -465,6 +545,29 @@ bool SqlStatement::isDDL() const
&& actionM != actUPDATE);
}
+bool SqlStatement::getCONNECTION(wxString& host,wxString& port, wxString& path, wxString& user, wxString& password, wxString& role, wxString& charset)
+{
+ if ((actionM != actCONNECT) && ((actionM != actCREATE_DATABASE))) return false;
+ host = connHostM;
+ port = connServerPort;
+ path = connPathM;
+ user = connUsernameM;
+ password = connPasswordM;
+ role = connRoleM;
+ charset = connCharsetM;
+ return true;
+}
+
+int SqlStatement::getCreatePageSize() const
+{
+ return createPageSizeM;
+}
+
+int SqlStatement::getCreateDialect() const
+{
+ return createDialectM;
+}
+
bool SqlStatement::isAlterColumn() const
{
return isAlterColumnM;
diff --git a/src/sql/SqlStatement.h b/src/sql/SqlStatement.h
index 96737c10..62313ec1 100644
--- a/src/sql/SqlStatement.h
+++ b/src/sql/SqlStatement.h
@@ -36,7 +36,7 @@ class Relation;
typedef enum
{
actNONE, actALTER, actCREATE, actCREATE_OR_ALTER, actDECLARE, actDROP,
- actRECREATE, actSET, actUPDATE, actGRANT, actCOMMENT
+ actRECREATE, actSET, actUPDATE, actGRANT, actCOMMENT, actCONNECT, actDISCONNECT, actCREATE_DATABASE
} SqlAction;
class TokenList
@@ -56,6 +56,9 @@ class SqlStatement
const wxString& terminator = ";");
bool isDDL() const;
+ bool getCONNECTION(wxString& host, wxString& port, wxString& db, wxString& user, wxString& password, wxString& role, wxString& charset);
+ int getCreatePageSize() const;
+ int getCreateDialect() const;
SqlAction getAction() const;
bool actionIs(const SqlAction& act, NodeType nt = ntUnknown) const;
NodeType getObjectType() const;
@@ -84,6 +87,9 @@ class SqlStatement
bool isDatatypeM;
wxString terminatorM;
wxString statementM;
+ //CONNECT action
+ wxString connHostM, connServerPort, connPathM, connUsernameM, connPasswordM, connRoleM, connCharsetM; int createPageSizeM, createDialectM;
+
};
#endif
diff --git a/src/sql/SqlTokenizer.h b/src/sql/SqlTokenizer.h
index 4a42bcbd..7b67317e 100644
--- a/src/sql/SqlTokenizer.h
+++ b/src/sql/SqlTokenizer.h
@@ -63,7 +63,7 @@ enum SqlTokenType {
kwDATA, kwDATABASE, kwDATE, kwDATEADD, kwDATEDIFF, kwDAY, kwDB_KEY, kwDDL, kwDEC,
kwDECFLOAT, kwDECIMAL, kwDECLARE, kwDECODE, kwDECRYPT, kwDEFAULT, kwDEFINER,
kwDELETE, kwDELETING, kwDENSE_RANK, kwDESCENDING, kwDESCRIBE, kwDESCRIPTOR,
- kwDETERMINISTIC, kwDIFFERENCE, kwDISABLE, kwDISCONNECT, kwDISPLAY, kwDISTINCT,
+ kwDETERMINISTIC, kwDIALECT, kwDIFFERENCE, kwDISABLE, kwDISCONNECT, kwDISPLAY, kwDISTINCT,
kwDO, kwDOMAIN, kwDOUBLE, kwDROP,
kwECHO, kwEDIT, kwELSE, kwENABLE, kwENCRYPT, kwEND, kwENGINE, kwENTRY_POINT,