em-mysql 0.4.0 → 0.4.1
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.
- data/em-mysql.gemspec +1 -1
- data/lib/em/mysql.rb +45 -14
- data/lib/sequel/async.rb +12 -7
- metadata +1 -1
    
        data/em-mysql.gemspec
    CHANGED
    
    
    
        data/lib/em/mysql.rb
    CHANGED
    
    | @@ -15,7 +15,6 @@ class EventedMysql < EM::Connection | |
| 15 15 | 
             
                @fd = mysql.socket
         | 
| 16 16 | 
             
                @opts = opts
         | 
| 17 17 | 
             
                @current = nil
         | 
| 18 | 
            -
                @@queue ||= []
         | 
| 19 18 | 
             
                @processing = false
         | 
| 20 19 | 
             
                @connected = true
         | 
| 21 20 |  | 
| @@ -33,6 +32,10 @@ class EventedMysql < EM::Connection | |
| 33 32 | 
             
                'Lost connection to MySQL server during query'
         | 
| 34 33 | 
             
              ] unless defined? DisconnectErrors
         | 
| 35 34 |  | 
| 35 | 
            +
              def queue
         | 
| 36 | 
            +
                opts[:em_mysql].queue
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 36 39 | 
             
              def notify_readable
         | 
| 37 40 | 
             
                log 'readable'
         | 
| 38 41 | 
             
                if item = @current
         | 
| @@ -73,11 +76,11 @@ class EventedMysql < EM::Connection | |
| 73 76 | 
             
              rescue Mysql::Error => e
         | 
| 74 77 | 
             
                log 'mysql error', e.message
         | 
| 75 78 | 
             
                if e.message =~ /Deadlock/
         | 
| 76 | 
            -
                   | 
| 79 | 
            +
                  queue << [response, sql, cblk, eblk]
         | 
| 77 80 | 
             
                  @processing = false
         | 
| 78 81 | 
             
                  next_query
         | 
| 79 82 | 
             
                elsif DisconnectErrors.include? e.message
         | 
| 80 | 
            -
                   | 
| 83 | 
            +
                  queue << [response, sql, cblk, eblk]
         | 
| 81 84 | 
             
                  return close
         | 
| 82 85 | 
             
                elsif cb = (eblk || @opts[:on_error])
         | 
| 83 86 | 
             
                  cb.call(e)
         | 
| @@ -140,13 +143,13 @@ class EventedMysql < EM::Connection | |
| 140 143 | 
             
                    log 'mysql sending', sql
         | 
| 141 144 | 
             
                    @mysql.send_query(sql)
         | 
| 142 145 | 
             
                  else
         | 
| 143 | 
            -
                     | 
| 146 | 
            +
                    queue << [response, sql, cblk, eblk]
         | 
| 144 147 | 
             
                    return
         | 
| 145 148 | 
             
                  end
         | 
| 146 149 | 
             
                rescue Mysql::Error => e
         | 
| 147 150 | 
             
                  log 'mysql error', e.message
         | 
| 148 151 | 
             
                  if DisconnectErrors.include? e.message
         | 
| 149 | 
            -
                     | 
| 152 | 
            +
                    queue << [response, sql, cblk, eblk]
         | 
| 150 153 | 
             
                    return close
         | 
| 151 154 | 
             
                  else
         | 
| 152 155 | 
             
                    raise e
         | 
| @@ -166,7 +169,7 @@ class EventedMysql < EM::Connection | |
| 166 169 | 
             
              private
         | 
| 167 170 |  | 
| 168 171 | 
             
              def next_query
         | 
| 169 | 
            -
                if @connected and !@processing and pending =  | 
| 172 | 
            +
                if @connected and !@processing and pending = queue.shift
         | 
| 170 173 | 
             
                  response, sql, cblk, eblk = pending
         | 
| 171 174 | 
             
                  execute(sql, response, cblk, eblk)
         | 
| 172 175 | 
             
                end
         | 
| @@ -176,6 +179,7 @@ class EventedMysql < EM::Connection | |
| 176 179 | 
             
                return unless @opts[:logging]
         | 
| 177 180 | 
             
                p [Time.now, @fd, (@signature[-4..-1] if @signature), *args]
         | 
| 178 181 | 
             
              end
         | 
| 182 | 
            +
              
         | 
| 179 183 |  | 
| 180 184 | 
             
              public
         | 
| 181 185 |  | 
| @@ -248,30 +252,40 @@ class EventedMysql < EM::Connection | |
| 248 252 | 
             
              end
         | 
| 249 253 | 
             
            end
         | 
| 250 254 |  | 
| 251 | 
            -
            class  | 
| 252 | 
            -
              def  | 
| 253 | 
            -
                @ | 
| 255 | 
            +
            class EmMysql  
         | 
| 256 | 
            +
              def initialize(settings = {})
         | 
| 257 | 
            +
                @queue = []
         | 
| 258 | 
            +
                @settings = { :connections => 4, :logging => false, :em_mysql => self }.merge settings
         | 
| 259 | 
            +
              end
         | 
| 260 | 
            +
              
         | 
| 261 | 
            +
              def queue
         | 
| 262 | 
            +
                @queue
         | 
| 263 | 
            +
              end
         | 
| 264 | 
            +
              
         | 
| 265 | 
            +
              def settings
         | 
| 266 | 
            +
                @settings 
         | 
| 254 267 | 
             
              end
         | 
| 255 268 |  | 
| 256 | 
            -
              def  | 
| 269 | 
            +
              def execute query, type = nil, cblk = nil, eblk = nil, &blk
         | 
| 257 270 | 
             
                unless nil#connection = connection_pool.find{|c| not c.processing and c.connected }
         | 
| 258 271 | 
             
                  @n ||= 0
         | 
| 272 | 
            +
             | 
| 259 273 | 
             
                  connection = connection_pool[@n]
         | 
| 260 274 | 
             
                  @n = 0 if (@n+=1) >= connection_pool.size
         | 
| 261 275 | 
             
                end
         | 
| 262 | 
            -
             | 
| 276 | 
            +
                
         | 
| 263 277 | 
             
                connection.execute(query, type, cblk, eblk, &blk)
         | 
| 264 278 | 
             
              end
         | 
| 265 279 |  | 
| 266 280 | 
             
              %w[ select insert update raw ].each do |type| class_eval %[
         | 
| 267 281 |  | 
| 268 | 
            -
                def  | 
| 282 | 
            +
                def #{type} query, cblk = nil, eblk = nil, &blk
         | 
| 269 283 | 
             
                  execute query, :#{type}, cblk, eblk, &blk
         | 
| 270 284 | 
             
                end
         | 
| 271 285 |  | 
| 272 286 | 
             
              ] end
         | 
| 273 287 |  | 
| 274 | 
            -
              def  | 
| 288 | 
            +
              def all query, type = nil, &blk
         | 
| 275 289 | 
             
                responses = 0
         | 
| 276 290 | 
             
                connection_pool.each do |c|
         | 
| 277 291 | 
             
                  c.execute(query, type) do
         | 
| @@ -281,7 +295,7 @@ class EventedMysql | |
| 281 295 | 
             
                end
         | 
| 282 296 | 
             
              end
         | 
| 283 297 |  | 
| 284 | 
            -
              def  | 
| 298 | 
            +
              def connection_pool
         | 
| 285 299 | 
             
                @connection_pool ||= (1..settings[:connections]).map{ EventedMysql.connect(settings) }
         | 
| 286 300 | 
             
                # p ['connpool', settings[:connections], @connection_pool.size]
         | 
| 287 301 | 
             
                # (1..(settings[:connections]-@connection_pool.size)).each do
         | 
| @@ -291,6 +305,23 @@ class EventedMysql | |
| 291 305 | 
             
              end
         | 
| 292 306 | 
             
            end
         | 
| 293 307 |  | 
| 308 | 
            +
            class EventedMysql
         | 
| 309 | 
            +
              @@proxy_object = EmMysql.new
         | 
| 310 | 
            +
                
         | 
| 311 | 
            +
              def self.databases
         | 
| 312 | 
            +
                 @@databases ||= {}
         | 
| 313 | 
            +
              end
         | 
| 314 | 
            +
              
         | 
| 315 | 
            +
              [:settings, :connection_pool].each do |name|
         | 
| 316 | 
            +
                class_eval "def self.#{name}(*args) @@proxy_object.send(:#{name}, *args); end"
         | 
| 317 | 
            +
              end
         | 
| 318 | 
            +
              
         | 
| 319 | 
            +
              [:execute, :connection_pool, :select, :insert, :update, :raw].each do |name|
         | 
| 320 | 
            +
                class_eval "def self.#{name}(*args, &block) @@proxy_object.send(:#{name}, *args, &block); end"
         | 
| 321 | 
            +
              end
         | 
| 322 | 
            +
              
         | 
| 323 | 
            +
            end
         | 
| 324 | 
            +
             | 
| 294 325 | 
             
            if __FILE__ == $0 and require 'em/spec'
         | 
| 295 326 |  | 
| 296 327 | 
             
              EM.describe EventedMysql, 'individual connections' do
         | 
    
        data/lib/sequel/async.rb
    CHANGED
    
    | @@ -50,38 +50,43 @@ raise 'need Sequel >= 3.2.0' unless Sequel::MAJOR == 3 and Sequel::MINOR >= 2 | |
| 50 50 |  | 
| 51 51 | 
             
            module Sequel
         | 
| 52 52 | 
             
              class Dataset
         | 
| 53 | 
            +
                STOCK_COUNT_OPTS = {:select => ["COUNT(*)".lit], :order => nil} unless defined? STOCK_COUNT_OPTS
         | 
| 54 | 
            +
                def em_mysq
         | 
| 55 | 
            +
                  EventedMysql.databases[db] || EventedMysql
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
                
         | 
| 53 58 | 
             
                def async_insert *args, &cb
         | 
| 54 | 
            -
                   | 
| 59 | 
            +
                  em_mysq.insert insert_sql(*args), &cb
         | 
| 55 60 | 
             
                  nil
         | 
| 56 61 | 
             
                end
         | 
| 57 62 |  | 
| 58 63 | 
             
                def async_insert_ignore *args, &cb
         | 
| 59 | 
            -
                   | 
| 64 | 
            +
                  em_mysq.insert insert_ignore.insert_sql(*args), &cb
         | 
| 60 65 | 
             
                  nil
         | 
| 61 66 | 
             
                end
         | 
| 62 67 |  | 
| 63 68 | 
             
                def async_update *args, &cb
         | 
| 64 | 
            -
                   | 
| 69 | 
            +
                  em_mysq.update update_sql(*args), &cb
         | 
| 65 70 | 
             
                  nil
         | 
| 66 71 | 
             
                end
         | 
| 67 72 |  | 
| 68 73 | 
             
                def async_delete &cb
         | 
| 69 | 
            -
                   | 
| 74 | 
            +
                  em_mysq.execute delete_sql, &cb
         | 
| 70 75 | 
             
                  nil
         | 
| 71 76 | 
             
                end
         | 
| 72 77 |  | 
| 73 78 | 
             
                def async_multi_insert *args, &cb
         | 
| 74 | 
            -
                   | 
| 79 | 
            +
                  em_mysq.execute multi_insert_sql(*args).first, &cb
         | 
| 75 80 | 
             
                  nil
         | 
| 76 81 | 
             
                end
         | 
| 77 82 |  | 
| 78 83 | 
             
                def async_multi_insert_ignore *args, &cb
         | 
| 79 | 
            -
                   | 
| 84 | 
            +
                  em_mysq.execute insert_ignore.multi_insert_sql(*args).first, &cb
         | 
| 80 85 | 
             
                  nil
         | 
| 81 86 | 
             
                end
         | 
| 82 87 |  | 
| 83 88 | 
             
                def async_fetch_rows sql, iter = :each
         | 
| 84 | 
            -
                   | 
| 89 | 
            +
                  em_mysq.raw(sql) do |m|
         | 
| 85 90 | 
             
                    r = m.result
         | 
| 86 91 |  | 
| 87 92 | 
             
                    i = -1
         |