def _get_classid_for_dataset(connection, dataset_id, class_name):
    query = sqlalchemy.text("""
      SELECT id
        FROM dataset_class
       WHERE name = :name
         AND dataset = :dataset_id""")
    result = connection.execute(query, {
        "name": class_name,
        "dataset_id": dataset_id
    })
    if result.rowcount < 1:
        raise exceptions.NoDataFoundException("No such class exists.")
    clsid = result.fetchone()
    return clsid[0]
def create_snapshot(dataset_id):
    """Creates a snapshot of current version of a dataset.

    Snapshots are stored as JSON and have the following structure:
    {
        "name": "..",
        "description": "..",
        "classes": [
            {
                "name": "..",
                "description: "..",
                "recordings": ["..", ...]
            },
            ...
        ]
    }

    Args:
        dataset_id (string/uuid): ID of a dataset.

    Returns:
        ID (UUID) of a snapshot that was created.
    """
    dataset = get(dataset_id)
    if not dataset:
        raise exceptions.NoDataFoundException(
            "Can't find dataset with a specified ID.")
    snapshot = {
        "name":
        dataset["name"],
        "description":
        dataset["description"],
        "classes": [{
            "name": c["name"],
            "description": c["description"],
            "recordings": c["recordings"],
        } for c in dataset["classes"]],
    }
    with db.engine.connect() as connection:
        result = connection.execute(
            sqlalchemy.text("""
            INSERT INTO dataset_snapshot (id, dataset_id, data)
                 VALUES (uuid_generate_v4(), :dataset_id, :data)
              RETURNING id::text
        """), {
                "dataset_id": dataset_id,
                "data": json.dumps(snapshot),
            })
        return result.fetchone()["id"]
def get(id):
    """Get dataset with a specified ID.

    Returns:
        Dictionary with dataset details if it has been found, None
        otherwise.
    """
    with db.engine.connect() as connection:
        result = connection.execute(
            "SELECT id::text, name, description, author, created, public, last_edited "
            "FROM dataset "
            "WHERE id = %s", (str(id), ))
        if result.rowcount < 1:
            raise exceptions.NoDataFoundException(
                "Can't find dataset with a specified ID.")
        row = dict(result.fetchone())
        row["classes"] = _get_classes(row["id"])
        return row