def ParseChangeListKey(key):
  """Returns tuple of all the change list key parts.  Always includes subaction (None if normally not there).  
  All return tuple parts are strings.

  Returns: (kind, action, subaction, zone_source, zone_target, database_set, database, table, row)
  """
  # Default so subaction is always returned
  subaction = None
  try:
    (kind, action, zone_source, zone_target, database_set, database, table, row) = key.split('.')
  except ValueError:
    (kind, action, subaction, zone_source, zone_target, database_set, database, table, row) = key.split('.')

  return (kind, action, subaction, zone_source, zone_target, database_set, database, table, row)