class RxcmsDbmsPlugin::Executor

Public Class Methods

execute(placeholder, attrs, exts) click to toggle source

Tag syntax [[<<placeholder>>? &type=“stored-query” &data=“<<data-source>>” &attrs=“<<attr-data>>”…]]

# File lib/rxcms-dbms_plugin/classes/executor.rb, line 6
def self.execute(placeholder, attrs, exts)
  begin

    dbms_config = HashWithIndifferentAccess.new(YAML.load(File.read(File.expand_path("../../../../config/dbms/dbms_config.yml", __FILE__))))

    if attrs.has_key?('configs')
      if attrs['configs'].has_key?('type')
        if attrs['configs']['type'] == 'stored-query'

          if (ActiveRecord::Base.connection == Database.connection)
            if (!Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], exts[:appid]] }).nil? &&
                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], exts[:appid]] }).nil? &&
                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], exts[:appid]] }).nil? &&
                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], exts[:appid]] }).nil? &&
                !Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], exts[:appid]] }).nil?)

              connectionResult = Database.connect_sql(Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_ADAPTER], exts[:appid]] }).value,
                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_HOST], exts[:appid]] }).value,
                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PORT], exts[:appid]] }).value,
                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_USER], exts[:appid]] }).value,
                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_PASSWORD], exts[:appid]] }).value,
                                                      Metadata.first({ :conditions => ['key = ? and sites_id = ?', dbms_config[:DBMS_CURRENT_DATABASE], exts[:appid]] }).value)
              if (!connectionResult)
                return "{{[alliance_dbms - #{placeholder.key}] Unable to establish connection to database}}"
              end
            else
              return "{{[alliance_dbms - #{placeholder.key}] Missing important keys to establish connection}}"
            end
          end

          if attrs['configs'].has_key?('data')
            tQueryItem = Metadata.all({ :conditions => ['key = ? and sites_id = ?', attrs['configs']['data'], exts[:appid]] })
            languageSwitchable = Metadata.first({ :conditions => ['key = ? and sites_id = ?', 'autoLanguageSwitch', exts[:appid]] })
            queryItem = nil

            tQueryItem.each do |query|
              tQueryItemJsonObject = ActiveSupport::JSON.decode(SymmetricEncryption.decrypt(query.value))
              tQueryItemJsonObjectLanguage = tQueryItemJsonObject['language'].scan(/^[a-z]{2}/).first

              if (!languageSwitchable.nil?)
                if (languageSwitchable.value == 'yes')
                  if (exts[:language] == tQueryItemJsonObjectLanguage)
                    queryItem = query
                    break
                  end
                elsif (languageSwitchable.value == 'no')
                  if ('no' == tQueryItemJsonObjectLanguage)
                    queryItem = query
                    break
                  end
                else
                  return "{{alliance-dbms - #{placeholder.key} the \"value\" for language switchability is invalid}}"
                end
              else
                return "{{alliance-dbms - #{placeholder.key} Language switchability is not available}}"
              end
            end

            if (!queryItem.nil?)

              queryItemJsonObject = ActiveSupport::JSON.decode(SymmetricEncryption.decrypt(queryItem.value))
              queryItemJsonData = Database.connection.select_all(queryItemJsonObject['sql'])

              if (attrs['configs'].has_key?('tple') && attrs['configs'].has_key?('tplo'))
                # if it is alternate template
                contentResult = ''

                queryItemEvenTemplate = Metadata.find_by_key(attrs['configs']['tple'])
                queryItemOddTemplate = Metadata.find_by_key(attrs['configs']['tplo'])

                if (!queryItemEvenTemplate.nil? && !queryItemOddTemplate.nil?)
                  tplCount = 0
                  queryItemJsonData.each do |q|
                    itemTemplate = ''

                    if (tplCount % 2 == 0)
                      itemTemplate = queryItemEvenTemplate.value.strip
                    else
                      itemTemplate = queryItemOddTemplate.value.strip
                    end
                    parsedObjs = itemTemplate.scan(/\[\[\$[a-zA-Z\-_]+\]\]/)

                    parsedObjs.each do |p|
                      tpObj = p.gsub(/[^a-zA-Z\-_]/, '')

                      if (!q[tpObj].nil?)
                        itemTemplate = itemTemplate.gsub(p, q[tpObj].to_s.strip)
                      else
                        itemTemplate = itemTemplate.gsub(p, '')
                      end
                    end

                    contentResult << itemTemplate
                    tplCount = tplCount + 1
                  end
                end

                # Content should be empty if even and odd template don't exist
                contentResult
              elsif (attrs['configs'].keys.grep(/^tpl[0-9]+$/).size > 0)
                # if it is multiple template
                "{{[alliance-dbms - #{placeholder.key}] multiple template is not supported}}"
              else
                # if it is single template
                contentResult = ''

                queryItemJsonData.each do |q|
                  queryItemTemplate = placeholder.value.strip
                  parsedObjs = queryItemTemplate.scan(/\[\[\$[a-zA-Z\-_]+\]\]/)

                  parsedObjs.each do |p|
                    tpObj = p.gsub(/[^a-zA-Z\-_]/, '')

                    if (!q[tpObj].nil?)
                      queryItemTemplate = queryItemTemplate.gsub(p, q[tpObj].to_s.strip)
                    else
                      queryItemTemplate = queryItemTemplate.gsub(p, '')
                    end
                  end

                  contentResult << queryItemTemplate
                end

                # Content should be empty if db returns no data
                contentResult
              end
            else
              placeholder.value.strip.html_safe
            end
          else
            placeholder.value.strip.html_safe
          end
        else
          placeholder.value.strip.html_safe
        end
      else
        placeholder.value.strip.html_safe
      end
    else
      placeholder.value.strip.html_safe
    end
  rescue Exception => ex
    "{{[alliance-dbms - #{placeholder.key}] #{ex.message}}}"
  end
end