docs: def select(self,sql):
      """
      Execute an SQL select statement and stuff the results into a
      dictionary.
  
      sql = the (case sensitve) SQL statment to execute
      """
      if not self.curs:
        raise LIGOLwDBError, "Database connection not initalized"
      if len(self.table) != 0:
        raise LIGOLwDBError, 'attempt to fill non-empty table from database'
      ligolw = ''
      self.table = {}
      sqltypes = {
        -2 : 'ilwd:char_u',
        1 : 'lstring',
        3 : 'real_8',
        4  : 'int_4s',
        5 : 'int_2s',
        7 : 'real_4',
        8 : 'real_8',
        12 : 'lstring',
        93 : 'lstring', 
        }
      try:
        tab = re.compile(r'[Ff][Rr][Oo][Mm]\s+([A-Za-z0-0_]+)([,\s]+|$)').search(sql).group(1)
      except AttributeError:
        raise LIGOLwDBError, 'could not find table name in query ' + str(sql)
      self.table[tab] = {
        'pos' : 0,
        'column' : {},
        'stream' : (), 
        'query' : sql
        }
      try:
        self.curs.execute(sql)
      except DB2.Error, e:
        raise LIGOLwDBError, e[2]
      desc = self.curs.description
      for col,typ,disp,intsz,prec,sca,nul in desc:
        try:
          self.table[tab]['column'][col] = sqltypes[typ]
        except KeyError:
          raise LIGOLwDBError, 'unknown type returned by database ' + str(typ)
        self.table[tab].setdefault('orderedcol',[]).append(col)
  
      try:
        self.table[tab]['stream'] = self.curs.fetchall()
      except DB2.Error, e:
        raise LIGOLwDBError, e[2]
  
      return len(self.table[tab]['stream'])