module HelixVersioningEngine # 'counters' operations. # # The 'counter' resource is really just a key-value instance. We open up # the counters table to allow applications to basically use them for various # locking and unlocking operations. class App < Sinatra::Base # List all counters in the system # # Optional URL parameters: # # - `nameFilter` (-e) # - `max` (-m) # - `sideTable` (-u) UNDOCUMENTED # get '/p4/:api/counters' do |_| nameFilter = params['nameFilter'] if params.key?('nameFilter') max = params['max'] if params.key?('max') sideTable = true if params.key?('sideTable') require_p4 p4 = env['p4'] cmd = ["counters"] cmd.push('-e', nameFilter) if nameFilter cmd.push('-m', max) if max cmd.push('-u') if sideTable counters = p4.run(*cmd) counters = [] unless counters # I've noticed invalid UTF-8 characters coming from server keys on # non-unicode servers. Try to force the UTF-8 encoding, and replace # illegal characters. begin counters.to_json rescue JSON::GeneratorError converted = counters.map do |h| Hash[h.map do |key, value| [key, value.encode('UTF-8', 'UTF-8', invalid: :replace, undef: :replace, replace: '?')] end] end converted.to_json end end get '/p4/:api/counters/:counter' do |_, counter| require_p4 p4 = env['p4'] results = p4.run_counter(counter) # If the counter doesn't exist, you just get a counter result with the # value 0 results.first.to_json end put '/p4/:api/counters/:counter' do |_, counter| require_p4 p4 = env['p4'] results = p4.run_counter('-f', counter, params['value']) results.nil? ? '' : results.to_json end delete '/p4/:api/counters/:counter' do |_, counter| require_p4 p4 = env['p4'] r = p4.run_counter('-f', '-d', counter) r.nil? ? '' : r.to_json end post '/p4/:api/counters/:counter/increment' do |_, counter| require_p4 p4 = env['p4'] results = p4.run_counter('-f', '-i', counter) results.nil? ? '' : results.to_json end end end