1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
/*
* Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of the
* License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include "workbench/wb_backend_public_interface.h"
#include "sqlide/wb_live_schema_tree.h"
#include "sqlide/db_sql_editor_log.h" // for RowId
#include "grt/grt_threaded_task.h"
#include "grts/structs.db.h"
#include "grts/structs.db.mgmt.h"
#include "grts/structs.db.mysql.h"
#include "grtpp_notifications.h"
#include <boost/enable_shared_from_this.hpp>
class SqlEditorForm;
namespace bec {
class GRTManager;
class DBObjectEditorBE;
};
namespace mforms {
class View;
class Box;
class Splitter;
class TabView;
class HyperText;
class MenuItem;
};
namespace wb {
class SimpleSidebar;
}
class MYSQLWBBACKEND_PUBLIC_FUNC SqlEditorTreeController : public base::trackable,
public grt::GRTObserver,
public wb::LiveSchemaTree::FetchDelegate, public wb::LiveSchemaTree::Delegate,
public boost::enable_shared_from_this<SqlEditorTreeController>
{
#if defined(ENABLE_TESTING)
friend class EditorFormTester;
#endif
friend class db_query_EditorConcreteImplData;
public:
static boost::shared_ptr<SqlEditorTreeController> create(SqlEditorForm *owner);
virtual ~SqlEditorTreeController();
void finish_init();
void prepare_close();
private:
SqlEditorTreeController(SqlEditorForm *owner);
SqlEditorForm *_owner;
bec::GRTManager *_grtm;
wb::SimpleSidebar *_schema_side_bar;
wb::SimpleSidebar *_admin_side_bar;
mforms::TabView *_task_tabview;
mforms::Box *_taskbar_box;
wb::LiveSchemaTree *_schema_tree;
wb::LiveSchemaTree _base_schema_tree;
wb::LiveSchemaTree _filtered_schema_tree;
base::Mutex _schema_contents_mutex;
GrtThreadedTask::Ref live_schema_fetch_task;
GrtThreadedTask::Ref live_schemata_refresh_task;
bool _is_refreshing_schema_tree;
bool _unified_mode;
bool _use_show_procedure;
mforms::Splitter *_side_splitter;
mforms::TabView *_info_tabview;
mforms::HyperText *_object_info;
mforms::HyperText *_session_info;
boost::signals2::scoped_connection _splitter_connection;
// Observer
virtual void handle_grt_notification(const std::string &name, grt::ObjectRef sender, grt::DictRef info);
// LiveSchemaTree::FetchDelegate
virtual std::list<std::string> fetch_schema_list();
virtual bool fetch_data_for_filter(const std::string &schema_filter, const std::string &object_filter, const wb::LiveSchemaTree::NewSchemaContentArrivedSlot &arrived_slot);
virtual bool fetch_schema_contents(const std::string &schema_name, const wb::LiveSchemaTree::NewSchemaContentArrivedSlot &arrived_slot);
virtual bool fetch_object_details(const std::string& schema_name, const std::string& object_name, wb::LiveSchemaTree::ObjectType type, short flags, const wb::LiveSchemaTree::NodeChildrenUpdaterSlot&);
virtual bool fetch_routine_details(const std::string& schema_name, const std::string& obj_name, wb::LiveSchemaTree::ObjectType type);
// LiveSchemaTree::Delegate
virtual void tree_refresh();
virtual bool sidebar_action(const std::string&);
virtual void tree_activate_objects(const std::string&, const std::vector<wb::LiveSchemaTree::ChangeRecord>& changes);
public:
virtual void tree_create_object(wb::LiveSchemaTree::ObjectType type, const std::string &schema_name, const std::string &obj_name);
std::string generate_alter_script(const db_mgmt_RdbmsRef &rdbms, db_DatabaseObjectRef db_object, std::string algorithm, std::string lock);
private:
grt::StringRef do_fetch_live_schema_contents(grt::GRT *grt, boost::weak_ptr<SqlEditorTreeController> self_ptr, const std::string &schema_name, wb::LiveSchemaTree::NewSchemaContentArrivedSlot arrived_slot);
wb::LiveSchemaTree::ObjectType fetch_object_type(const std::string& schema_name, const std::string& obj_name);
void fetch_column_data(const std::string& schema_name, const std::string& obj_name, wb::LiveSchemaTree::ObjectType type, const wb::LiveSchemaTree::NodeChildrenUpdaterSlot &updater_slot);
void fetch_trigger_data(const std::string& schema_name, const std::string& obj_name, wb::LiveSchemaTree::ObjectType type, const wb::LiveSchemaTree::NodeChildrenUpdaterSlot &updater_slot);
void fetch_index_data(const std::string& schema_name, const std::string& obj_name, wb::LiveSchemaTree::ObjectType type, const wb::LiveSchemaTree::NodeChildrenUpdaterSlot &updater_slot);
void fetch_foreign_key_data(const std::string& schema_name, const std::string& obj_name, wb::LiveSchemaTree::ObjectType type, const wb::LiveSchemaTree::NodeChildrenUpdaterSlot &updater_slot);
grt::StringRef do_fetch_data_for_filter(grt::GRT *grt, boost::weak_ptr<SqlEditorTreeController> self_ptr, const std::string &schema_filter, const std::string &object_filter, wb::LiveSchemaTree::NewSchemaContentArrivedSlot arrived_slot);
void schema_row_selected();
void side_bar_filter_changed(const std::string& filter);
void sidebar_splitter_changed();
void context_menu_will_show(mforms::MenuItem *parent_item);
public:
void refresh_live_object_in_editor(bec::DBObjectEditorBE* obj_editor, bool using_old_name);
void refresh_live_object_in_overview(wb::LiveSchemaTree::ObjectType type, const std::string schema_name, const std::string old_obj_name, const std::string new_obj_name);
void on_active_schema_change(const std::string &schema);
void mark_busy(bool busy);
void open_alter_object_editor(db_DatabaseObjectRef object, db_CatalogRef server_state_catalog);
private:
grt::StringRef do_refresh_schema_tree_safe(grt::GRT *grt, boost::weak_ptr<SqlEditorForm> self_ptr);
int insert_text_to_active_editor(const std::string& str);
private:
void do_alter_live_object(wb::LiveSchemaTree::ObjectType type, const std::string &schema_name, const std::string &obj_name);
std::string run_execute_routine_wizard(wb::LiveSchemaTree::ObjectType type, const std::string &schema_name, const std::string &obj_name);
std::string get_object_ddl_script(wb::LiveSchemaTree::ObjectType type, const std::string &schema_name, const std::string &obj_name);
std::pair<std::string, std::string> get_object_create_script(wb::LiveSchemaTree::ObjectType type,
const std::string &schema_name, const std::string &obj_name);
std::vector<std::string> get_trigger_sql_for_table(const std::string &schema_name, const std::string &table_name);
bool parse_ddl_into_catalog(db_mysql_CatalogRef catalog, const std::string &objectDescription,
const std::string &sql, std::string sqlMode, const std::string &schema);
public:
void schema_object_activated(const std::string &action, wb::LiveSchemaTree::ObjectType type, const std::string &schema, const std::string &name);
bool apply_changes_to_object(bec::DBObjectEditorBE* obj_editor, bool dry_run);
mforms::View *get_sidebar();
wb::LiveSchemaTree *get_schema_tree();
void request_refresh_schema_tree();
public:
void create_live_table_stubs(bec::DBObjectEditorBE *table_editor);
bool expand_live_table_stub(bec::DBObjectEditorBE *table_editor, const std::string &schema_name, const std::string &obj_name);
public:
bool activate_live_object(GrtObjectRef object);
private:
db_SchemaRef create_new_schema(db_CatalogRef owner);
db_TableRef create_new_table(db_SchemaRef owner);
db_ViewRef create_new_view(db_SchemaRef owner);
db_RoutineRef create_new_routine(db_SchemaRef owner, wb::LiveSchemaTree::ObjectType type);
};
|