code: def _extract_subdomain(self, rowdata):
          
          name = str(rowdata['fully_qualified_subdomain'])
          domain = str(rowdata['domain'])
          n = str(rowdata['sequence'])
          encoded_pubkey = str(rowdata['owner'])
          zonefile_hash = str(rowdata['zonefile_hash'])
          sig = rowdata['signature']
          block_height = int(rowdata['block_height'])
          parent_zonefile_hash = str(rowdata['parent_zonefile_hash'])
          parent_zonefile_index = int(rowdata['parent_zonefile_index'])
          zonefile_offset = int(rowdata['zonefile_offset'])
          txid = str(rowdata['txid'])
          missing = [int(i) for i in rowdata['missing'].split(',')] if rowdata['missing'] is not None and len(rowdata['missing']) > 0 else []
          accepted = int(rowdata['accepted'])
          resolver = str(rowdata['resolver']) if rowdata['resolver'] is not None else None
  
          if accepted == 0:
              accepted = False
          else:
              accepted = True
  
          if sig == '' or sig is None:
              sig = None
          else:
              sig = str(sig)
  
          name = str(name)
          is_subdomain, _, _ = is_address_subdomain(name)
          if not is_subdomain:
              raise Exception("Subdomain DB lookup returned bad subdomain result {}".format(name))
  
          zonefile_str = get_atlas_zonefile_data(zonefile_hash, self.zonefiles_dir)
          if zonefile_str is None:
              log.error("No zone file for {}".format(name))
              raise SubdomainNotFound('{}: missing zone file {}'.format(name, zonefile_hash))
  
          return Subdomain(str(name), str(domain), str(encoded_pubkey), int(n), str(zonefile_str), sig, block_height, parent_zonefile_hash, parent_zonefile_index, zonefile_offset, txid, domain_zonefiles_missing=missing, accepted=accepted, resolver=resolver)
docs: Extract a single subdomain from a DB cursor
          Raise SubdomainNotFound if there are no valid rows