hyperion-mysql 0.0.1.alpha2
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.
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'do_mysql'
         | 
| 2 | 
            +
            require 'hyperion/sql/datastore'
         | 
| 3 | 
            +
            require 'hyperion/mysql/query_builder_strategy'
         | 
| 4 | 
            +
            require 'hyperion/mysql/query_executor_strategy'
         | 
| 5 | 
            +
            require 'hyperion/mysql/db_strategy'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Hyperion
         | 
| 8 | 
            +
              module Mysql
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def self.create_datastore
         | 
| 11 | 
            +
                  Sql::Datastore.new(DbStrategy.new, QueryExecutorStrategy.new, QueryBuilderStrategy.new)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            require 'hyperion/api'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hyperion
         | 
| 4 | 
            +
              module Mysql
         | 
| 5 | 
            +
                class DbStrategy
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def process_result(given_record, result)
         | 
| 8 | 
            +
                    if API.new?(given_record)
         | 
| 9 | 
            +
                      given_record.merge('id' => result.insert_id)
         | 
| 10 | 
            +
                    else
         | 
| 11 | 
            +
                      given_record
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def process_count_result(result)
         | 
| 16 | 
            +
                    result['COUNT(*)']
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Hyperion
         | 
| 2 | 
            +
              module Mysql
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                class QueryBuilderStrategy
         | 
| 5 | 
            +
                  def quote_tick
         | 
| 6 | 
            +
                    '`'
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def apply_limit_and_offset(sql_query, limit, offset)
         | 
| 10 | 
            +
                    limit = limit || 9223372036854775807
         | 
| 11 | 
            +
                    offset = offset || 0
         | 
| 12 | 
            +
                    sql_query.append("LIMIT ?, ?", [offset, limit])
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def normalize_insert(sql_query_str)
         | 
| 16 | 
            +
                    sql_query_str
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def normalize_update(sql_query_str)
         | 
| 20 | 
            +
                    sql_query_str
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def empty_insert_query(table)
         | 
| 24 | 
            +
                    "INSERT INTO #{table} () VALUES ()"
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            require 'hyperion/sql'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hyperion
         | 
| 4 | 
            +
              module Mysql
         | 
| 5 | 
            +
                class QueryExecutorStrategy
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def execute_write(sql_query)
         | 
| 8 | 
            +
                    command = Sql.connection.create_command(sql_query.query_str)
         | 
| 9 | 
            +
                    command.execute_non_query(*sql_query.bind_values)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            require 'do_mysql'
         | 
| 2 | 
            +
            require 'hyperion/mysql'
         | 
| 3 | 
            +
            require 'hyperion/sql'
         | 
| 4 | 
            +
            require 'hyperion/dev/ds_spec'
         | 
| 5 | 
            +
            require 'hyperion/sql/transaction_spec'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            describe Hyperion::Mysql do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def execute(query)
         | 
| 10 | 
            +
                Hyperion::Sql.connection.create_command(query).execute_non_query
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def create_table(table_name)
         | 
| 14 | 
            +
                execute <<-QUERY
         | 
| 15 | 
            +
                CREATE TABLE #{table_name} (
         | 
| 16 | 
            +
                  id INTEGER NOT NULL AUTO_INCREMENT,
         | 
| 17 | 
            +
                  name VARCHAR(35),
         | 
| 18 | 
            +
                  inti INTEGER,
         | 
| 19 | 
            +
                  data VARCHAR(32),
         | 
| 20 | 
            +
                  PRIMARY KEY (id)
         | 
| 21 | 
            +
                );
         | 
| 22 | 
            +
                QUERY
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def drop_table(table_name)
         | 
| 26 | 
            +
                execute "DROP TABLE IF EXISTS #{table_name};"
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              around :each do |example|
         | 
| 30 | 
            +
                Hyperion::Sql.with_connection('mysql://localhost/hyperion_ruby') do |connection|
         | 
| 31 | 
            +
                  Hyperion::API.datastore = Hyperion::Mysql.create_datastore
         | 
| 32 | 
            +
                  example.run
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              context 'Datastore' do
         | 
| 37 | 
            +
                around :each do |example|
         | 
| 38 | 
            +
                  tables = ['testing', 'other_testing']
         | 
| 39 | 
            +
                  begin
         | 
| 40 | 
            +
                    tables.each { |table| create_table(table) }
         | 
| 41 | 
            +
                    example.run
         | 
| 42 | 
            +
                  ensure
         | 
| 43 | 
            +
                    tables.each { |table| drop_table(table) }
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                include_examples 'Datastore'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                context 'Sql Injection' do
         | 
| 50 | 
            +
                  it 'escapes strings to be inserted' do
         | 
| 51 | 
            +
                    evil_name = "my evil name' --"
         | 
| 52 | 
            +
                    record = Hyperion::API.save(:kind => 'testing', :name => evil_name)
         | 
| 53 | 
            +
                    found_record = Hyperion::API.find_by_key(record[:key])
         | 
| 54 | 
            +
                    found_record[:name].should == evil_name
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  it 'escapes table names' do
         | 
| 58 | 
            +
                    error_message = ""
         | 
| 59 | 
            +
                    begin
         | 
| 60 | 
            +
                      Hyperion::API.save(:kind => 'my evil name` --', :name => 'value')
         | 
| 61 | 
            +
                    rescue Exception => e
         | 
| 62 | 
            +
                      error_message = e.message
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                    error_message.should include("Table 'hyperion_ruby.my_evil_name`___' doesn't exist")
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  it 'escapes column names' do
         | 
| 68 | 
            +
                    error_message = ""
         | 
| 69 | 
            +
                    begin
         | 
| 70 | 
            +
                      Hyperion::API.save(:kind => 'testing', 'my evil name` --' => 'value')
         | 
| 71 | 
            +
                    rescue Exception => e
         | 
| 72 | 
            +
                      error_message = e.message
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                    error_message.should include("Unknown column 'my_evil_name`___' in 'field list'")
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              it_behaves_like 'Sql Transactions'
         | 
| 80 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,101 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: hyperion-mysql
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.1.alpha2
         | 
| 5 | 
            +
              prerelease: 6
         | 
| 6 | 
            +
            platform: ruby
         | 
| 7 | 
            +
            authors:
         | 
| 8 | 
            +
            - 8th Light, Inc.
         | 
| 9 | 
            +
            autorequire: 
         | 
| 10 | 
            +
            bindir: bin
         | 
| 11 | 
            +
            cert_chain: []
         | 
| 12 | 
            +
            date: 2012-09-17 00:00:00.000000000 Z
         | 
| 13 | 
            +
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 15 | 
            +
              name: rspec
         | 
| 16 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            +
                none: false
         | 
| 18 | 
            +
                requirements:
         | 
| 19 | 
            +
                - - '='
         | 
| 20 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            +
                    version: 2.11.0
         | 
| 22 | 
            +
              type: :development
         | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            +
                none: false
         | 
| 26 | 
            +
                requirements:
         | 
| 27 | 
            +
                - - '='
         | 
| 28 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            +
                    version: 2.11.0
         | 
| 30 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 31 | 
            +
              name: hyperion-sql
         | 
| 32 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 33 | 
            +
                none: false
         | 
| 34 | 
            +
                requirements:
         | 
| 35 | 
            +
                - - '='
         | 
| 36 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 37 | 
            +
                    version: 0.0.1.alpha2
         | 
| 38 | 
            +
              type: :runtime
         | 
| 39 | 
            +
              prerelease: false
         | 
| 40 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            +
                none: false
         | 
| 42 | 
            +
                requirements:
         | 
| 43 | 
            +
                - - '='
         | 
| 44 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            +
                    version: 0.0.1.alpha2
         | 
| 46 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 47 | 
            +
              name: do_mysql
         | 
| 48 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 49 | 
            +
                none: false
         | 
| 50 | 
            +
                requirements:
         | 
| 51 | 
            +
                - - '='
         | 
| 52 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            +
                    version: 0.10.8
         | 
| 54 | 
            +
              type: :runtime
         | 
| 55 | 
            +
              prerelease: false
         | 
| 56 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 | 
            +
                none: false
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - '='
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: 0.10.8
         | 
| 62 | 
            +
            description: MySQL Datastore for Hyperion
         | 
| 63 | 
            +
            email:
         | 
| 64 | 
            +
            - myles@8thlight.com
         | 
| 65 | 
            +
            - skim@8thlight.com
         | 
| 66 | 
            +
            executables: []
         | 
| 67 | 
            +
            extensions: []
         | 
| 68 | 
            +
            extra_rdoc_files: []
         | 
| 69 | 
            +
            files:
         | 
| 70 | 
            +
            - lib/hyperion/mysql.rb
         | 
| 71 | 
            +
            - lib/hyperion/mysql/db_strategy.rb
         | 
| 72 | 
            +
            - lib/hyperion/mysql/query_executor_strategy.rb
         | 
| 73 | 
            +
            - lib/hyperion/mysql/query_builder_strategy.rb
         | 
| 74 | 
            +
            - spec/hyperion/mysql_spec.rb
         | 
| 75 | 
            +
            homepage: https://github.com/mylesmegyesi/hyperion-ruby
         | 
| 76 | 
            +
            licenses:
         | 
| 77 | 
            +
            - Eclipse Public License
         | 
| 78 | 
            +
            post_install_message: 
         | 
| 79 | 
            +
            rdoc_options: []
         | 
| 80 | 
            +
            require_paths:
         | 
| 81 | 
            +
            - lib
         | 
| 82 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 83 | 
            +
              none: false
         | 
| 84 | 
            +
              requirements:
         | 
| 85 | 
            +
              - - ! '>='
         | 
| 86 | 
            +
                - !ruby/object:Gem::Version
         | 
| 87 | 
            +
                  version: 1.8.7
         | 
| 88 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 89 | 
            +
              none: false
         | 
| 90 | 
            +
              requirements:
         | 
| 91 | 
            +
              - - ! '>'
         | 
| 92 | 
            +
                - !ruby/object:Gem::Version
         | 
| 93 | 
            +
                  version: 1.3.1
         | 
| 94 | 
            +
            requirements: []
         | 
| 95 | 
            +
            rubyforge_project: 
         | 
| 96 | 
            +
            rubygems_version: 1.8.24
         | 
| 97 | 
            +
            signing_key: 
         | 
| 98 | 
            +
            specification_version: 3
         | 
| 99 | 
            +
            summary: MySQL Datastore for Hyperion
         | 
| 100 | 
            +
            test_files:
         | 
| 101 | 
            +
            - spec/hyperion/mysql_spec.rb
         |