Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source
Show
Ignore:
Timestamp:
02/01/08 08:25:46 (4 months ago)
Author:
bitsweat
Message:

Bundled memcache client consistently returns server responses and checks for errors

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb

    r8546 r8766  
    332332      socket.write command 
    333333      result = socket.gets 
    334       raise MemCacheError, $1.strip if result =~ /^SERVER_ERROR (.*)/ 
     334      raise_on_error_response! result 
     335      result 
    335336    rescue SocketError, SystemCallError, IOError => err 
    336337      server.close 
     
    360361      @mutex.lock if @multithread 
    361362      socket.write command 
    362       socket.gets 
     363      result = socket.gets 
     364      raise_on_error_response! result 
     365      result 
    363366    rescue SocketError, SystemCallError, IOError => err 
    364367      server.close 
     
    384387    begin 
    385388      sock.write "delete #{cache_key} #{expiry}\r\n" 
    386       sock.gets 
     389      result = sock.gets 
     390      raise_on_error_response! result 
     391      result 
    387392    rescue SocketError, SystemCallError, IOError => err 
    388393      server.close 
     
    407412          sock.write "flush_all\r\n" 
    408413          result = sock.gets 
    409           raise MemCacheError, $2.strip if result =~ /^(SERVER_)?ERROR(.*)/ 
     414          raise_on_error_response! result 
     415          result 
    410416        rescue SocketError, SystemCallError, IOError => err 
    411417          server.close 
     
    472478        stats = {} 
    473479        while line = sock.gets do 
     480          raise_on_error_response! line 
    474481          break if line == "END\r\n" 
    475           if line =~ /^STAT ([\w]+) ([\w\.\:]+)/ then 
     482          if line =~ /\ASTAT ([\w]+) ([\w\.\:]+)/ then 
    476483            name, value = $1, $2 
    477484            stats[name] = case name 
     
    483490                            Float(seconds) + (Float(microseconds) / 1_000_000) 
    484491                          else 
    485                             if value =~ /^\d+$/ then 
     492                            if value =~ /\A\d+\Z/ then 
    486493                              value.to_i 
    487494                            else 
     
    565572    socket.write "decr #{cache_key} #{amount}\r\n" 
    566573    text = socket.gets 
     574    raise_on_error_response! text 
    567575    return nil if text == "NOT_FOUND\r\n" 
    568576    return text.to_i 
     
    583591    end 
    584592 
     593    raise_on_error_response! keyline 
    585594    return nil if keyline == "END\r\n" 
    586595 
     
    605614    while keyline = socket.gets do 
    606615      return values if keyline == "END\r\n" 
    607  
    608       unless keyline =~ /^VALUE (.+) (.+) (.+)/ then 
     616      raise_on_error_response! keyline 
     617 
     618      unless keyline =~ /\AVALUE (.+) (.+) (.+)/ then 
    609619        server.close 
    610620        raise MemCacheError, "unexpected response #{keyline.inspect}" 
     
    628638    socket.write "incr #{cache_key} #{amount}\r\n" 
    629639    text = socket.gets 
     640    raise_on_error_response! text 
    630641    return nil if text == "NOT_FOUND\r\n" 
    631642    return text.to_i 
     
    681692    @mutex.unlock 
    682693  end 
     694 
     695  def raise_on_error_response!(response) 
     696    if response =~ /\A(?:CLIENT_|SERVER_)?ERROR (.*)/ 
     697      raise MemCacheError, $1.strip 
     698    end 
     699  end 
     700 
    683701 
    684702  ## 
     
    821839      @status = sprintf "DEAD: %s, will retry at %s", reason, @retry 
    822840    end 
    823  
    824841  end 
    825842