mysql2wrapper 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in batchbase.gemspec
4
+ gemspec
5
+
data/Gemfile.lock ADDED
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mysql2wrapper (0.0.1)
5
+ batchbase (= 0.0.2)
6
+ mysql2 (= 0.3.11)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ batchbase (0.0.2)
12
+ sys-proctable (= 0.9.1)
13
+ mysql2 (0.3.11)
14
+ sys-proctable (0.9.1)
15
+
16
+ PLATFORMS
17
+ ruby
18
+
19
+ DEPENDENCIES
20
+ mysql2wrapper!
data/README.md ADDED
@@ -0,0 +1,6 @@
1
+ mysql2wrapper
2
+ =============
3
+
4
+ very simple mysql2 wrapper.
5
+ it's ore ore library!
6
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,4 @@
1
+ test:
2
+ host: 127.0.0.1
3
+ database: mysql2wrapper_test
4
+ username: root
@@ -0,0 +1,9 @@
1
+ test:
2
+ master:
3
+ host: 127.0.0.1
4
+ database: mysql2wrapper_test_master
5
+ username: root
6
+ slave:
7
+ host: 127.0.0.1
8
+ database: mysql2wrapper_test_slave
9
+ username: root
data/example/sample.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'rubygems'
2
+ require 'mysql2wrapper'
3
+ require 'logger'
4
+
5
+ #
6
+ # HACKME サンプルをちょっとはマシに書く、、、、
7
+ #
8
+
9
+
10
+ logger = Logger.new(STDOUT)
11
+ # フォーマッターを変える
12
+ #logger.formatter = Kanamei::LogFormatter.formatter
13
+ db_yml_path = File::dirname(__FILE__) + '/../config/database.yml'
14
+ logger.info db_yml_path
15
+
16
+ # 第3引数は複数DB接続が無いならば指定不要
17
+ db_config = Mysql2wrapper::Client.config_from_yml(db_yml_path,'test')
18
+
19
+ client = Mysql2wrapper::Client.new(db_config,logger)
20
+ # ログ出力しないなら第二引数をnilで
21
+ #client = Mysql2wrapper::Client.new(db_config,nil)
22
+
23
+ query = '
24
+ DROP TABLE IF EXISTS `hoges`'
25
+ client.query query
26
+ query = '
27
+ CREATE TABLE IF NOT EXISTS `hoges` (
28
+ `id` int(11) NOT NULL auto_increment,
29
+ `value1` int(11) NOT NULL,
30
+ `created_at` datetime NOT NULL,
31
+ `updated_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
32
+ PRIMARY KEY (`id`)
33
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;'
34
+ client.query query
35
+
36
+ logger.info "hoge has #{client.count 'hoges'}rows"
37
+ client.query "INSERT INTO hoges (value1,created_at)VALUES(#{Time.now.to_i},NOW())"
38
+ logger.info "hoge has #{client.count 'hoges'}rows"
39
+
40
+ begin
41
+ # トランザクションはブロックを渡す(ARと同じく)
42
+ client.transaction do
43
+ logger.info "hoge has #{client.count 'hoges'}rows"
44
+ client.query "INSERT INTO hoges (value1,created_at)VALUES(#{Time.now.to_i},NOW())"
45
+ client.query query
46
+ logger.info "hoge has #{client.count 'hoges'}rows"
47
+ raise 'error' # call ROLLBACK
48
+ end
49
+ rescue
50
+ end
51
+ logger.info "hoge has #{client.count 'hoges'}rows"
52
+
53
+ # ハッシュを引数にしたインサートの発行
54
+ @i = 0
55
+ hash = {
56
+ :value1=>proc{@i+=1}, # procを引数にもできる
57
+ :created_at=>'now()'.to_func
58
+ }
59
+ client.insert('hoges',hash)
60
+ logger.info "affected_rows:#{client.affected_rows}"
61
+ logger.info "hoge has #{client.count 'hoges'}rows"
62
+
63
+ # 配列を引数にしたインサートの発行
64
+ ar = []
65
+ 20.times{ar << hash}
66
+ client.insert('hoges',ar)
67
+ logger.info "affected_rows:#{client.affected_rows}" # Client#affected_rowsでマルチプルインサートのトータルインサート数が取れる
68
+ logger.info "hoge has #{client.count 'hoges'}rows"
69
+
70
+ # ハッシュを引数にしたアップデート
71
+ client.update 'hoges',{:value1=>3},'id = 1'
72
+ logger.info "hoge has #{client.count 'hoges'}rows"
73
+ # 全行アップデートをしたなら第三引数でMysql2wrapper::Client::UpdateAllClassを引数にしないとダメ
74
+ client.update 'hoges',{:value1=>3},Mysql2wrapper::Client::UpdateAllClass
75
+ # clientインスタンスにショートカットあり
76
+ client.update 'hoges',{:value1=>4},client.update_all_flag
77
+ logger.info "hoge has #{client.count 'hoges'}rows"
@@ -0,0 +1,16 @@
1
+ require "mysql2wrapper/version"
2
+ require "mysql2wrapper/client"
3
+
4
+ class String
5
+ def to_func
6
+ @__function_sql = true
7
+ self
8
+ end
9
+
10
+ def function_sql?
11
+ @__function_sql == true
12
+ end
13
+ end
14
+
15
+ module Mysql2wrapper
16
+ end
@@ -0,0 +1,203 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'yaml'
4
+ require 'mysql2'
5
+
6
+ class Mysql2wrapper::Client
7
+ attr_accessor :config, :client, :logger
8
+ attr_reader :affected_rows
9
+
10
+ # 全行更新用のフラグ表現クラス
11
+ class UpdateAllClass;end
12
+
13
+ UPDATE_ALL = UpdateAllClass
14
+ QUERY_BASE_COLOR = 35
15
+ QUERY_SPECIAL_COLOR = 31
16
+
17
+ MULTIPLE_INSERT_DEFAULT = 100
18
+
19
+ def initialize(config,_logger=Logger.new(STDOUT))
20
+ self.logger = _logger
21
+ if self.logger
22
+ self.logger.info "mysql2 client created with #{config.inspect}"
23
+ end
24
+ self.client = Mysql2::Client.new(config)
25
+ self.config = config
26
+ # サーバが古いので一応問題あるけど以下の方向で
27
+ # http://kennyqi.com/archives/61.html
28
+ self.class.query(self.client,"SET NAMES 'utf8'",self.logger)
29
+ self.class.query(self.client,"SET SQL_AUTO_IS_NULL=0",self.logger)
30
+ self.class.query(self.client,"SET SQL_MODE=STRICT_ALL_TABLES",self.logger)
31
+ end
32
+
33
+ def self.query(client,sql_query,logger=nil,color=QUERY_BASE_COLOR)
34
+ s = Time.now
35
+ ret = client.query(sql_query)
36
+ e = Time.now
37
+ if logger
38
+ # TODO too long sql shorten
39
+ if sql_query.size > 1400
40
+ sql_query = sql_query[0..600] + "\n<< trimed >>\n" + sql_query[(sql_query.size - 600)..(sql_query.size - 1)]
41
+ end
42
+ logger.info "[QUERY] "" \e[#{color}m (#{((e-s)*1000).round(2)}ms/#{client.affected_rows}rows) #{sql_query}\e[0m"
43
+ end
44
+ ret
45
+ end
46
+
47
+ def stop_logging
48
+ self.logger = nil
49
+ end
50
+
51
+ def dump
52
+ "#{self.config.inspect}\n#{self.client.pretty_inspect}"
53
+ end
54
+
55
+ def query(str,color=QUERY_BASE_COLOR)
56
+ res = self.class.query(self.client,str,self.logger,color)
57
+ @affected_rows = self.client.affected_rows
58
+ res
59
+ end
60
+
61
+ def transaction(&proc)
62
+ raise ArgumentError, "No block was given" unless block_given?
63
+ #query "SET AUTOCOMMIT=0;",QUERY_SPECIAL_COLOR
64
+ query "BEGIN",QUERY_SPECIAL_COLOR
65
+ begin
66
+ yield
67
+ query "COMMIT",QUERY_SPECIAL_COLOR
68
+ rescue => e
69
+ query "ROLLBACK",QUERY_SPECIAL_COLOR
70
+ raise e
71
+ end
72
+ end
73
+
74
+ def self.make_config_key_symbol(config)
75
+ new_config = {}
76
+ config.each do |key,value|
77
+ new_config[key.to_sym] = value
78
+ end
79
+ config = new_config
80
+ end
81
+
82
+ def count(table_name,key_name='*')
83
+ query("SELECT COUNT(#{escape(key_name)}) AS cnt FROM #{escape(table_name)}").first['cnt']
84
+ end
85
+
86
+ def close
87
+ self.client.close if self.client
88
+ end
89
+
90
+ def escape(str)
91
+ self.client.escape(str)
92
+ end
93
+
94
+ def sanitize(str)
95
+ escape(str)
96
+ end
97
+
98
+ #
99
+ # where は 'WHERE'を付けずに指定
100
+ # 全行updateを使用するシチュエーションはほぼ0に
101
+ # 近いと思われるので、簡単には実行できなくしてます
102
+ # 実際に実行する際はwhereにUpdateAllを引数とします
103
+ # client.update 'test01',{:v_int1=>3},Mysql2wrapper::Client::UPDATE_ALL
104
+ #
105
+ def update(table_name,hash,where)
106
+ case where
107
+ when String
108
+ where = "WHERE #{where}"
109
+ when UpdateAllClass.class
110
+ where = ''
111
+ else
112
+ raise ArgumentError, "where must be String or UpdateAll"
113
+ end
114
+ query = "UPDATE `#{escape(table_name)}` SET #{
115
+ hash.map do |key,value|
116
+ "`#{escape(key.to_s)}` = #{proceed_value(value)}"
117
+ end.join(',')
118
+ }" + where
119
+ self.query(query)
120
+ end
121
+
122
+ def update_all_flag
123
+ self.class::UPDATE_ALL
124
+ end
125
+
126
+ def proceed_value(value)
127
+ case value
128
+ when Proc
129
+ "'#{escape(value.call.to_s)}'"
130
+ when nil
131
+ "NULL"
132
+ when TrueClass,FalseClass
133
+ if value
134
+ "'1'"
135
+ else
136
+ "'0'"
137
+ end
138
+ when Time,DateTime
139
+ "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
140
+ when Date
141
+ "'#{value.strftime("%Y-%m-%d")}'"
142
+ else
143
+ s = value
144
+ s = s.to_s unless s.kind_of?(String)
145
+ if s.respond_to?(:function_sql?) && s.function_sql?
146
+ "#{value.to_s}"
147
+ else
148
+ "'#{escape(value.to_s)}'"
149
+ end
150
+ end
151
+ end
152
+
153
+ def insert(table_name,data,multiple_insert_by=MULTIPLE_INSERT_DEFAULT)
154
+ @affected_rows = 0 # 一応リセットしとくか、、、
155
+ affected_rows_total = 0
156
+ query = "INSERT INTO `#{escape(table_name)}`"
157
+ _datas = data.clone
158
+ case _datas
159
+ when Array
160
+ ;
161
+ when Hash
162
+ _datas = [_datas]
163
+ else
164
+ raise ArgumentError, "data must be Array or Hash"
165
+ end
166
+
167
+ return nil if _datas.size == 0
168
+
169
+ # TODO affected_rows by multiple
170
+ _datas.each_slice(multiple_insert_by).each do |rows|
171
+ query = <<"EOS"
172
+ INSERT INTO `#{escape(table_name)}`
173
+ (#{rows.first.keys.map{|o|"`#{escape(o.to_s)}`"}.join(',')})
174
+ VALUES
175
+ #{
176
+ rows.map do |row|
177
+ "(#{
178
+ row.map do |key,value|
179
+ proceed_value(value)
180
+ end.join(',')
181
+ })"
182
+ end.join(',')
183
+ }
184
+ EOS
185
+ self.query(query.chomp)
186
+ affected_rows_total += self.client.affected_rows
187
+ end
188
+ @affected_rows = affected_rows_total
189
+ end
190
+
191
+ #
192
+ # db_server_nameはDB名そのもの(複数DB対応)
193
+ #
194
+ def self.config_from_yml(yml_path,environment,db_server_name=nil)
195
+ db_config = YAML.load_file(yml_path)[environment]
196
+ if db_server_name
197
+ db_config = self.make_config_key_symbol(db_config[db_server_name])
198
+ else
199
+ db_config = self.make_config_key_symbol(db_config)
200
+ end
201
+ db_config
202
+ end
203
+ end
@@ -0,0 +1,3 @@
1
+ module Mysql2wrapper
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mysql2wrapper/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mysql2wrapper"
7
+ s.version = Mysql2wrapper::VERSION
8
+ s.authors = ["pacojp"]
9
+ s.email = ["paco.jp@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{oreore mysql2 wrapper class}
12
+ s.description = %q{oreore mysql2 wrapper class}
13
+ s.rubyforge_project = "mysql2wrapper"
14
+ s.add_dependency 'mysql2','0.3.11'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
data/test/by_hand.rb ADDED
@@ -0,0 +1,80 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #
4
+ # trial space
5
+ #
6
+
7
+ $: << File.dirname(__FILE__)
8
+
9
+ require 'rubygems'
10
+ require 'test_helper'
11
+ require 'logger'
12
+
13
+ require 'mysql2wrapper'
14
+
15
+ db_yml_path = File::dirname(__FILE__) + '/../config/database.yml'
16
+ puts db_yml_path
17
+ # 第3引数は複数DB接続が無いならば指定不要
18
+ db_config = Mysql2wrapper::Client.config_from_yml(db_yml_path,'test')
19
+
20
+ client = Mysql2wrapper::Client.new(db_config)
21
+ query = 'DROP TABLE IF EXISTS `hoges`'
22
+ client.query(query)
23
+ query = '
24
+ CREATE TABLE IF NOT EXISTS `hoges` (
25
+ `id` int(11) NOT NULL auto_increment,
26
+ `v_int1` int(11) NOT NULL,
27
+ `v_int2` int(11) NOT NULL,
28
+ `v_int3` int(11),
29
+ `v_str1` varchar(10) NOT NULL,
30
+ `v_str2` varchar(10) NOT NULL,
31
+ `v_str3` varchar(10) NOT NULL,
32
+ `v_datetime1` datetime NOT NULL,
33
+ `v_datetime2` datetime NOT NULL,
34
+ `created_at` datetime NOT NULL,
35
+ `updated_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
36
+ PRIMARY KEY (`id`)
37
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
38
+ '
39
+ client.query query
40
+
41
+ @i = 0
42
+ increment = proc{@i+=1}
43
+
44
+ # hashでインサート
45
+ hash = {
46
+ :v_int1=>increment,
47
+ :v_int2=>rand(10000),
48
+ :v_int3=>nil,
49
+ :v_str1=>'test',
50
+ :v_str2=>'hoho',
51
+ :v_str3=>"CONCAT('My','S','QL')".to_func,
52
+ :v_datetime1=>Time.mktime(2011,12,3,4,5,6),
53
+ :v_datetime2=>DateTime.new(2011,12,3,4,5,6),
54
+ :created_at=>'NOW()'.to_func
55
+ }
56
+ client.insert('hoges',hash)
57
+
58
+ # hashの配列でマルチプルインサート
59
+ array = []
60
+ 101.times{array << hash}
61
+ client.insert('hoges',array)
62
+ puts "hoge has #{client.count 'hoges'}rows"
63
+
64
+ client.transaction do
65
+ client.insert('hoges',hash)
66
+ end
67
+ puts "hoge has #{client.count 'hoges'}rows"
68
+
69
+ begin
70
+ client.transaction do
71
+ client.insert('hoges',hash)
72
+ raise 'roooooooooollback!'
73
+ end
74
+ rescue
75
+ end
76
+ puts "hoge has #{client.count 'hoges'}rows"
77
+
78
+ client.update 'hoges',{:v_int1=>2},'id = 1'
79
+ client.update 'hoges',{:v_int1=>2},client.class::UPDATE_ALL
80
+
data/test/test.rb ADDED
@@ -0,0 +1,382 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ $: << File.dirname(__FILE__)
4
+ require 'test_helper'
5
+ require 'test/unit'
6
+ require 'Fileutils'
7
+ require 'logger'
8
+
9
+ #
10
+ # localhostに以下のデータベースを作成しrootのパスワード無しでアクセスできるようにしておいてください
11
+ #
12
+ # mysql2wrapper_test
13
+ # mysql2wrapper_test_master
14
+ # mysql2wrapper_test_slave
15
+ #
16
+
17
+ class TestMysql2wrapper < Test::Unit::TestCase
18
+
19
+ def setup
20
+ @i = 0
21
+ client = get_client
22
+
23
+ query = 'DROP TABLE IF EXISTS `test01`'
24
+ client.query query
25
+ query = 'DROP TABLE IF EXISTS `test02`'
26
+ client.query query
27
+
28
+ query = simple_table_create_query('test01')
29
+ client.query query
30
+
31
+ query = '
32
+ CREATE TABLE IF NOT EXISTS `test02` (
33
+ `id` int(11) NOT NULL auto_increment,
34
+ `v_int1` int(11) NOT NULL,
35
+ `v_int2` int(11) NOT NULL,
36
+ `v_int3` int(11),
37
+ `v_int4` int(11),
38
+ `v_bool1` tinyint(1) NOT NULL,
39
+ `v_bool2` tinyint(1) NOT NULL,
40
+ `v_bool3` tinyint(1),
41
+ `v_bool4` tinyint(1),
42
+ `v_str1` varchar(10) NOT NULL,
43
+ `v_str2` varchar(10) NOT NULL,
44
+ `v_str3` varchar(10),
45
+ `v_str4` varchar(10),
46
+ `v_date1` date NOT NULL,
47
+ `v_date2` date,
48
+ `v_date3` date,
49
+ `v_datetime1` datetime NOT NULL,
50
+ `v_datetime2` datetime,
51
+ `v_datetime3` datetime,
52
+ `v_time1` datetime NOT NULL,
53
+ `v_time2` datetime,
54
+ `v_time3` datetime,
55
+ `created_at` datetime NOT NULL,
56
+ `updated_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
57
+ PRIMARY KEY (`id`)
58
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
59
+ '
60
+ client.query query
61
+
62
+ client.close
63
+ end
64
+
65
+ def get_client
66
+ db_yml_path = File::dirname(__FILE__) + '/../config/database.yml'
67
+ db_config = Mysql2wrapper::Client.config_from_yml(db_yml_path,'test')
68
+ client = Mysql2wrapper::Client.new(db_config,nil)
69
+ client
70
+ end
71
+
72
+ def simple_table_create_query(table)
73
+ "
74
+ CREATE TABLE IF NOT EXISTS `#{table}` (
75
+ `id` int(11) NOT NULL auto_increment,
76
+ `v_int1` int(11) NOT NULL,
77
+ `v_int2` int(11),
78
+ `v_str1` varchar(10) ,
79
+ `created_at` datetime NOT NULL,
80
+ `updated_at` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
81
+ PRIMARY KEY (`id`)
82
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
83
+ "
84
+ end
85
+
86
+ def hash_for_simple_table
87
+ {
88
+ :v_int1 => proc{ @i+=1 },
89
+ :created_at => 'NOW()'.to_func,
90
+ }
91
+ end
92
+
93
+ def insert(client)
94
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(#{Time.now.to_i},NOW())"
95
+ client.query query
96
+ end
97
+
98
+ def count(client=get_client)
99
+ client.count('test01','id')
100
+ end
101
+
102
+ def test_to_func
103
+ assert_equal false,''.function_sql?
104
+ assert_equal true,''.to_func.function_sql?
105
+ st = ""
106
+ assert_equal false,st.function_sql?
107
+ st = st.to_func
108
+ assert_equal true,st.function_sql?
109
+ assert_equal true,proc{"".to_func}.call.function_sql?
110
+ assert_equal true,Proc.new{"".to_func}.call.function_sql?
111
+ end
112
+
113
+ def test_count
114
+ client = get_client
115
+ assert_equal 0,client.count('test01','id')
116
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(#{Time.now.to_i},NOW())"
117
+ client.query query
118
+ assert_equal 1,client.count('test01','id')
119
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(#{Time.now.to_i},NOW())"
120
+ client.query query
121
+ assert_equal 2,client.count('test01','id')
122
+ client.close
123
+ end
124
+
125
+ def test_select
126
+ client = get_client
127
+ assert_equal 0,client.count('test01','id')
128
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(123,NOW())"
129
+ client.query query
130
+ assert_equal 1,client.count('test01','id')
131
+ res = client.query "SELECT * FROM test01 WHERE id = 1"
132
+ assert_equal 123, res.first['v_int1']
133
+ assert_equal 1, client.affected_rows
134
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(123,NOW())"
135
+ client.query query
136
+ res = client.query "SELECT * FROM test01 WHERE id = 1"
137
+ assert_equal 1, client.affected_rows
138
+ res = client.query "SELECT * FROM test01"
139
+ assert_equal 2, client.affected_rows
140
+ client.close
141
+ end
142
+
143
+ def test_update
144
+ client = get_client
145
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(1,NOW())"
146
+ client.query query
147
+ client.query query
148
+ client.query query
149
+
150
+ res = client.query "SELECT * FROM test01 WHERE id = 1"
151
+ assert_equal 1, res.first['v_int1']
152
+ assert_equal nil, res.first['v_int2']
153
+ res = client.query "SELECT * FROM test01 WHERE id = 2"
154
+ assert_equal 1, res.first['v_int1']
155
+ assert_equal nil, res.first['v_int2']
156
+
157
+ client.update 'test01',{:v_int1=>2},'id = 1'
158
+ assert_equal 1, client.affected_rows
159
+
160
+ res = client.query "SELECT * FROM test01 WHERE id = 1"
161
+ assert_equal 2, res.first['v_int1']
162
+ assert_equal nil, res.first['v_int2']
163
+ res = client.query "SELECT * FROM test01 WHERE id = 2"
164
+ assert_equal 1, res.first['v_int1']
165
+ assert_equal nil, res.first['v_int2']
166
+
167
+ client.update 'test01',{:v_int1=>3}, client.update_all_flag
168
+
169
+ assert_equal 3, client.affected_rows
170
+ res = client.query "SELECT * FROM test01 WHERE id = 1"
171
+ assert_equal 3, res.first['v_int1']
172
+ assert_equal nil, res.first['v_int2']
173
+ res = client.query "SELECT * FROM test01 WHERE id = 2"
174
+ assert_equal 3, res.first['v_int1']
175
+ assert_equal nil, res.first['v_int2']
176
+ client.update 'test01',{:v_int1=>3},Mysql2wrapper::Client::UPDATE_ALL
177
+ assert_equal 0, client.affected_rows
178
+ client.update 'test01',{:v_int1=>4},client.update_all_flag
179
+ assert_equal 3, client.affected_rows
180
+
181
+ client.close
182
+ end
183
+
184
+ def test_update_all_limitter
185
+ client = get_client
186
+ query = "INSERT INTO test01 (v_int1,created_at)VALUES(1,NOW())"
187
+ client.query query
188
+
189
+ assert_raise(ArgumentError){
190
+ client.update 'test01',{:v_int1=>3},nil
191
+ }
192
+
193
+ assert_raise(Mysql2::Error){
194
+ client.update 'test01',{:v_int1=>3},''
195
+ }
196
+ end
197
+
198
+ def test_escape
199
+ client = get_client
200
+ assert_equal 0,client.count('test01','id')
201
+ query = "INSERT INTO test01 (v_int1,v_str1,created_at)VALUES(#{Time.now.to_i},'#{client.escape("'te'st'st'")}',NOW())"
202
+ client.query query
203
+ res = client.query "SELECT * FROM test01"
204
+ assert_equal 1,res.size
205
+ assert_equal "'te'st'st'",res.first['v_str1']
206
+ client.close
207
+ end
208
+
209
+ def test_tranasction_simple
210
+ client = get_client
211
+ insert(client)
212
+ assert_equal 1,count(client)
213
+ begin
214
+ client.transaction do
215
+ insert(client)
216
+ assert_equal 2,count(client)
217
+ raise 'roooooooooollback!!!!'
218
+ end
219
+ rescue
220
+ end
221
+ assert_equal 1,count(client)
222
+ insert(client)
223
+ assert_equal 2,count(client)
224
+ client.close
225
+ end
226
+
227
+ def test_tranasction_2_clients
228
+ client1 = get_client
229
+ client2 = get_client
230
+ insert(client1)
231
+ assert_equal 1,count(client1)
232
+ assert_equal 1,count(client2)
233
+ begin
234
+ # コネクションはトランザクション単位
235
+ client1.transaction do
236
+ insert(client1)
237
+ assert_equal 2,count(client1)
238
+ assert_equal 1,count(client2)
239
+ raise 'roooooooooollback!!!!'
240
+ end
241
+ rescue
242
+ end
243
+ assert_equal 1,count(client1)
244
+ assert_equal 1,count(client2)
245
+
246
+ client1.transaction do
247
+ insert(client2) # raiseしないなら
248
+ end
249
+ assert_equal 2,count(client1)
250
+ assert_equal 2,count(client2)
251
+
252
+ begin
253
+ # コネクションはトランザクション単位
254
+ # client1のtransactionブロック内でclient2のインサートを発行しても
255
+ # もちろんロールバックされない
256
+ client1.transaction do
257
+ insert(client1)
258
+ assert_equal 3,count(client1)
259
+ assert_equal 2,count(client2)
260
+ insert(client2)
261
+ assert_equal 3,count(client1) # ここは3
262
+ assert_equal 3,count(client2)
263
+ raise 'roooooooooollback!!!!'
264
+ end
265
+ rescue
266
+ end
267
+ assert_equal 3,count(client1)
268
+ assert_equal 3,count(client2)
269
+ client1.close
270
+ client2.close
271
+ end
272
+
273
+ def test_insert
274
+ client = get_client
275
+ @i = 0
276
+ hash = {
277
+ :v_int1 => proc{ @i+=1 },
278
+ :v_int2 => 246,
279
+ :v_int3 => nil,
280
+ :v_str1=>"te'st日本語",
281
+ :v_str2=>"CONCAT('My','S','QL')".to_func,
282
+ :v_str3 => nil,
283
+ :v_bool1 => true,
284
+ :v_bool2 => false,
285
+ :v_bool3 => nil,
286
+ :v_date1 => Date.new(2000,1,2),
287
+ :v_date2 => nil,
288
+ :v_datetime1 => DateTime.new(2000,1,2,3,4,5),
289
+ :v_datetime2 => nil,
290
+ :v_time1 => Time.mktime(2000,1,2,3,4,5),
291
+ :v_time2 => nil,
292
+ :created_at => 'NOW()'.to_func,
293
+ }
294
+ client.insert('test02',hash)
295
+ assert_equal 1, client.affected_rows
296
+ client.insert('test02',hash)
297
+ res = client.query ("SELECT * FROM test02")
298
+ assert_equal 2, res.size
299
+ row = res.to_a.last
300
+ assert_equal 2, row['v_int1']
301
+ assert_equal 246, row['v_int2']
302
+ assert_equal nil, row['v_int3']
303
+ assert_equal nil, row['v_int4']
304
+ assert_equal 'te\'st日本語', row['v_str1']
305
+ assert_equal 'MySQL', row['v_str2']
306
+ assert_equal nil, row['v_str3']
307
+ assert_equal nil, row['v_str4']
308
+ assert_equal 1, row['v_bool1']
309
+ assert_equal 0, row['v_bool2']
310
+ assert_equal nil, row['v_bool3']
311
+ assert_equal nil, row['v_bool4']
312
+ assert_equal Date.new(2000,1,2),row['v_date1']
313
+ assert_equal nil, row['v_date2']
314
+ assert_equal nil, row['v_date3']
315
+ assert_equal Time.mktime(2000,1,2,3,4,5),row['v_datetime1']
316
+ assert_equal nil, row['v_datetime2']
317
+ assert_equal nil, row['v_datetime3']
318
+ assert_equal Time.mktime(2000,1,2,3,4,5),row['v_time1']
319
+ assert_equal nil, row['v_time2']
320
+ assert_equal nil, row['v_time3']
321
+ end
322
+
323
+ def test_multiple_insert
324
+ client = get_client
325
+ @i = 0
326
+ hash = hash_for_simple_table
327
+ client.insert('test01',hash)
328
+ res = client.query ("SELECT * FROM test01")
329
+ assert_equal 1, res.size
330
+ assert_equal 1, client.affected_rows
331
+ client.insert('test01',hash)
332
+ res = client.query ("SELECT * FROM test01")
333
+ assert_equal 2, res.size
334
+ assert_equal 2, res.to_a.last['v_int1']
335
+ ar = []
336
+ 111.times{ar << hash}
337
+ client.insert('test01',ar)
338
+ assert_equal 111, client.affected_rows
339
+ res = client.query ("SELECT * FROM test01")
340
+ assert_equal 113, res.size
341
+ assert_equal 113, res.to_a.last['v_int1']
342
+ end
343
+
344
+ def test_sql_mode_is_strict_all_tables
345
+ assert_raise(Mysql2::Error) do
346
+ client = get_client
347
+ query = "INSERT INTO test01 (v_int1)values(1)"
348
+ client.query(query)
349
+ end
350
+ end
351
+
352
+ def test_multiple_database
353
+ db_yml_path = File::dirname(__FILE__) + '/../config/database_multiple.yml'
354
+ config_master = Mysql2wrapper::Client.config_from_yml(db_yml_path,'test','master')
355
+ config_slave = Mysql2wrapper::Client.config_from_yml(db_yml_path,'test','slave')
356
+ client_master = Mysql2wrapper::Client.new(config_master,nil)
357
+ client_slave = Mysql2wrapper::Client.new(config_slave,nil)
358
+
359
+ client_master.query 'DROP TABLE IF EXISTS tbl_master'
360
+ client_master.query simple_table_create_query('tbl_master')
361
+ client_slave.query 'DROP TABLE IF EXISTS tbl_slave'
362
+ client_slave.query simple_table_create_query('tbl_slave')
363
+
364
+ assert_equal 0,client_master.count('tbl_master')
365
+ assert_equal 0,client_slave.count('tbl_slave')
366
+
367
+ client_master.insert('tbl_master',hash_for_simple_table)
368
+
369
+ assert_equal 1,client_master.count('tbl_master')
370
+ assert_equal 0,client_slave.count('tbl_slave')
371
+
372
+ client_master.insert('tbl_master',hash_for_simple_table)
373
+
374
+ assert_equal 2,client_master.count('tbl_master')
375
+ assert_equal 0,client_slave.count('tbl_slave')
376
+
377
+ client_slave.insert('tbl_slave',hash_for_simple_table)
378
+
379
+ assert_equal 2,client_master.count('tbl_master')
380
+ assert_equal 1,client_slave.count('tbl_slave')
381
+ end
382
+ end
@@ -0,0 +1,5 @@
1
+ $: << File.dirname(__FILE__) + '/../lib'
2
+ #require File.dirname(__FILE__) + '/../lib/image_convert_lite'
3
+
4
+ require 'mysql2wrapper'
5
+ require 'mysql2wrapper/version'
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mysql2wrapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - pacojp
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mysql2
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.11
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.3.11
30
+ description: oreore mysql2 wrapper class
31
+ email:
32
+ - paco.jp@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - Gemfile.lock
40
+ - README.md
41
+ - Rakefile
42
+ - config/database.yml
43
+ - config/database_multiple.yml
44
+ - example/sample.rb
45
+ - lib/mysql2wrapper.rb
46
+ - lib/mysql2wrapper/client.rb
47
+ - lib/mysql2wrapper/version.rb
48
+ - mysql2wrapper.gemspec
49
+ - test/by_hand.rb
50
+ - test/test.rb
51
+ - test/test_helper.rb
52
+ homepage: ''
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project: mysql2wrapper
72
+ rubygems_version: 1.8.23
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: oreore mysql2 wrapper class
76
+ test_files:
77
+ - test/by_hand.rb
78
+ - test/test.rb
79
+ - test/test_helper.rb
80
+ has_rdoc: