class Shiftzilla::Source

Attributes

id[R]
table[R]

Public Class Methods

new(qid,qinfo) click to toggle source
# File lib/shiftzilla/source.rb, line 6
def initialize(qid,qinfo)
  @id           = qid.to_sym
  @search       = qinfo['search']
  @sharer       = qinfo['sharer']
  @table        = qinfo['table']
  @external_sub = qinfo['external_sub']
  @fields       = qinfo['fields'].map{ |f| f.to_sym }
  @external_bugs_idx = @fields.index(:external_bugs)
end

Public Instance Methods

has_records_for_today?() click to toggle source
# File lib/shiftzilla/source.rb, line 16
def has_records_for_today?
  count = 0
  dbh.execute("SELECT count(*) FROM #{@table} WHERE Snapshot = date('now','localtime')") do |row|
    count = row[0].to_i
  end
  return count > 0
end
load_records(options) click to toggle source
# File lib/shiftzilla/source.rb, line 24
def load_records(options)
  output_format = @fields.map{ |fld| "%{#{fld.to_s}}" }.join("\x1F")
  table_fields  = @fields.map{ |fld| "\"#{field_map[fld]}\"" }.join(',')
  insert_frame  = @fields.map{ |fld| '?' }.join(', ')
  # Previous bz_command that used the savedsearch provided by the config
  #bz_command    = "bugzilla query --savedsearch #{@search} --savedsearch-sharer-id=#{@sharer} --outputformat='#{output_format}\x1F%{flags}flags||EOR'"
  retrieved     = []
  bz_page_size  = 1000
  offset        = 0
  # Results from the query, to be split by "||EOR\n"
  bz_csv        = ""

  # Execute the bugzilla query with pagination
  begin
    # Generate the query via string interpolation and execute
    # Query needs to be hard-coded here for string interpolation
    bz_command = "bugzilla query --from-url 'https://bugzilla.redhat.com/buglist.cgi?bug_severity=unspecified&bug_severity=urgent&bug_severity=high&bug_severity=medium&bug_status=NEW&bug_status=ASSIGNED&bug_status=POST&bug_status=ON_DEV&classification=Red%20Hat&columnlist=short_desc%2Cversion%2Cbug_severity%2Cpriority%2Ccomponent%2Creporter%2Cassigned_to%2Cqa_contact%2Cbug_status%2Cproduct%2Cchangeddate%2Ctarget_release%2Ckeywords%2Cflagtypes.name%2Cbug_file_loc%2Cext_bz_list&f1=component&f10=target_release&f11=target_release&f2=component&f3=version&f4=target_release&f5=target_release&f6=target_release&f7=short_desc&f8=target_release&f9=short_desc&limit=#{bz_page_size}&list_id=12103836&o1=notequals&o10=notsubstring&o11=notsubstring&o2=notequals&o3=notregexp&o4=notsubstring&o5=notsubstring&o6=notsubstring&o7=notsubstring&o8=notsubstring&o9=notsubstring&offset=#{offset}&order=bug_status%2Cpriority%2Cassigned_to%2Cbug_id&product=OKD&product=OpenShift%20Container%20Platform&query_format=advanced&v1=Documentation&v2=RFE&v3=%5E2%5C.' --outputformat='#{output_format}\x1F%{flags}flags||EOR'"
    bz_csv_inner = `#{bz_command}`

    # Shovel results into bz_csv to parse later
    bz_csv << bz_csv_inner

    # Increase the offset by the page limit
    offset += bz_page_size

    # Repeat if we got the same number of results as the limit
  end while bz_csv_inner.split("||EOR\n").length == bz_page_size

  # Parse the results
  bz_csv.split("||EOR\n").each do |row|
    values = row.split("\x1F").map{ |v| v.strip }

    # Validate input
    next unless values.length > 0
    begin
      next unless Integer(values[0]) > 0
    rescue
      puts "Error: `#{values[0]}` is not a valid Bug ID."
      next
    end

    if not @external_bugs_idx.nil?
      if not @external_sub.nil? and not values[@external_bugs_idx].nil? and values[@external_bugs_idx].include?(@external_sub)
        values[@external_bugs_idx] = 1
      else
        values[@external_bugs_idx] = 0
      end
    end

    # Check for blocker+ flag and stub it as a keyword
    if not values[-1].nil? and values[-1].include?("blocker+")
      keyword_idx = @fields.index(:keywords)
      if not values[keyword_idx]
        values[keyword_idx] = "blocker+"
      else
        values[keyword_idx] = values[keyword_idx] + ",blocker+"
      end
    end
    # Check for blocker? flag and stub it as a keyword
    if not values[-1].nil? and values[-1].include?("blocker?")
      keyword_idx = @fields.index(:keywords)
      if not values[keyword_idx]
        values[keyword_idx] = "blocker?"
      else
        values[keyword_idx] = values[keyword_idx] + ",blocker?"
      end
    end

    # Remove flags, which is always the final value
    values = values[0...-2]
    retrieved << values
  end
  puts "Retrieved #{retrieved.length} rows"
  if retrieved.length > 0
    if options[:purge]
      # We know we have new data, so it is okay to nuke the old data
      puts "Purging old records"
      purge_records
    end
    puts "Loading new records"
    dbh.transaction
    retrieved.each do |values|
      dbh.execute("INSERT INTO #{@table} (#{table_fields}) VALUES (#{insert_frame})", values)
    end
    dbh.execute("UPDATE #{@table} SET Snapshot = date('now','localtime') WHERE Snapshot ISNULL")
    dbh.commit
  end
  return retrieved.length
end
purge_records() click to toggle source
# File lib/shiftzilla/source.rb, line 114
def purge_records
  dbh.execute("DELETE FROM #{@table} WHERE Snapshot == date('now','localtime') OR Snapshot ISNULL")
end