code: def get_gff_db(gff_fname,
                 ext=".db"):
      
      if not os.path.isfile(gff_fname):
          # Not sure how we should deal with errors normally in
          # gffutils -- Ryan?
          raise ValueError("GFF %s does not exist." % (gff_fname))
      candidate_db_fname = "%s.%s" % (gff_fname, ext)
      if os.path.isfile(candidate_db_fname):
          # Standard .db file found, so return it
          return candidate_db_fname
      # Otherwise, we need to create a temporary but non-deleted
      # file to store the db in. It'll be up to the user
      # of the function the delete the file when done.
      ## NOTE: Ryan must have a good scheme for dealing with this
      ## since pybedtools does something similar under the hood, i.e.
      ## creating temporary files as needed without over proliferation
      db_fname = tempfile.NamedTemporaryFile(delete=False)
      # Create the database for the gff file (suppress output
      # when using function internally)
      print("Creating db for %s" % (gff_fname))
      t1 = time.time()
      db = gffutils.create_db(gff_fname, db_fname.name,
                              merge_strategy="merge",
                              verbose=False)
      t2 = time.time()
      print("  - Took %.2f seconds" % (t2 - t1))
      return db
docs: Get db for GFF file. If the database has a .db file,
      load that. Otherwise, create a named temporary file,
      serialize the db to that, and return the loaded database.