public
Rubygem
Description: An ActiveRecord to the DBSlayer lightweight proxy/pooling layer (http://code.nytimes.com/projects/dbslayer)
Clone URL: git://github.com/harrisj/activerecord-dbslayer-adapter.git
Search Repo:
Fixed for work for multiples, null results


git-svn-id: 
svn://newsprojects.nytimes.com/newsdev/gems/activerecord-dbslayer-adapter@
4455 ae54da50-7589-804d-96e1-6ee4b2538e53
harrisj (author)
Thu May 08 11:16:27 -0700 2008
commit  102cec42ea8bbe59742e0525f67b3ee1489c4bbf
tree    d9bffc96ceb1f9985615c38f98b67fd7b77235db
parent  0ad288887d167265431c0cbbdce8257bd403af88
...
1
 
2
 
 
 
 
 
 
 
3
4
5
6
7
 
8
9
10
...
 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
14
15
16
17
0
@@ -1,10 +1,17 @@
0
-== 0.0.2 2008-05-01
0
+== 0.2.5 2008-05-06
0
 
0
+* 3 minor enhancements:
0
+ * passes test for multiple results
0
+ * passes test for null results
0
+ * rcov rake task
0
+
0
+== 0.2.0 2008-05-01
0
+
0
 * 2 major enhancments:
0
   * tests
0
   * it actually works!
0
 
0
-== 0.0.1 2008-04-15
0
+== 0.1.0 2008-04-15
0
 
0
 * 1 major enhancement:
0
   * Initial release
...
16
17
18
 
19
20
21
...
16
17
18
19
20
21
22
0
@@ -16,6 +16,7 @@
0
 setup.rb
0
 tasks/deployment.rake
0
 tasks/environment.rake
0
+tasks/rcov.rake
0
 tasks/website.rake
0
 test/helper.rb
0
 test/localtest.rb
...
70
71
72
73
74
75
76
77
78
79
 
 
 
 
 
 
 
 
 
 
 
 
80
81
82
 
 
83
84
85
86
...
106
107
108
109
 
110
111
112
113
114
115
116
 
117
118
119
...
70
71
72
 
 
 
 
 
 
 
73
74
75
76
77
78
79
80
81
82
83
84
85
 
 
86
87
88
89
90
91
...
111
112
113
 
114
115
116
117
118
119
120
 
121
122
123
124
0
@@ -70,16 +70,21 @@
0
       def sql_query(sql)
0
         dbslay_results = cmd_execute(:db, 'SQL' => sql)
0
                 
0
- case dbslay_results
0
- when Hash
0
- # check for an error
0
- if dbslay_results['MYSQL_ERROR']
0
- raise DbslayerException, "MySQL Error #{dbslay_results['MYSQL_ERRNO']}: #{dbslay_results['MYSQL_ERROR']}"
0
- else
0
- DbslayerResult.new(dbslay_results['RESULT'])
0
+ # check for an error
0
+ if dbslay_results['MYSQL_ERROR']
0
+ raise DbslayerException, "MySQL Error #{dbslay_results['MYSQL_ERRNO']}: #{dbslay_results['MYSQL_ERROR']}"
0
+ elsif dbslay_results['RESULT']
0
+ result = dbslay_results['RESULT']
0
+ case result
0
+ when Hash
0
+ DbslayerResult.new(result)
0
+ when Array
0
+ result.map {|r| DbslayerResult.new(r) }
0
+ else
0
+ raise DbslayerException, "Unknown format for SQL results from DBSlayer"
0
           end
0
- when Array
0
- dbslay_results.map { |r| DbslayerResult.new(r['RESULT']) }
0
+ elsif dbslay_results['SUCCESS']
0
+ return dbslay_results['SUCCESS']
0
         else
0
           raise DbslayerException, "Unknown format for SQL results from DBSlayer"
0
         end
0
0
@@ -106,14 +111,14 @@
0
 
0
       def client_version_num
0
         if @client_version.nil?
0
- @client_version = cmd_execute(:db, 'CLIENT_VERSION' => true)["CLIENT_VERSION"]
0
+ @client_version = Integer(cmd_execute(:db, 'CLIENT_VERSION' => true)["CLIENT_VERSION"])
0
         end
0
         @client_version
0
       end
0
 
0
       def server_version_num
0
         if @server_version.nil?
0
- @server_version = cmd_execute(:db, 'SERVER_VERSION' => true)["SERVER_VERSION"]
0
+ @server_version = Integer(cmd_execute(:db, 'SERVER_VERSION' => true)["SERVER_VERSION"])
0
         end
0
         @server_version
0
       end
...
27
28
29
30
 
31
32
33
...
27
28
29
 
30
31
32
33
0
@@ -27,7 +27,7 @@
0
 module ActiveRecord
0
   module ConnectionAdapters
0
     class DbslayerAdapter
0
- VERSION = '0.2.0'
0
+ VERSION = '0.2.5'
0
     end
0
   end
0
 end
...
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
0
@@ -1 +1,9 @@
0
+desc 'Measures test coverage'
0
+task :test_coverage do
0
+ rm_f "coverage"
0
+ rm_f "coverage.data"
0
+ rcov = "rcov --aggregate coverage.data --text-summary -Ilib"
0
+ system("#{rcov} --html test/test_*.rb")
0
+ system("open coverage/index.html") if PLATFORM['darwin']
0
+end
...
10
11
12
 
 
 
 
13
14
15
...
23
24
25
26
 
27
28
29
...
34
35
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
38
39
...
10
11
12
13
14
15
16
17
18
19
...
27
28
29
 
30
31
32
33
...
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
0
@@ -10,6 +10,10 @@
0
 
0
 STAT_REPLY = {"STAT" => "STAT"}
0
 
0
+CLIENT_INFO_REPLY = {"CLIENT_INFO" => "5.2.27"}
0
+
0
+VERSION_NUM_REPLY = {"SERVER_VERSION" => "50037", "CLIENT_VERSION" => "50037"}
0
+
0
 # Let's mock out the DBSlayer reply
0
 CITY_ROWS = [[123, "Mumbai (Bombay)" , "India" , 10500000] ,
0
             [4112, "Seoul" , "South Korea" , 9981619] ,
0
@@ -23,7 +27,7 @@
0
             [1, "New York" , "United States" , 8008278]
0
            ].freeze
0
 
0
-CITY_TYPES = ["MYSQL_TYPE_"MYSQL_TYPE_STRING", "MYSQL_TYPE_STRING" , "MYSQL_TYPE_LONG"].freeze
0
+CITY_TYPES = ["MYSQL_TYPE_INTEGER", "MYSQL_TYPE_STRING", "MYSQL_TYPE_STRING" , "MYSQL_TYPE_LONG"].freeze
0
 
0
 CITY_HEADER = ["id", "city_name" , "country_name" , "population"].freeze
0
    
0
@@ -34,6 +38,27 @@
0
               }
0
 }.freeze
0
 
0
+COUNTRY_ROWS = [[1, 'United States'], [2, 'Canada'], [3, 'India']].freeze
0
+
0
+COUNTRY_TYPES = ["MYSQL_TYPE_INTEGER", "MYSQL_TYPE_STRING"]
0
+
0
+COUNTRY_HEADER = ["id", "name"]
0
+
0
+MULTIPLE_RESULTS = {
0
+ "RESULT" => [{"TYPES" => CITY_TYPES,
0
+ "HEADER" => CITY_HEADER,
0
+ "ROWS" => CITY_ROWS
0
+ },
0
+
0
+ {"TYPES" => COUNTRY_TYPES,
0
+ "HEADER" => COUNTRY_HEADER,
0
+ "ROWS" => COUNTRY_ROWS
0
+ }
0
+
0
+ ]
0
+}.freeze
0
+
0
+NULL_RESULT = {"SUCCESS" => true}
0
 
0
 SHOW_TABLES_REPLY = {"RESULT"=> {"HEADER"=> ["Tables_in_Test_Database"],
0
                      "ROWS" => [["table1"], ["table2"]],
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
18
19
...
24
25
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
28
29
30
...
40
41
42
43
 
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
...
2
3
4
 
 
 
 
 
 
 
 
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
...
70
71
72
 
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
0
@@ -2,18 +2,28 @@
0
 
0
 class TestDbslayerConnection < Test::Unit::TestCase
0
 
0
- STAT_REPLY = {
0
- "STAT" => "THIS IS A STAT REPLY"
0
- }.freeze
0
-
0
- CLIENT_INFO_REPLY = {
0
- "CLIENT_INFO" => "5.2.27"
0
- }.freeze
0
-
0
   def setup
0
     @slayer = ActiveRecord::ConnectionAdapters::DbslayerConnection.new
0
   end
0
   
0
+ def test_query_string
0
+ query = {"foo" => "bar"}
0
+ assert_equal URI.encode(query.to_json), @slayer.send('query_string', query)
0
+ end
0
+
0
+ # def cmd_execute(endpoint, commands)
0
+ # 147 url = "http://#{host}:#{port}/#{endpoint.to_s}?#{query_string(commands)}"
0
+ # 148 open(url) do |file|
0
+ # 149 JSON.parse(file.read)
0
+ # 150 end
0
+
0
+ # def test_cmd_execute_url
0
+ # query = {"SQL" => "select * from cities"}
0
+ # test = ActiveRecord::ConnectionAdapters::DbslayerConnection.new('localhost', 9090)
0
+ # URI.expects(:open).with("http://localhost:9090/db?#{test.send(:query_string, query)}")
0
+ # test.send :cmd_execute, :db, query
0
+ # end
0
+
0
   def test_sql_query
0
     sql_command = "select * from cities limit 10"
0
     @slayer.stubs(:cmd_execute).with(:db, {"SQL" => sql_command}).returns(CITY_RESULTS)
0
@@ -24,6 +34,26 @@
0
     assert_not_nil reply.rows
0
   end
0
   
0
+ def test_sql_null_return
0
+ sql_command = "update set posted = 1"
0
+ @slayer.stubs(:cmd_execute).with(:db, {"SQL" => sql_command}).returns(NULL_RESULT)
0
+
0
+ status = @slayer.sql_query(sql_command)
0
+ assert_equal true, status
0
+ end
0
+
0
+ def test_multiple_results
0
+ sql_command = "select * from cities limit 10; select * from countries limit 3"
0
+ @slayer.stubs(:cmd_execute).with(:db, {"SQL" => sql_command}).returns(MULTIPLE_RESULTS)
0
+
0
+ reply = @slayer.sql_query(sql_command)
0
+ assert_kind_of Array, reply
0
+ assert_equal 2, reply.size
0
+ reply.each {|i| assert_kind_of(ActiveRecord::ConnectionAdapters::DbslayerResult, i)}
0
+ assert_equal CITY_ROWS, reply[0].rows
0
+ assert_equal COUNTRY_ROWS, reply[1].rows
0
+ end
0
+
0
   def test_stat
0
     @slayer.stubs(:cmd_execute).with(:db, {"STAT" => true}).returns(STAT_REPLY)
0
     reply = @slayer.mysql_stats
0
0
@@ -40,7 +70,22 @@
0
   
0
   def test_server_error
0
     @slayer.stubs(:cmd_execute).returns(ERROR_REPLY)
0
- assert_raise(DbslayerException) { @slayer.sql_query("SELECT * FROM items") }
0
+ assert_raise(ActiveRecord::ConnectionAdapters::DbslayerException) { @slayer.sql_query("SELECT * FROM items") }
0
   end
0
+
0
+ def test_client_num
0
+ @slayer.stubs(:cmd_execute).with(:db, {"CLIENT_VERSION" => true}).returns(VERSION_NUM_REPLY)
0
+ reply = @slayer.client_version_num
0
+
0
+ assert_equal 50037, reply
0
+ end
0
+
0
+ def test_server_num
0
+ @slayer.stubs(:cmd_execute).with(:db, {"SERVER_VERSION" => true}).returns(VERSION_NUM_REPLY)
0
+ reply = @slayer.server_version_num
0
+
0
+ assert_equal 50037, reply
0
+ end
0
+
0
 end

Comments

    No one has commented yet.