/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.backup.encryption.storage;

import android.content.Context;

/**
 * Backup encryption SQLite database. All instances are threadsafe.
 *
 * <p>The database is automatically opened when accessing one of the tables. After the caller is
 * done they must call {@link #close()}.
 */
public class BackupEncryptionDb {
    private final BackupEncryptionDbHelper mHelper;

    /** A new instance, using the storage defined by {@code context}. */
    public static BackupEncryptionDb newInstance(Context context) {
        BackupEncryptionDbHelper helper = new BackupEncryptionDbHelper(context);
        helper.setWriteAheadLoggingEnabled(true);
        return new BackupEncryptionDb(helper);
    }

    private BackupEncryptionDb(BackupEncryptionDbHelper helper) {
        mHelper = helper;
    }

    public TertiaryKeysTable getTertiaryKeysTable() {
        return new TertiaryKeysTable(mHelper);
    }

    /** Deletes the database. */
    public void clear() throws EncryptionDbException {
        mHelper.resetDatabase();
    }

    /**
     * Closes the database if it is open.
     *
     * <p>After calling this, the caller may access one of the tables again which will automatically
     * reopen the database.
     */
    public void close() {
        mHelper.close();
    }
}
