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
|