rxcms-dbms_plugin 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +29 -0
- data/app/assets/javascripts/alliance_dbms_plugin/configure.js +555 -0
- data/app/assets/javascripts/alliance_dbms_plugin/index.js +7 -0
- data/app/assets/javascripts/alliance_dbms_plugin/installer.js +101 -0
- data/app/assets/stylesheets/dbms_engine.css +4 -0
- data/app/assets/stylesheets/dbms_installer.css +4 -0
- data/app/controllers/dbms_connection_controller.rb +291 -0
- data/app/controllers/dbms_engine_controller.rb +70 -0
- data/app/controllers/dbms_installer_controller.rb +138 -0
- data/app/controllers/dbms_services_controller.rb +33 -0
- data/app/helpers/dbms_engine_helper.rb +49 -0
- data/app/helpers/dbms_installer_helper.rb +2 -0
- data/app/helpers/dbms_plugin_helper.rb +30 -0
- data/app/models/database.rb +47 -0
- data/app/views/dbms_engine/configure.html.erb +165 -0
- data/app/views/dbms_engine/index.html.erb +1 -0
- data/app/views/dbms_engine/installer.html.erb +55 -0
- data/config/dbms/dbms_config.yml +8 -0
- data/config/routes.rb +25 -0
- data/db/migrate/20130828071533_create_databases.rb +8 -0
- data/lib/rxcms-dbms_plugin/classes/executor.rb +153 -0
- data/lib/rxcms-dbms_plugin/engine.rb +14 -0
- data/lib/rxcms-dbms_plugin/version.rb +3 -0
- data/lib/rxcms-dbms_plugin.rb +5 -0
- data/lib/tasks/rxcms-dbms_plugin_tasks.rake +4 -0
- metadata +174 -0
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module DbmsEngineHelper
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def persist_connection
         | 
| 4 | 
            +
                SymmetricEncryption.load!
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                if (ActiveRecord::Base.connection == Database.connection)
         | 
| 7 | 
            +
                  adapter = !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_ADAPTER], session[:accessible_appid]] }).nil? ? Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_ADAPTER], session[:accessible_appid]] }).value : nil
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  if (!adapter.nil?)
         | 
| 10 | 
            +
                    if (adapter == 'sqlite')
         | 
| 11 | 
            +
                      if (Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], session[:accessible_appid]] }).nil?)
         | 
| 12 | 
            +
                        raise "database malformed"
         | 
| 13 | 
            +
                      end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      connectionResult = Database.connect_sqlite(Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], session[:accessible_appid]] }).value)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                      if (!connectionResult)
         | 
| 18 | 
            +
                        raise "connection malformed or altered"
         | 
| 19 | 
            +
                      end
         | 
| 20 | 
            +
                    else
         | 
| 21 | 
            +
                      if (Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], session[:accessible_appid]] }).nil? ||
         | 
| 22 | 
            +
                          Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], session[:accessible_appid]] }).nil? ||
         | 
| 23 | 
            +
                          Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], session[:accessible_appid]] }).nil? ||
         | 
| 24 | 
            +
                          Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], session[:accessible_appid]] }).nil? ||
         | 
| 25 | 
            +
                          Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], session[:accessible_appid]] }).nil?)
         | 
| 26 | 
            +
                        raise "host, database, user or password malformed"
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      connectionResult = Database.connect_sql(Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_ADAPTER], session[:accessible_appid]] }).value,
         | 
| 30 | 
            +
                                                              Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], session[:accessible_appid]] }).value,
         | 
| 31 | 
            +
                                                              Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], session[:accessible_appid]] }).value,
         | 
| 32 | 
            +
                                                              Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], session[:accessible_appid]] }).value,
         | 
| 33 | 
            +
                                                              Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], session[:accessible_appid]] }).value,
         | 
| 34 | 
            +
                                                              Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], session[:accessible_appid]] }).value)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      if (!connectionResult)
         | 
| 37 | 
            +
                        raise "connection malformed or altered"
         | 
| 38 | 
            +
                      end
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                  else
         | 
| 41 | 
            +
                    raise "adapter malformed"
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                else
         | 
| 44 | 
            +
                  logger.debug("[dbms-plugin] Not persisting connection")
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module DbmsPluginHelper
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def current_user
         | 
| 4 | 
            +
                if UserSession.find.nil?
         | 
| 5 | 
            +
                  @current_user ||= nil
         | 
| 6 | 
            +
                else
         | 
| 7 | 
            +
                  @current_user ||= User.find(UserSession.find.record.id)
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              # Get current user's role
         | 
| 12 | 
            +
              def get_current_user_role
         | 
| 13 | 
            +
                @current_user = current_user
         | 
| 14 | 
            +
                if (!@current_user.nil?)
         | 
| 15 | 
            +
                  siteId = session[:accessible_appid]
         | 
| 16 | 
            +
                  roleId = session[:accessible_roleid]
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  if (!siteId.nil? && !roleId.nil?)
         | 
| 19 | 
            +
                    userRole = Role.find(roleId)
         | 
| 20 | 
            +
                    @curUserRole = userRole.name
         | 
| 21 | 
            +
                  else
         | 
| 22 | 
            +
                    @curUserRole = 'loggedin'
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                else
         | 
| 26 | 
            +
                  @curUserRole = 'anonymous'
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            class Database < ActiveRecord::Base
         | 
| 2 | 
            +
              @@conn = nil
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              def self.connect_sql(adapter, host, port, username, password, database)
         | 
| 5 | 
            +
                SymmetricEncryption.load!
         | 
| 6 | 
            +
                # Load configuration items (MANDATORY, must be included)
         | 
| 7 | 
            +
                app_config = HashWithIndifferentAccess.new(YAML.load(File.read(File.expand_path('../../../config/dbms/dbms_config.yml', __FILE__))))
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                begin
         | 
| 10 | 
            +
                  decryptedPassword = SymmetricEncryption.decrypt(password)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  establish_connection(
         | 
| 13 | 
            +
                      :adapter  => adapter,
         | 
| 14 | 
            +
                      :host     => host,
         | 
| 15 | 
            +
                      :port     => port.to_i,
         | 
| 16 | 
            +
                      :username => username,
         | 
| 17 | 
            +
                      :password => decryptedPassword,
         | 
| 18 | 
            +
                      :database => database
         | 
| 19 | 
            +
                  )
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  if (self.connection.nil?)
         | 
| 22 | 
            +
                    return false
         | 
| 23 | 
            +
                  else
         | 
| 24 | 
            +
                    return true
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                rescue
         | 
| 27 | 
            +
                  return false
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def self.connect_sqlite(path)
         | 
| 32 | 
            +
                begin
         | 
| 33 | 
            +
                  establish_connection(
         | 
| 34 | 
            +
                      :adapter => "sqlite3",
         | 
| 35 | 
            +
                      :database => path
         | 
| 36 | 
            +
                  )
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  if (self.connection.nil?)
         | 
| 39 | 
            +
                    return false
         | 
| 40 | 
            +
                  else
         | 
| 41 | 
            +
                    return true
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                rescue
         | 
| 44 | 
            +
                  return false
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| @@ -0,0 +1,165 @@ | |
| 1 | 
            +
            <!-- Store Query Modal -->
         | 
| 2 | 
            +
            <div id="storeQueryModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
         | 
| 3 | 
            +
              <div class="modal-header">
         | 
| 4 | 
            +
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
         | 
| 5 | 
            +
                <h3 id="myModalLabel">Save Query</h3>
         | 
| 6 | 
            +
              </div>
         | 
| 7 | 
            +
              <div class="modal-body">
         | 
| 8 | 
            +
                <div class="row-fluid">
         | 
| 9 | 
            +
                  <div class="span3">
         | 
| 10 | 
            +
                    <div style="padding:2px 0 2px 0;">Stored Query Key</div>
         | 
| 11 | 
            +
                  </div>
         | 
| 12 | 
            +
                  <div class="span8">
         | 
| 13 | 
            +
                    <input type="text" id="storedQueryKey" />
         | 
| 14 | 
            +
                  </div>
         | 
| 15 | 
            +
                </div>
         | 
| 16 | 
            +
              </div>
         | 
| 17 | 
            +
              <div class="modal-footer">
         | 
| 18 | 
            +
                <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
         | 
| 19 | 
            +
                <button class="btn btn-primary" id="processStoreQueryModalBtn">process...</button>
         | 
| 20 | 
            +
              </div>
         | 
| 21 | 
            +
            </div>
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            <!-- Language Modal -->
         | 
| 24 | 
            +
            <div id="storeQueryLanguageModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
         | 
| 25 | 
            +
              <div class="modal-header">
         | 
| 26 | 
            +
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
         | 
| 27 | 
            +
                <h3 id="myModalLabel">Change locale for query</h3>
         | 
| 28 | 
            +
              </div>
         | 
| 29 | 
            +
              <div class="modal-body">
         | 
| 30 | 
            +
                <p><select id="storeQueryLanguageSelect">
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                </select></p>
         | 
| 33 | 
            +
              </div>
         | 
| 34 | 
            +
              <div class="modal-footer">
         | 
| 35 | 
            +
                <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
         | 
| 36 | 
            +
              </div>
         | 
| 37 | 
            +
            </div>
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            <div class="container">
         | 
| 40 | 
            +
              <ul id="dbmsConfigureTabs" class="nav nav-tabs">
         | 
| 41 | 
            +
                <li class="active"><a href="#home" data-toggle="tab">Configuration</a></li>
         | 
| 42 | 
            +
                <li id="dataManagementConsole" class="dropdown">
         | 
| 43 | 
            +
                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">Operations <b class="caret"></b></a>
         | 
| 44 | 
            +
                  <ul class="dropdown-menu">
         | 
| 45 | 
            +
                    <li><a href="#dataMapping" data-toggle="tab">Data Mapping</a></li>
         | 
| 46 | 
            +
                  </ul>
         | 
| 47 | 
            +
                </li>
         | 
| 48 | 
            +
                <li><a href="#uninstall" data-toggle="tab">Uninstall</a></li>
         | 
| 49 | 
            +
              </ul>
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              <div id="myTabContent" class="tab-content">
         | 
| 52 | 
            +
                <div class="tab-pane fade in active" id="home">
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  <h4>Please provide your database connection and credentials</h4>
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  <div class="input-prepend">
         | 
| 57 | 
            +
                    <span class="add-on">DBMS Type</span>
         | 
| 58 | 
            +
                    <select id="dbmsTypeSelect" style="margin-left:5px;">
         | 
| 59 | 
            +
                        <option value=""></option>
         | 
| 60 | 
            +
                        <option value="mysql2">MySQL</option>
         | 
| 61 | 
            +
                        <!--<option value="sqlite">SQLite</option>-->
         | 
| 62 | 
            +
                        <option value="postgresql">PostgreSQL</option>
         | 
| 63 | 
            +
                    </select>
         | 
| 64 | 
            +
                  </div>
         | 
| 65 | 
            +
                  <br />
         | 
| 66 | 
            +
                  <div class="connectorContainer" id="sql" style="display:none;">
         | 
| 67 | 
            +
                      <div class="input-prepend">
         | 
| 68 | 
            +
                        <span class="add-on">Connection URL</span>
         | 
| 69 | 
            +
                        <input class="span2" id="hostTxt" type="text" placeholder="host...">
         | 
| 70 | 
            +
                      </div>
         | 
| 71 | 
            +
                      <br />
         | 
| 72 | 
            +
                      <div class="input-prepend">
         | 
| 73 | 
            +
                        <span class="add-on">Connection Host</span>
         | 
| 74 | 
            +
                        <input class="span2" id="portTxt" type="text" placeholder="port...">
         | 
| 75 | 
            +
                      </div>
         | 
| 76 | 
            +
                      <br />
         | 
| 77 | 
            +
                      <div class="input-prepend">
         | 
| 78 | 
            +
                        <span class="add-on">Database Name</span>
         | 
| 79 | 
            +
                        <input class="span2" id="dbTxt" type="text" placeholder="database name...">
         | 
| 80 | 
            +
                      </div>
         | 
| 81 | 
            +
                      <br />
         | 
| 82 | 
            +
                      <div class="input-prepend">
         | 
| 83 | 
            +
                        <span class="add-on">Login</span>
         | 
| 84 | 
            +
                        <input class="span2" id="userTxt" type="text" placeholder="username">
         | 
| 85 | 
            +
                      </div>
         | 
| 86 | 
            +
                      <br />
         | 
| 87 | 
            +
                      <div class="input-prepend">
         | 
| 88 | 
            +
                        <span class="add-on">Password</span>
         | 
| 89 | 
            +
                        <input class="span2" id="passwordTxt" type="password" placeholder="password">
         | 
| 90 | 
            +
                      </div>
         | 
| 91 | 
            +
                      <br />
         | 
| 92 | 
            +
                      <button type="button" id="sqlProceedBtn" class="btn btn-danger sqlProceedBtn">proceed</button>
         | 
| 93 | 
            +
                  </div>
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  <!--<div class="connectorContainer" id="sqlite" style="display:none;">
         | 
| 96 | 
            +
                    <div class="input-prepend">
         | 
| 97 | 
            +
                      <span class="add-on">Database</span>
         | 
| 98 | 
            +
                      <input class="span2" id="prependedInput" type="text" placeholder="url to your sqlite db">
         | 
| 99 | 
            +
                    </div>
         | 
| 100 | 
            +
                    <br />
         | 
| 101 | 
            +
                    <button type="button" id="sqliteProceedBtn" class="btn btn-danger sqlProceedBtn">proceed</button>
         | 
| 102 | 
            +
                  </div>-->
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                </div>
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                <div class="tab-pane fade" id="dataMapping">
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  <div class="row-fluid">
         | 
| 109 | 
            +
                    <div class="span3">
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                        <label class="control-label">Stored Queries</label>
         | 
| 112 | 
            +
                        <ul class="nav nav-tabs nav-stacked" id="storeQueryList">
         | 
| 113 | 
            +
                          <li id="storeQueryDummy" style="display:none;"><a href="#"><input type="checkbox" style="margin:-2px 5px 0 0;" /><span></span> <span>(x)</span></a></li>
         | 
| 114 | 
            +
                        </ul>
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    </div>
         | 
| 117 | 
            +
                    <div class="span9">
         | 
| 118 | 
            +
                      <div>
         | 
| 119 | 
            +
                          <!-- Textarea -->
         | 
| 120 | 
            +
                          <div class="control-group">
         | 
| 121 | 
            +
                            <label class="control-label">SQL Command</label>
         | 
| 122 | 
            +
                            <div class="controls">
         | 
| 123 | 
            +
                              <textarea id="sqlQueryTxt" name="textarea" style="width:97%;height:96px;font-family:'Courier New', sans-serif;" placeholder="SQL Query here"></textarea>
         | 
| 124 | 
            +
                            </div>
         | 
| 125 | 
            +
                          </div>
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                          <!-- Button -->
         | 
| 128 | 
            +
                          <div class="control-group">
         | 
| 129 | 
            +
                            <div class="controls">
         | 
| 130 | 
            +
                              <button id="executeSqlBtn" name="singlebutton" class="btn btn-primary">test</button>
         | 
| 131 | 
            +
                              <button id="saveSqlBtn" name="singlebutton" class="btn btn-primary" disabled="disabled">save query</button>
         | 
| 132 | 
            +
                              <button id="updateSqlBtn" name="singlebutton" class="btn btn-primary" disabled="disabled" style="display:none;">update query</button>
         | 
| 133 | 
            +
                              <button id="localeSqlBtn" name="singlebutton" class="btn btn-primary" style="display:none;">language</button>
         | 
| 134 | 
            +
                            </div>
         | 
| 135 | 
            +
                          </div>
         | 
| 136 | 
            +
                      </div>
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                      <div>
         | 
| 139 | 
            +
                        <table class="table table-striped" id="resultTable">
         | 
| 140 | 
            +
                          <thead>
         | 
| 141 | 
            +
                          <tr>
         | 
| 142 | 
            +
                            <!-- HEADER GOES HERE -->
         | 
| 143 | 
            +
                          </tr>
         | 
| 144 | 
            +
                          </thead>
         | 
| 145 | 
            +
                          <tbody>
         | 
| 146 | 
            +
                            <!-- BODY GOES HERE -->
         | 
| 147 | 
            +
                          </tbody>
         | 
| 148 | 
            +
                        </table>
         | 
| 149 | 
            +
                      </div>
         | 
| 150 | 
            +
                    </div>
         | 
| 151 | 
            +
                  </div>
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                </div>
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                <div class="tab-pane fade" id="uninstall" >
         | 
| 156 | 
            +
                  <div>
         | 
| 157 | 
            +
                    <button id="uninstallBtn" type="button" class="btn btn-danger">Uninstall</button>
         | 
| 158 | 
            +
                  </div>
         | 
| 159 | 
            +
                </div>
         | 
| 160 | 
            +
             | 
| 161 | 
            +
              </div>
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            </div>
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            <%= javascript_include_tag "alliance_dbms_plugin/configure" %>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <h1>This is the readme page of Alliance CMS DBMS Plugin</h1>
         | 
| @@ -0,0 +1,55 @@ | |
| 1 | 
            +
             <div class="container">
         | 
| 2 | 
            +
              <div>
         | 
| 3 | 
            +
                <h4>Please provide your database connection and credentials</h4>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                <div class="input-prepend">
         | 
| 6 | 
            +
                  <span class="add-on">DBMS Type</span>
         | 
| 7 | 
            +
                  <select id="dbmsTypeSelect" style="margin-left:5px;">
         | 
| 8 | 
            +
                    <option value=""></option>
         | 
| 9 | 
            +
                    <option value="mysql2">MySQL</option>
         | 
| 10 | 
            +
                    <!--<option value="sqlite">SQLite</option>-->
         | 
| 11 | 
            +
                    <option value="postgresql">PostgreSQL</option>
         | 
| 12 | 
            +
                  </select>
         | 
| 13 | 
            +
                </div>
         | 
| 14 | 
            +
                <br />
         | 
| 15 | 
            +
                <div class="connectorContainer" id="sql" style="display:none;">
         | 
| 16 | 
            +
                  <div class="input-prepend">
         | 
| 17 | 
            +
                    <span class="add-on">Connection URL</span>
         | 
| 18 | 
            +
                    <input class="span2" id="hostTxt" type="text" placeholder="host...">
         | 
| 19 | 
            +
                  </div>
         | 
| 20 | 
            +
                  <br />
         | 
| 21 | 
            +
                  <div class="input-prepend">
         | 
| 22 | 
            +
                    <span class="add-on">Connection Port</span>
         | 
| 23 | 
            +
                    <input class="span2" id="portTxt" type="text" placeholder="port...">
         | 
| 24 | 
            +
                  </div>
         | 
| 25 | 
            +
                  <br />
         | 
| 26 | 
            +
                  <div class="input-prepend">
         | 
| 27 | 
            +
                    <span class="add-on">Database Name</span>
         | 
| 28 | 
            +
                    <input class="span2" id="dbTxt" type="text" placeholder="database name...">
         | 
| 29 | 
            +
                  </div>
         | 
| 30 | 
            +
                  <br />
         | 
| 31 | 
            +
                  <div class="input-prepend">
         | 
| 32 | 
            +
                    <span class="add-on">Login</span>
         | 
| 33 | 
            +
                    <input class="span2" id="userTxt" type="text" placeholder="username">
         | 
| 34 | 
            +
                  </div>
         | 
| 35 | 
            +
                  <br />
         | 
| 36 | 
            +
                  <div class="input-prepend">
         | 
| 37 | 
            +
                    <span class="add-on">Password</span>
         | 
| 38 | 
            +
                    <input class="span2" id="passwordTxt" type="password" placeholder="password">
         | 
| 39 | 
            +
                  </div>
         | 
| 40 | 
            +
                  <br />
         | 
| 41 | 
            +
                  <button type="button" id="sqlProceedBtn" class="btn btn-danger sqlProceedBtn">proceed</button>
         | 
| 42 | 
            +
                </div>
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                <!--<div class="connectorContainer" id="sqlite" style="display:none;">
         | 
| 45 | 
            +
                  <div class="input-prepend">
         | 
| 46 | 
            +
                    <span class="add-on">Database</span>
         | 
| 47 | 
            +
                    <input class="span2" id="dbTxtSqlite" type="text" placeholder="url to your sqlite db">
         | 
| 48 | 
            +
                  </div>
         | 
| 49 | 
            +
                  <br />
         | 
| 50 | 
            +
                  <button type="button" id="sqliteProceedBtn" class="btn btn-danger sqlProceedBtn">proceed</button>
         | 
| 51 | 
            +
                </div>-->
         | 
| 52 | 
            +
              </div>
         | 
| 53 | 
            +
            </div>
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            <%= javascript_include_tag "alliance_dbms_plugin/installer" %>
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            DBMS_CURRENT_ADAPTER : dbmsCurrentAdapter
         | 
| 2 | 
            +
            DBMS_CURRENT_HOST : dbmsCurrentHost
         | 
| 3 | 
            +
            DBMS_CURRENT_PORT : dbmsCurrentPort
         | 
| 4 | 
            +
            DBMS_CURRENT_DATABASE : dbmsCurrentDatabase
         | 
| 5 | 
            +
            DBMS_CURRENT_USER : dbmsCurrentUser
         | 
| 6 | 
            +
            DBMS_CURRENT_PASSWORD : dbmsCurrentPassword
         | 
| 7 | 
            +
            DBMS_CAT_CONFIG : dbms_config
         | 
| 8 | 
            +
            DBMS_CAT_STORED_QUERY : dbms_stored_query
         | 
    
        data/config/routes.rb
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            Rails.application.routes.draw do
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              get "/dbms/engine/readme" => "dbms_engine#index"
         | 
| 4 | 
            +
              get "/dbms/engine/configure" => "dbms_engine#configure"
         | 
| 5 | 
            +
              get "/dbms/engine/installer" => "dbms_engine#installer"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              post "/dbms/installer/before_process" => "dbms_installer#before_process"
         | 
| 8 | 
            +
              post "/dbms/installer/core_process" => "dbms_installer#core_process"
         | 
| 9 | 
            +
              post "/dbms/installer/post_process" => "dbms_installer#post_process"
         | 
| 10 | 
            +
              post "/dbms/installer/uninstall" => "dbms_installer#uninstall"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              get "/dbms/connection/status" => "dbms_connection#getConnectionStatus"
         | 
| 13 | 
            +
              post "/dbms/connection/make" => "dbms_connection#makeNewConnection"
         | 
| 14 | 
            +
              get "/dbms/connection/tables" => "dbms_connection#getListOfTables"
         | 
| 15 | 
            +
              post "/dbms/connection/sql" => "dbms_connection#executeSQL"
         | 
| 16 | 
            +
              post "/dbms/connection/query/store" => "dbms_connection#addStoredQuery"
         | 
| 17 | 
            +
              get "/dbms/connection/query/all" => "dbms_connection#getListOfStoredQueries"
         | 
| 18 | 
            +
              get "/dbms/connection/query/one/:id/:cat" => "dbms_connection#getOneStoredQueryInfos"
         | 
| 19 | 
            +
              put "/dbms/connection/query/update/:id" => "dbms_connection#updateStoredQuery"
         | 
| 20 | 
            +
              delete "/dbms/connection/query/delete/:id" => "dbms_connection#deleteStoredQuery"
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # Service Route
         | 
| 23 | 
            +
              get "/ext/dbms/:key" => "dbms_services#execute"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,153 @@ | |
| 1 | 
            +
            module RxcmsDbmsPlugin
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              class Executor
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Tag syntax [[<<placeholder>>? &type="stored-query" &data="<<data-source>>" &attrs="<<attr-data>>"...]]
         | 
| 6 | 
            +
                def self.execute(placeholder, attrs, exts)
         | 
| 7 | 
            +
                  begin
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    dbms_config = HashWithIndifferentAccess.new(YAML.load(File.read(File.expand_path("../../../../config/dbms/dbms_config.yml", __FILE__))))
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    if attrs.has_key?('configs')
         | 
| 12 | 
            +
                      if attrs['configs'].has_key?('type')
         | 
| 13 | 
            +
                        if attrs['configs']['type'] == 'stored-query'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                          if (ActiveRecord::Base.connection == Database.connection)
         | 
| 16 | 
            +
                            if (!Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], ext[:appid]] }).nil? &&
         | 
| 17 | 
            +
                                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], ext[:appid]] }).nil? &&
         | 
| 18 | 
            +
                                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], ext[:appid]] }).nil? &&
         | 
| 19 | 
            +
                                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], ext[:appid]] }).nil? &&
         | 
| 20 | 
            +
                                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], ext[:appid]] }).nil?)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                              connectionResult = Database.connect_sql(Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_ADAPTER], ext[:appid]] }).value,
         | 
| 23 | 
            +
                                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], ext[:appid]] }).value,
         | 
| 24 | 
            +
                                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], ext[:appid]] }).value,
         | 
| 25 | 
            +
                                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], ext[:appid]] }).value,
         | 
| 26 | 
            +
                                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], ext[:appid]] }).value,
         | 
| 27 | 
            +
                                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], ext[:appid]] }).value)
         | 
| 28 | 
            +
                              if (!connectionResult)
         | 
| 29 | 
            +
                                return "{{[alliance_dbms - #{placeholder.key}] Unable to establish connection to database}}"
         | 
| 30 | 
            +
                              end
         | 
| 31 | 
            +
                            else
         | 
| 32 | 
            +
                              return "{{[alliance_dbms - #{placeholder.key}] Missing important keys to establish connection}}"
         | 
| 33 | 
            +
                            end
         | 
| 34 | 
            +
                          end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                          if attrs['configs'].has_key?('data')
         | 
| 37 | 
            +
                            tQueryItem = Metadata.all({ :conditions => ['key = ? and sites_id = ?', attrs['configs']['data'], ext[:appid]] })
         | 
| 38 | 
            +
                            languageSwitchable = Metadata.first({ :conditions => ['key = ? and sites_id = ?', 'autoLanguageSwitch'. ext[:appid]] })
         | 
| 39 | 
            +
                            queryItem = nil
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                            tQueryItem.each do |query|
         | 
| 42 | 
            +
                              tQueryItemJsonObject = ActiveSupport::JSON.decode(SymmetricEncryption.decrypt(query.value))
         | 
| 43 | 
            +
                              tQueryItemJsonObjectLanguage = tQueryItemJsonObject['language'].scan(/^[a-z]{2}/).first
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                              if (!languageSwitchable.nil?)
         | 
| 46 | 
            +
                                if (languageSwitchable.value == 'yes')
         | 
| 47 | 
            +
                                  if (exts[:language] == tQueryItemJsonObjectLanguage)
         | 
| 48 | 
            +
                                    queryItem = query
         | 
| 49 | 
            +
                                    break
         | 
| 50 | 
            +
                                  end
         | 
| 51 | 
            +
                                elsif (languageSwitchable.value == 'no')
         | 
| 52 | 
            +
                                  if ('no' == tQueryItemJsonObjectLanguage)
         | 
| 53 | 
            +
                                    queryItem = query
         | 
| 54 | 
            +
                                    break
         | 
| 55 | 
            +
                                  end
         | 
| 56 | 
            +
                                else
         | 
| 57 | 
            +
                                  return "{{alliance-dbms - #{placeholder.key} the \"value\" for language switchability is invalid}}"
         | 
| 58 | 
            +
                                end
         | 
| 59 | 
            +
                              else
         | 
| 60 | 
            +
                                return "{{alliance-dbms - #{placeholder.key} Language switchability is not available}}"
         | 
| 61 | 
            +
                              end
         | 
| 62 | 
            +
                            end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                            if (!queryItem.nil?)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                              queryItemJsonObject = ActiveSupport::JSON.decode(SymmetricEncryption.decrypt(queryItem.value))
         | 
| 67 | 
            +
                              queryItemJsonData = Database.connection.select_all(queryItemJsonObject['sql'])
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                              if (attrs['configs'].has_key?('tple') && attrs['configs'].has_key?('tplo'))
         | 
| 70 | 
            +
                                # if it is alternate template
         | 
| 71 | 
            +
                                contentResult = ''
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                                queryItemEvenTemplate = Metadata.find_by_key(attrs['configs']['tple'])
         | 
| 74 | 
            +
                                queryItemOddTemplate = Metadata.find_by_key(attrs['configs']['tplo'])
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                                if (!queryItemEvenTemplate.nil? && !queryItemOddTemplate.nil?)
         | 
| 77 | 
            +
                                  tplCount = 0
         | 
| 78 | 
            +
                                  queryItemJsonData.each do |q|
         | 
| 79 | 
            +
                                    itemTemplate = ''
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                                    if (tplCount % 2 == 0)
         | 
| 82 | 
            +
                                      itemTemplate = queryItemEvenTemplate.value.strip
         | 
| 83 | 
            +
                                    else
         | 
| 84 | 
            +
                                      itemTemplate = queryItemOddTemplate.value.strip
         | 
| 85 | 
            +
                                    end
         | 
| 86 | 
            +
                                    parsedObjs = itemTemplate.scan(/\[\[\$[a-zA-Z\-_]+\]\]/)
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                                    parsedObjs.each do |p|
         | 
| 89 | 
            +
                                      tpObj = p.gsub(/[^a-zA-Z\-_]/, '')
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                                      if (!q[tpObj].nil?)
         | 
| 92 | 
            +
                                        itemTemplate = itemTemplate.gsub(p, q[tpObj].to_s.strip)
         | 
| 93 | 
            +
                                      else
         | 
| 94 | 
            +
                                        itemTemplate = itemTemplate.gsub(p, '')
         | 
| 95 | 
            +
                                      end
         | 
| 96 | 
            +
                                    end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                                    contentResult << itemTemplate
         | 
| 99 | 
            +
                                    tplCount = tplCount + 1
         | 
| 100 | 
            +
                                  end
         | 
| 101 | 
            +
                                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                                # Content should be empty if even and odd template don't exist
         | 
| 104 | 
            +
                                contentResult
         | 
| 105 | 
            +
                              elsif (attrs['configs'].keys.grep(/^tpl[0-9]+$/).size > 0)
         | 
| 106 | 
            +
                                # if it is multiple template
         | 
| 107 | 
            +
                                "{{[alliance-dbms - #{placeholder.key}] multiple template is not supported}}"
         | 
| 108 | 
            +
                              else
         | 
| 109 | 
            +
                                # if it is single template
         | 
| 110 | 
            +
                                contentResult = ''
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                                queryItemJsonData.each do |q|
         | 
| 113 | 
            +
                                  queryItemTemplate = placeholder.value.strip
         | 
| 114 | 
            +
                                  parsedObjs = queryItemTemplate.scan(/\[\[\$[a-zA-Z\-_]+\]\]/)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                                  parsedObjs.each do |p|
         | 
| 117 | 
            +
                                    tpObj = p.gsub(/[^a-zA-Z\-_]/, '')
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                                    if (!q[tpObj].nil?)
         | 
| 120 | 
            +
                                      queryItemTemplate = queryItemTemplate.gsub(p, q[tpObj].to_s.strip)
         | 
| 121 | 
            +
                                    else
         | 
| 122 | 
            +
                                      queryItemTemplate = queryItemTemplate.gsub(p, '')
         | 
| 123 | 
            +
                                    end
         | 
| 124 | 
            +
                                  end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                                  contentResult << queryItemTemplate
         | 
| 127 | 
            +
                                end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                                # Content should be empty if db returns no data
         | 
| 130 | 
            +
                                contentResult
         | 
| 131 | 
            +
                              end
         | 
| 132 | 
            +
                            else
         | 
| 133 | 
            +
                              placeholder.value.strip.html_safe
         | 
| 134 | 
            +
                            end
         | 
| 135 | 
            +
                          else
         | 
| 136 | 
            +
                            placeholder.value.strip.html_safe
         | 
| 137 | 
            +
                          end
         | 
| 138 | 
            +
                        else
         | 
| 139 | 
            +
                          placeholder.value.strip.html_safe
         | 
| 140 | 
            +
                        end
         | 
| 141 | 
            +
                      else
         | 
| 142 | 
            +
                        placeholder.value.strip.html_safe
         | 
| 143 | 
            +
                      end
         | 
| 144 | 
            +
                    else
         | 
| 145 | 
            +
                      placeholder.value.strip.html_safe
         | 
| 146 | 
            +
                    end
         | 
| 147 | 
            +
                  rescue Exception => ex
         | 
| 148 | 
            +
                    "{{[alliance-dbms - #{placeholder.key}] #{ex.message}}}"
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
                end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              end
         | 
| 153 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require "rubygems"
         | 
| 2 | 
            +
            require "mysql2"
         | 
| 3 | 
            +
            require "pg"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module RxcmsDbmsPlugin
         | 
| 6 | 
            +
              extend ::ActiveSupport::Autoload
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              autoload :Mysql2
         | 
| 9 | 
            +
              autoload :PG
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              class Engine < ::Rails::Engine
         | 
| 12 | 
            +
                config.autoload_paths += Dir["#{config.root}/lib/rxcms-dbms_plugin/classes/**/"]
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         |