% 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.

-module(fabric2_db).

-export([
    create/2,
    open/2,
    delete/2,
    undelete/4,

    list_dbs/0,
    list_dbs/1,
    list_dbs/3,

    list_dbs_info/0,
    list_dbs_info/1,
    list_dbs_info/3,

    list_deleted_dbs_info/0,
    list_deleted_dbs_info/1,
    list_deleted_dbs_info/3,

    check_is_admin/1,
    check_is_member/1,

    name/1,
    get_after_doc_read_fun/1,
    get_before_doc_update_fun/1,
    get_committed_update_seq/1,
    get_compacted_seq/1,
    get_compactor_pid/1,
    get_db_info/1,
    %% get_partition_info/2,
    get_del_doc_count/1,
    get_doc_count/1,
    get_doc_count/2,
    %% get_epochs/1,
    %% get_filepath/1,
    get_instance_start_time/1,
    get_pid/1,
    get_revs_limit/1,
    get_revs_limit/2,
    get_security/1,
    get_security/2,
    get_update_seq/1,
    get_user_ctx/1,
    get_uuid/1,
    %% get_purge_seq/1,
    %% get_oldest_purge_seq/1,
    %% get_purge_infos_limit/1,

    is_clustered/1,
    is_db/1,
    is_partitioned/1,
    is_system_db/1,
    is_system_db_name/1,
    is_replicator_db/1,
    is_users_db/1,

    set_revs_limit/2,
    %% set_purge_infos_limit/2,
    set_security/2,
    set_user_ctx/2,

    ensure_full_commit/1,
    ensure_full_commit/2,

    %% load_validation_funs/1,
    %% reload_validation_funs/1,

    open_doc/2,
    open_doc/3,
    open_doc_revs/4,
    %% open_doc_int/3,
    get_doc_info/2,
    get_full_doc_info/2,
    get_full_doc_infos/2,
    get_missing_revs/2,
    get_design_docs/1,
    %% get_purge_infos/2,

    %% get_minimum_purge_seq/1,
    %% purge_client_exists/3,

    validate_docid/1,
    %% doc_from_json_obj_validate/2,

    update_doc/2,
    update_doc/3,
    update_docs/2,
    update_docs/3,
    %% delete_doc/3,

    %% purge_docs/2,
    %% purge_docs/3,

    read_attachment/3,
    write_attachment/3,

    fold_docs/3,
    fold_docs/4,
    fold_docs/5,
    fold_design_docs/4,
    fold_local_docs/4,
    fold_changes/4,
    fold_changes/5,
    %% count_changes_since/2,
    %% fold_purge_infos/4,
    %% fold_purge_infos/5,

    %% calculate_start_seq/3,
    %% owner_of/2,

    %% start_compact/1,
    %% cancel_compact/1,
    %% wait_for_compaction/1,
    %% wait_for_compaction/2,

    dbname_suffix/1,
    validate_dbname/1,

    %% make_doc/5,
    new_revid/2,

    apply_open_doc_opts/3
]).

-include_lib("couch/include/couch_db.hrl").
-include("fabric2.hrl").
-include_lib("kernel/include/logger.hrl").

% Default max database name length is based on CouchDb < 4.x compatibility. See
% default.ini entry for additional information.
-define(DEFAULT_MAX_DATABASE_NAME_LENGTH, 238).

-define(DBNAME_REGEX,
    % use the stock CouchDB regex
    "^[a-z][a-z0-9\\_\\$()\\+\\-\\/]*"
    % but allow an optional shard timestamp at the end
    "(\\.[0-9]{10,})?$"
).

-define(FIRST_DDOC_KEY, <<"_design/">>).
-define(LAST_DDOC_KEY, <<"_design0">>).

-define(RETURN(Term), throw({?MODULE, Term})).

-define(DEFAULT_UPDATE_DOCS_BATCH_SIZE, 2500000).

-record(bacc, {
    db,
    docs,
    batch_size,
    options,
    rev_futures,
    seen,
    results
}).

create(DbName, Options) ->
    case validate_dbname(DbName) of
        ok ->
            Result = fabric2_fdb:transactional(DbName, fun(TxDb) ->
                case fabric2_fdb:exists(TxDb) of
                    true ->
                        {error, file_exists};
                    false ->
                        fabric2_fdb:create(TxDb, Options)
                end
            end),
            % We cache outside of the transaction so that we're sure
            % that the transaction was committed.
            case Result of
                #{} = Db0 ->
                    Db1 = maybe_add_sys_db_callbacks(Db0),
                    ok = fabric2_server:store(Db1),
                    fabric2_db_plugin:after_db_create(DbName, get_uuid(Db1)),
                    {ok, Db1#{tx := undefined}};
                Error ->
                    Error
            end;
        Error ->
            Error
    end.

open(DbName, Options) ->
    UUID = fabric2_util:get_value(uuid, Options),
    case fabric2_server:fetch(DbName, UUID) of
        #{} = Db ->
            Db1 = maybe_set_user_ctx(Db, Options),
            Db2 = maybe_set_interactive(Db1, Options),
            {ok, require_member_check(Db2)};
        undefined ->
            Result = fabric2_fdb:transactional(DbName, fun(TxDb) ->
                fabric2_fdb:open(TxDb, Options)
            end),
            % Cache outside the transaction retry loop
            case Result of
                #{} = Db0 ->
                    Db1 = maybe_add_sys_db_callbacks(Db0),
                    ok = fabric2_server:store(Db1),
                    Db2 = Db1#{tx := undefined},
                    {ok, require_member_check(Db2)};
                Error ->
                    Error
            end
    end.

delete(DbName, Options) ->
    % Delete doesn't check user_ctx, that's done at the HTTP API level
    % here we just care to get the `database_does_not_exist` error thrown
    Options1 = lists:keystore(user_ctx, 1, Options, ?ADMIN_CTX),
    case lists:keyfind(deleted_at, 1, Options1) of
        {deleted_at, TimeStamp} ->
            fabric2_fdb:transactional(DbName, fun(TxDb) ->
                fabric2_fdb:remove_deleted_db(TxDb, TimeStamp)
            end);
        false ->
            {ok, Db} = open(DbName, Options1),
            Resp = fabric2_fdb:transactional(Db, fun(TxDb) ->
                fabric2_fdb:delete(TxDb)
            end),
            if
                Resp /= ok ->
                    Resp;
                true ->
                    fabric2_db_plugin:after_db_delete(DbName, get_uuid(Db)),
                    fabric2_server:remove(DbName)
            end
    end.

undelete(DbName, TgtDbName, TimeStamp, Options) ->
    case validate_dbname(TgtDbName) of
        ok ->
            Resp = fabric2_fdb:transactional(
                DbName,
                fun(TxDb) ->
                    fabric2_fdb:undelete(TxDb, TgtDbName, TimeStamp)
                end
            ),
            if
                Resp /= ok ->
                    ok;
                true ->
                    {ok, Db} = open(TgtDbName, Options),
                    fabric2_db_plugin:after_db_create(TgtDbName, get_uuid(Db))
            end,
            Resp;
        Error ->
            Error
    end.

list_dbs() ->
    list_dbs([]).

list_dbs(Options) ->
    Callback = fun(DbName, Acc) -> [DbName | Acc] end,
    DbNames = fabric2_fdb:transactional(fun(Tx) ->
        fabric2_fdb:list_dbs(Tx, Callback, [], Options)
    end),
    lists:reverse(DbNames).

list_dbs(UserFun, UserAcc0, Options) ->
    FoldFun = fun(DbName, Acc) -> maybe_stop(UserFun({row, [{id, DbName}]}, Acc)) end,
    try
        UserAcc1 = maybe_stop(UserFun({meta, []}, UserAcc0)),
        UserAcc2 = fabric2_fdb:transactional(fun(Tx) ->
            fabric2_fdb:list_dbs(Tx, FoldFun, UserAcc1, Options)
        end),
        {ok, maybe_stop(UserFun(complete, UserAcc2))}
    catch
        throw:{stop, FinalUserAcc} ->
            {ok, FinalUserAcc}
    end.

list_dbs_info() ->
    list_dbs_info([]).

list_dbs_info(Options) ->
    Callback = fun(Value, Acc) ->
        NewAcc =
            case Value of
                {meta, _} -> Acc;
                {row, DbInfo} -> [DbInfo | Acc];
                complete -> Acc
            end,
        {ok, NewAcc}
    end,
    {ok, DbInfos} = list_dbs_info(Callback, [], Options),
    {ok, lists:reverse(DbInfos)}.

list_dbs_info(UserFun, UserAcc0, Options) ->
    FoldFun = fun(DbName, InfoFuture, {FutureQ, Count, Acc}) ->
        NewFutureQ = queue:in({DbName, InfoFuture}, FutureQ),
        drain_info_futures(NewFutureQ, Count + 1, UserFun, Acc)
    end,
    try
        UserAcc1 = maybe_stop(UserFun({meta, []}, UserAcc0)),
        InitAcc = {queue:new(), 0, UserAcc1},
        UserAcc3 = fabric2_fdb:transactional(fun(Tx) ->
            {FinalFutureQ, _, UserAcc2} = fabric2_fdb:list_dbs_info(
                Tx,
                FoldFun,
                InitAcc,
                Options
            ),
            drain_all_info_futures(FinalFutureQ, UserFun, UserAcc2)
        end),
        {ok, maybe_stop(UserFun(complete, UserAcc3))}
    catch
        throw:{stop, FinalUserAcc} ->
            {ok, FinalUserAcc}
    end.

list_deleted_dbs_info() ->
    list_deleted_dbs_info([]).

list_deleted_dbs_info(Options) ->
    Callback = fun(Value, Acc) ->
        NewAcc =
            case Value of
                {meta, _} -> Acc;
                {row, DbInfo} -> [DbInfo | Acc];
                complete -> Acc
            end,
        {ok, NewAcc}
    end,
    {ok, DbInfos} = list_deleted_dbs_info(Callback, [], Options),
    {ok, lists:reverse(DbInfos)}.

list_deleted_dbs_info(UserFun, UserAcc0, Options0) ->
    Dir = fabric2_util:get_value(dir, Options0, fwd),
    StartKey0 = fabric2_util:get_value(start_key, Options0),
    EndKey0 = fabric2_util:get_value(end_key, Options0),

    {FirstBinary, LastBinary} =
        case Dir of
            fwd -> {<<>>, <<255>>};
            rev -> {<<255>>, <<>>}
        end,

    StartKey1 =
        case StartKey0 of
            undefined ->
                {FirstBinary};
            DbName0 when is_binary(DbName0) ->
                {DbName0, FirstBinary};
            [DbName0, TimeStamp0] when is_binary(DbName0), is_binary(TimeStamp0) ->
                {DbName0, TimeStamp0};
            BadStartKey ->
                erlang:error({invalid_start_key, BadStartKey})
        end,
    EndKey1 =
        case EndKey0 of
            undefined ->
                {LastBinary};
            DbName1 when is_binary(DbName1) ->
                {DbName1, LastBinary};
            [DbName1, TimeStamp1] when is_binary(DbName1), is_binary(TimeStamp1) ->
                {DbName1, TimeStamp1};
            BadEndKey ->
                erlang:error({invalid_end_key, BadEndKey})
        end,

    Options1 = Options0 -- [{start_key, StartKey0}, {end_key, EndKey0}],
    Options2 =
        [
            {start_key, StartKey1},
            {end_key, EndKey1},
            {wrap_keys, false}
        ] ++ Options1,

    FoldFun = fun(DbName, TimeStamp, InfoFuture, {FutureQ, Count, Acc}) ->
        NewFutureQ = queue:in({DbName, TimeStamp, InfoFuture}, FutureQ),
        drain_deleted_info_futures(NewFutureQ, Count + 1, UserFun, Acc)
    end,
    try
        UserAcc1 = maybe_stop(UserFun({meta, []}, UserAcc0)),
        InitAcc = {queue:new(), 0, UserAcc1},
        UserAcc3 = fabric2_fdb:transactional(fun(Tx) ->
            {FinalFutureQ, _, UserAcc2} = fabric2_fdb:list_deleted_dbs_info(
                Tx,
                FoldFun,
                InitAcc,
                Options2
            ),
            drain_all_deleted_info_futures(FinalFutureQ, UserFun, UserAcc2)
        end),
        {ok, maybe_stop(UserFun(complete, UserAcc3))}
    catch
        throw:{stop, FinalUserAcc} ->
            {ok, FinalUserAcc}
    end.

is_admin(Db, {SecProps}) when is_list(SecProps) ->
    case fabric2_db_plugin:check_is_admin(Db) of
        true ->
            true;
        false ->
            UserCtx = get_user_ctx(Db),
            {Admins} = get_admins(SecProps),
            is_authorized(Admins, UserCtx)
    end.

check_is_admin(Db) ->
    check_is_admin(Db, get_security(Db)).

check_is_admin(Db, SecDoc) ->
    case is_admin(Db, SecDoc) of
        true ->
            ok;
        false ->
            UserCtx = get_user_ctx(Db),
            Reason = <<"You are not a db or server admin.">>,
            throw_security_error(UserCtx, Reason)
    end.

check_is_member(Db) ->
    check_is_member(Db, get_security(Db)).

check_is_member(Db, SecDoc) ->
    case is_member(Db, SecDoc) of
        true ->
            ok;
        false ->
            UserCtx = get_user_ctx(Db),
            throw_security_error(UserCtx)
    end.

require_admin_check(#{} = Db) ->
    Db#{security_fun := fun check_is_admin/2}.

require_member_check(#{} = Db) ->
    Db#{security_fun := fun check_is_member/2}.

name(#{name := DbName}) ->
    DbName.

get_after_doc_read_fun(#{after_doc_read := AfterDocRead}) ->
    AfterDocRead.

get_before_doc_update_fun(#{before_doc_update := BeforeDocUpdate}) ->
    BeforeDocUpdate.

get_committed_update_seq(#{} = Db) ->
    get_update_seq(Db).

get_compacted_seq(#{} = Db) ->
    get_update_seq(Db).

get_compactor_pid(#{} = _Db) ->
    nil.

get_db_info(#{} = Db) ->
    DbProps = fabric2_fdb:transactional(Db, fun(TxDb) ->
        fabric2_fdb:get_info(TxDb)
    end),
    {ok, make_db_info(name(Db), DbProps)}.

get_del_doc_count(#{} = Db) ->
    get_doc_count(Db, <<"doc_del_count">>).

get_doc_count(Db) ->
    get_doc_count(Db, <<"doc_count">>).

get_doc_count(Db, undefined) ->
    get_doc_count(Db, <<"doc_count">>);
get_doc_count(Db, <<"_all_docs">>) ->
    get_doc_count(Db, <<"doc_count">>);
get_doc_count(DbName, <<"_design">>) ->
    get_doc_count(DbName, <<"doc_design_count">>);
get_doc_count(DbName, <<"_local">>) ->
    get_doc_count(DbName, <<"doc_local_count">>);
get_doc_count(Db, Key) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        fabric2_fdb:get_stat(TxDb, Key)
    end).

get_instance_start_time(#{}) ->
    0.

get_pid(#{}) ->
    nil.

get_revs_limit(#{} = Db) ->
    get_revs_limit(Db, []).

get_revs_limit(#{} = Db, Opts) ->
    CurrentDb = get_cached_db(Db, Opts),
    maps:get(revs_limit, CurrentDb).

get_security(#{} = Db) ->
    get_security(Db, []).

get_security(#{} = Db, Opts) ->
    CurrentDb = get_cached_db(Db, Opts),
    maps:get(security_doc, CurrentDb).

get_update_seq(#{} = Db) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        fabric2_fdb:get_last_change(TxDb)
    end).

get_user_ctx(#{user_ctx := UserCtx}) ->
    UserCtx.

get_uuid(#{uuid := UUID}) ->
    UUID.

is_clustered(#{}) ->
    false.

is_db(#{name := _}) ->
    true;
is_db(_) ->
    false.

is_partitioned(#{}) ->
    false.

is_system_db(#{name := DbName}) ->
    is_system_db_name(DbName).

is_system_db_name(DbName) when is_list(DbName) ->
    is_system_db_name(?l2b(DbName));
is_system_db_name(DbName) when is_binary(DbName) ->
    Suffix = filename:basename(DbName),
    case {filename:dirname(DbName), lists:member(Suffix, ?SYSTEM_DATABASES)} of
        {<<".">>, Result} ->
            Result;
        {_Prefix, false} ->
            false;
        {Prefix, true} ->
            ReOpts = [{capture, none}, dollar_endonly],
            re:run(Prefix, ?DBNAME_REGEX, ReOpts) == match
    end.

is_replicator_db(#{name := DbName}) ->
    is_replicator_db(DbName);
is_replicator_db(DbName) when is_binary(DbName) ->
    fabric2_util:dbname_ends_with(DbName, <<"_replicator">>).

is_users_db(#{name := DbName}) ->
    is_users_db(DbName);
is_users_db(DbName) when is_binary(DbName) ->
    AuthenticationDb = config:get("chttpd_auth", "authentication_db"),
    CfgUsersSuffix = config:get("couchdb", "users_db_suffix", "_users"),

    IsAuthCache =
        if
            AuthenticationDb == undefined -> false;
            true -> DbName == ?l2b(AuthenticationDb)
        end,
    IsCfgUsersDb = fabric2_util:dbname_ends_with(DbName, ?l2b(CfgUsersSuffix)),
    IsGlobalUsersDb = fabric2_util:dbname_ends_with(DbName, <<"_users">>),

    IsAuthCache orelse IsCfgUsersDb orelse IsGlobalUsersDb.

set_revs_limit(#{} = Db0, RevsLimit) when is_integer(RevsLimit) ->
    Db1 = require_admin_check(Db0),
    Resp = fabric2_fdb:transactional(Db1, fun(TxDb) ->
        fabric2_fdb:set_config(TxDb, revs_limit, RevsLimit)
    end),
    case Resp of
        {ok, #{} = Db2} -> fabric2_server:store(Db2);
        Err -> Err
    end.

set_security(#{} = Db0, Security) ->
    Db1 = require_admin_check(Db0),
    ok = fabric2_util:validate_security_object(Security),
    Resp = fabric2_fdb:transactional(Db1, fun(TxDb) ->
        fabric2_fdb:set_config(TxDb, security_doc, Security)
    end),
    case Resp of
        {ok, #{} = Db2} -> fabric2_server:store(Db2);
        Err -> Err
    end.

set_user_ctx(#{} = Db, UserCtx) ->
    Db#{user_ctx := UserCtx}.

ensure_full_commit(#{}) ->
    {ok, 0}.

ensure_full_commit(#{}, _Timeout) ->
    {ok, 0}.

open_doc(#{} = Db, DocId) ->
    open_doc(Db, DocId, []).

open_doc(#{} = Db, <<?LOCAL_DOC_PREFIX, _/binary>> = DocId, _Options) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        case fabric2_fdb:get_local_doc(TxDb, DocId) of
            #doc{} = Doc -> {ok, Doc};
            Else -> Else
        end
    end);
open_doc(#{} = Db, DocId, Options) ->
    NeedsTreeOpts = [revs_info, conflicts, deleted_conflicts],
    NeedsTree = (Options -- NeedsTreeOpts /= Options),
    OpenDeleted = lists:member(deleted, Options),
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        Revs =
            case NeedsTree of
                true -> fabric2_fdb:get_all_revs(TxDb, DocId);
                false -> fabric2_fdb:get_winning_revs(TxDb, DocId, 1)
            end,
        if
            Revs == [] ->
                {not_found, missing};
            true ->
                #{winner := true} = RI = lists:last(Revs),
                case fabric2_fdb:get_doc_body(TxDb, DocId, RI) of
                    #doc{deleted = true} when not OpenDeleted ->
                        {not_found, deleted};
                    #doc{} = Doc ->
                        apply_open_doc_opts(Doc, Revs, Options);
                    Else ->
                        Else
                end
        end
    end).

open_doc_revs(Db, DocId, Revs, Options) ->
    Latest = lists:member(latest, Options),
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        AllRevInfos = fabric2_fdb:get_all_revs(TxDb, DocId),
        RevTree = lists:foldl(
            fun(RI, TreeAcc) ->
                RIPath = fabric2_util:revinfo_to_path(RI),
                {Merged, _} = couch_key_tree:merge(TreeAcc, RIPath),
                Merged
            end,
            [],
            AllRevInfos
        ),
        {Found, Missing} =
            case Revs of
                all ->
                    {couch_key_tree:get_all_leafs(RevTree), []};
                _ when Latest ->
                    couch_key_tree:get_key_leafs(RevTree, Revs);
                _ ->
                    couch_key_tree:get(RevTree, Revs)
            end,
        Docs = lists:map(
            fun({Value, {Pos, [Rev | RevPath]}}) ->
                case Value of
                    ?REV_MISSING ->
                        % We have the rev in our list but know nothing about it
                        {{not_found, missing}, {Pos, Rev}};
                    _ ->
                        RevInfo = #{
                            rev_id => {Pos, Rev},
                            rev_path => RevPath
                        },
                        case fabric2_fdb:get_doc_body(TxDb, DocId, RevInfo) of
                            #doc{} = Doc ->
                                apply_open_doc_opts(Doc, AllRevInfos, Options);
                            Else ->
                                {Else, {Pos, Rev}}
                        end
                end
            end,
            Found
        ),
        MissingDocs = [{{not_found, missing}, MRev} || MRev <- Missing],
        {ok, Docs ++ MissingDocs}
    end).

get_doc_info(Db, DocId) ->
    case get_full_doc_info(Db, DocId) of
        not_found -> not_found;
        FDI -> couch_doc:to_doc_info(FDI)
    end.

get_full_doc_info(Db, DocId) ->
    RevInfos = fabric2_fdb:transactional(Db, fun(TxDb) ->
        fabric2_fdb:get_all_revs(TxDb, DocId)
    end),
    if
        RevInfos == [] ->
            not_found;
        true ->
            #{winner := true} = Winner = lists:last(RevInfos),
            RevTree = lists:foldl(
                fun(RI, TreeAcc) ->
                    RIPath = fabric2_util:revinfo_to_path(RI),
                    {Merged, _} = couch_key_tree:merge(TreeAcc, RIPath),
                    Merged
                end,
                [],
                RevInfos
            ),
            #full_doc_info{
                id = DocId,
                update_seq = fabric2_fdb:vs_to_seq(maps:get(sequence, Winner)),
                deleted = maps:get(deleted, Winner),
                rev_tree = RevTree
            }
    end.

get_full_doc_infos(Db, DocIds) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        lists:map(
            fun(DocId) ->
                get_full_doc_info(TxDb, DocId)
            end,
            DocIds
        )
    end).

get_missing_revs(Db, JsonIdRevs) ->
    IdRevs = [idrevs(IdR) || IdR <- JsonIdRevs],
    AllRevInfos = fabric2_fdb:transactional(Db, fun(TxDb) ->
        lists:foldl(
            fun({Id, _Revs}, Acc) ->
                case maps:is_key(Id, Acc) of
                    true ->
                        Acc;
                    false ->
                        RevInfos = fabric2_fdb:get_all_revs(TxDb, Id),
                        Acc#{Id => RevInfos}
                end
            end,
            #{},
            IdRevs
        )
    end),
    AllMissing = lists:flatmap(
        fun({Id, Revs}) ->
            #{Id := RevInfos} = AllRevInfos,
            Missing =
                try
                    lists:foldl(
                        fun(RevInfo, RevAcc) ->
                            if
                                RevAcc /= [] -> ok;
                                true -> throw(all_found)
                            end,
                            filter_found_revs(RevInfo, RevAcc)
                        end,
                        Revs,
                        RevInfos
                    )
                catch
                    throw:all_found ->
                        []
                end,
            if
                Missing == [] ->
                    [];
                true ->
                    PossibleAncestors = find_possible_ancestors(RevInfos, Missing),
                    [{Id, Missing, PossibleAncestors}]
            end
        end,
        IdRevs
    ),
    {ok, AllMissing}.

get_design_docs(Db) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        #{
            db_prefix := DbPrefix
        } = TxDb,

        Prefix = erlfdb_tuple:pack({?DB_ALL_DOCS}, DbPrefix),
        Options = set_design_doc_keys([]),
        FoldFun = fun({Key, Val}, Acc) ->
            {DocId} = erlfdb_tuple:unpack(Key, Prefix),
            RevId = erlfdb_tuple:unpack(Val),
            Rev = #{
                rev_id => RevId,
                rev_path => []
            },
            Future = fabric2_fdb:get_doc_body_future(TxDb, DocId, Rev),
            [{DocId, Rev, Future} | Acc]
        end,
        Futures = fabric2_fdb:fold_range(TxDb, Prefix, FoldFun, [], Options),

        % Using foldl instead of map means that the design
        % docs come out in sorted order.
        lists:foldl(
            fun({DocId, Rev, Future}, Acc) ->
                [fabric2_fdb:get_doc_body_wait(TxDb, DocId, Rev, Future) | Acc]
            end,
            [],
            Futures
        )
    end).

validate_docid(<<"">>) ->
    throw({illegal_docid, <<"Document id must not be empty">>});
validate_docid(<<"_design/">>) ->
    throw({illegal_docid, <<"Illegal document id `_design/`">>});
validate_docid(<<"_local/">>) ->
    throw({illegal_docid, <<"Illegal document id `_local/`">>});
validate_docid(Id) when is_binary(Id) ->
    ConfigDocIdLength = config:get_integer(
        "couchdb", "max_document_id_length", ?DOC_ID_LIMIT_BYTES
    ),
    DocIdLength = min(ConfigDocIdLength, ?DOC_ID_LIMIT_BYTES),
    case DocIdLength > 0 andalso byte_size(Id) > DocIdLength of
        true -> throw({illegal_docid, <<"Document id is too long">>});
        false -> ok
    end,
    case couch_util:validate_utf8(Id) of
        false -> throw({illegal_docid, <<"Document id must be valid UTF-8">>});
        true -> ok
    end,
    case Id of
        <<?DESIGN_DOC_PREFIX, _/binary>> ->
            ok;
        <<?LOCAL_DOC_PREFIX, _/binary>> ->
            ok;
        <<"_", _/binary>> ->
            case fabric2_db_plugin:validate_docid(Id) of
                true ->
                    ok;
                false ->
                    throw(
                        {illegal_docid, <<"Only reserved document ids may start with underscore.">>}
                    )
            end;
        _Else ->
            ok
    end;
validate_docid(Id) ->
    ?LOG_DEBUG(#{what => illegal_docid, docid => Id}),
    couch_log:debug("Document id is not a string: ~p", [Id]),
    throw({illegal_docid, <<"Document id must be a string">>}).

update_doc(Db, Doc) ->
    update_doc(Db, Doc, []).

update_doc(Db, Doc, Options) ->
    case update_docs(Db, [Doc], Options) of
        {ok, [{ok, NewRev}]} ->
            {ok, NewRev};
        {ok, [{{_Id, _Rev}, Error}]} ->
            throw(Error);
        {error, [{{_Id, _Rev}, Error}]} ->
            throw(Error);
        {error, [Error]} ->
            throw(Error);
        {ok, []} ->
            % replication success
            {Pos, [RevId | _]} = Doc#doc.revs,
            {ok, {Pos, RevId}}
    end.

update_docs(Db, Docs) ->
    update_docs(Db, Docs, []).

update_docs(Db, Docs0, Options) ->
    Docs1 = apply_before_doc_update(Db, Docs0, Options),
    try
        validate_atomic_update(Docs0, lists:member(all_or_nothing, Options)),

        Resps0 = batch_update_docs(Db, Docs1, Options),

        % Notify index builder
        fabric2_index:db_updated(name(Db)),

        % Convert errors
        Resps1 = lists:map(
            fun(Resp) ->
                case Resp of
                    {#doc{} = Doc, Error} ->
                        #doc{
                            id = DocId,
                            revs = Revs
                        } = Doc,
                        RevId =
                            case Revs of
                                {RevPos, [Rev | _]} -> {RevPos, Rev};
                                {0, []} -> {0, <<>>};
                                Else -> Else
                            end,
                        {{DocId, RevId}, Error};
                    Else ->
                        Else
                end
            end,
            Resps0
        ),
        case is_replicated(Options) of
            true ->
                {ok,
                    lists:flatmap(
                        fun(R) ->
                            case R of
                                {ok, []} -> [];
                                {{_, _}, {ok, []}} -> [];
                                Else -> [Else]
                            end
                        end,
                        Resps1
                    )};
            false ->
                {ok, Resps1}
        end
    catch
        throw:{aborted, Errors} ->
            {aborted, Errors}
    end.

read_attachment(Db, DocId, AttId) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        fabric2_fdb:read_attachment(TxDb, DocId, AttId)
    end).

write_attachment(Db, DocId, Att) ->
    Data = couch_att:fetch(data, Att),
    Encoding = couch_att:fetch(encoding, Att),
    {ok, AttId} = fabric2_fdb:write_attachment(Db, DocId, Data, Encoding),
    couch_att:store(data, {loc, Db, DocId, AttId}, Att).

fold_docs(Db, UserFun, UserAcc) ->
    fold_docs(Db, UserFun, UserAcc, []).

fold_docs(Db, UserFun, UserAcc0, Options) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        try
            #{
                db_prefix := DbPrefix
            } = TxDb,

            Prefix = erlfdb_tuple:pack({?DB_ALL_DOCS}, DbPrefix),
            Meta = get_all_docs_meta(TxDb, Options),

            UserAcc1 = maybe_stop(UserFun({meta, Meta}, UserAcc0)),

            UserAcc2 = fabric2_fdb:fold_range(
                TxDb,
                Prefix,
                fun({K, V}, Acc) ->
                    {DocId} = erlfdb_tuple:unpack(K, Prefix),
                    RevId = erlfdb_tuple:unpack(V),
                    Row0 = [
                        {id, DocId},
                        {key, DocId},
                        {value, {[{rev, couch_doc:rev_to_str(RevId)}]}}
                    ],

                    DocOpts = couch_util:get_value(doc_opts, Options, []),
                    OpenOpts = [deleted | DocOpts],

                    Row1 =
                        case lists:keyfind(include_docs, 1, Options) of
                            {include_docs, true} ->
                                Row0 ++ open_json_doc(TxDb, DocId, OpenOpts, DocOpts);
                            _ ->
                                Row0
                        end,

                    maybe_stop(UserFun({row, Row1}, Acc))
                end,
                UserAcc1,
                Options
            ),

            {ok, maybe_stop(UserFun(complete, UserAcc2))}
        catch
            throw:{stop, FinalUserAcc} ->
                {ok, FinalUserAcc}
        end
    end).

fold_docs(Db, DocIds, UserFun, UserAcc0, Options) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        try
            NeedsTreeOpts = [revs_info, conflicts, deleted_conflicts],
            NeedsTree = (Options -- NeedsTreeOpts /= Options),

            InitAcc = #{
                revs_q => queue:new(),
                revs_count => 0,
                body_q => queue:new(),
                body_count => 0,
                doc_opts => Options,
                user_acc => UserAcc0,
                user_fun => UserFun
            },

            FinalAcc1 = lists:foldl(
                fun(DocId, Acc) ->
                    #{
                        revs_q := RevsQ,
                        revs_count := RevsCount
                    } = Acc,
                    Future = fold_docs_get_revs(TxDb, DocId, NeedsTree),
                    NewAcc = Acc#{
                        revs_q := queue:in({DocId, Future}, RevsQ),
                        revs_count := RevsCount + 1
                    },
                    drain_fold_docs_revs_futures(TxDb, NewAcc)
                end,
                InitAcc,
                DocIds
            ),

            FinalAcc2 = drain_all_fold_docs_revs_futures(TxDb, FinalAcc1),
            FinalAcc3 = drain_all_fold_docs_body_futures(TxDb, FinalAcc2),

            #{
                user_acc := FinalUserAcc
            } = FinalAcc3,
            {ok, FinalUserAcc}
        catch
            throw:{stop, StopUserAcc} ->
                {ok, StopUserAcc}
        end
    end).

fold_design_docs(Db, UserFun, UserAcc0, Options1) ->
    Options2 = set_design_doc_keys(Options1),
    fold_docs(Db, UserFun, UserAcc0, Options2).

fold_local_docs(Db, UserFun, UserAcc0, Options0) ->
    % This is mostly for testing and sanity checking. When calling from a test
    % namespace will be automatically set. We also assert when called from the
    % API the correct namespace was set
    Options =
        case lists:keyfind(namespace, 1, Options0) of
            {namespace, <<"_local">>} -> Options0;
            false -> [{namespace, <<"_local">>} | Options0]
        end,
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        try
            #{
                db_prefix := DbPrefix
            } = TxDb,

            Prefix = erlfdb_tuple:pack({?DB_LOCAL_DOCS}, DbPrefix),
            Meta = get_all_docs_meta(TxDb, Options),

            UserAcc1 = maybe_stop(UserFun({meta, Meta}, UserAcc0)),

            UserAcc2 = fabric2_fdb:fold_range(
                TxDb,
                Prefix,
                fun({K, V}, Acc) ->
                    {DocId} = erlfdb_tuple:unpack(K, Prefix),
                    Rev = fabric2_fdb:get_local_doc_rev(TxDb, DocId, V),
                    maybe_stop(
                        UserFun(
                            {row, [
                                {id, DocId},
                                {key, DocId},
                                {value, {[{rev, couch_doc:rev_to_str({0, Rev})}]}}
                            ]},
                            Acc
                        )
                    )
                end,
                UserAcc1,
                Options
            ),

            {ok, maybe_stop(UserFun(complete, UserAcc2))}
        catch
            throw:{stop, FinalUserAcc} ->
                {ok, FinalUserAcc}
        end
    end).

fold_changes(Db, SinceSeq, UserFun, UserAcc) ->
    fold_changes(Db, SinceSeq, UserFun, UserAcc, []).

fold_changes(Db, SinceSeq, UserFun, UserAcc, Options) ->
    fabric2_fdb:transactional(Db, fun(TxDb) ->
        try
            #{
                db_prefix := DbPrefix
            } = TxDb,

            Prefix = erlfdb_tuple:pack({?DB_CHANGES}, DbPrefix),

            Dir =
                case fabric2_util:get_value(dir, Options, fwd) of
                    rev -> rev;
                    _ -> fwd
                end,

            RestartTx =
                case fabric2_util:get_value(restart_tx, Options) of
                    undefined -> [{restart_tx, true}];
                    _AlreadySet -> []
                end,

            StartKey = get_since_seq(TxDb, Dir, SinceSeq),
            EndKey =
                case fabric2_util:get_value(end_key, Options) of
                    undefined when Dir == rev ->
                        fabric2_util:seq_zero_vs();
                    undefined ->
                        fabric2_util:seq_max_vs();
                    EK when is_binary(EK) ->
                        fabric2_fdb:seq_to_vs(EK);
                    EK when is_tuple(EK), element(1, EK) == versionstamp ->
                        EK
                end,
            BaseOpts = [{start_key, StartKey}] ++ RestartTx ++ Options,
            FoldOpts = lists:keystore(end_key, 1, BaseOpts, {end_key, EndKey}),

            {ok,
                fabric2_fdb:fold_range(
                    TxDb,
                    Prefix,
                    fun({K, V}, Acc) ->
                        {SeqVS} = erlfdb_tuple:unpack(K, Prefix),
                        {DocId, Deleted, RevId} = erlfdb_tuple:unpack(V),

                        Change = #{
                            id => DocId,
                            sequence => fabric2_fdb:vs_to_seq(SeqVS),
                            rev_id => RevId,
                            deleted => Deleted
                        },

                        maybe_stop(UserFun(Change, Acc))
                    end,
                    UserAcc,
                    FoldOpts
                )}
        catch
            throw:{stop, FinalUserAcc} ->
                {ok, FinalUserAcc}
        end
    end).

dbname_suffix(DbName) ->
    filename:basename(DbName).

validate_dbname(DbName) when is_list(DbName) ->
    validate_dbname(?l2b(DbName));
validate_dbname(DbName) when is_binary(DbName) ->
    fabric2_db_plugin:validate_dbname(
        DbName, DbName, fun validate_dbname_int/2
    ).

validate_dbname_int(DbName, DbName) when is_binary(DbName) ->
    case validate_dbname_length(DbName) of
        ok -> validate_dbname_pat(DbName);
        {error, _} = Error -> Error
    end.

validate_dbname_length(DbName) ->
    MaxLength = config:get_integer(
        "couchdb",
        "max_database_name_length",
        ?DEFAULT_MAX_DATABASE_NAME_LENGTH
    ),
    case byte_size(DbName) =< MaxLength of
        true -> ok;
        false -> {error, {database_name_too_long, DbName}}
    end.

validate_dbname_pat(DbName) ->
    case re:run(DbName, ?DBNAME_REGEX, [{capture, none}, dollar_endonly]) of
        match ->
            ok;
        nomatch ->
            case is_system_db_name(DbName) of
                true -> ok;
                false -> {error, {illegal_database_name, DbName}}
            end
    end.

maybe_add_sys_db_callbacks(Db) ->
    IsReplicatorDb = is_replicator_db(Db),
    IsUsersDb = is_users_db(Db),

    {BDU, ADR} =
        if
            IsReplicatorDb ->
                {
                    fun couch_replicator_docs:before_doc_update/3,
                    fun couch_replicator_docs:after_doc_read/2
                };
            IsUsersDb ->
                {
                    fun fabric2_users_db:before_doc_update/3,
                    fun fabric2_users_db:after_doc_read/2
                };
            true ->
                {undefined, undefined}
        end,

    Db#{
        before_doc_update := BDU,
        after_doc_read := ADR
    }.

make_db_info(DbName, Props) ->
    BaseProps = [
        {cluster, {[{n, 0}, {q, 0}, {r, 0}, {w, 0}]}},
        {compact_running, false},
        {data_size, 0},
        {db_name, DbName},
        {disk_format_version, 0},
        {disk_size, 0},
        {instance_start_time, <<"0">>},
        {purge_seq, 0}
    ],

    lists:foldl(
        fun({Key, Val}, Acc) ->
            lists:keystore(Key, 1, Acc, {Key, Val})
        end,
        BaseProps,
        Props
    ).

drain_info_futures(FutureQ, Count, _UserFun, Acc) when Count < 100 ->
    {FutureQ, Count, Acc};
drain_info_futures(FutureQ, Count, UserFun, Acc) when Count >= 100 ->
    {{value, {DbName, Future}}, RestQ} = queue:out(FutureQ),
    InfoProps = fabric2_fdb:get_info_wait(Future),
    DbInfo = make_db_info(DbName, InfoProps),
    NewAcc = maybe_stop(UserFun({row, DbInfo}, Acc)),
    {RestQ, Count - 1, NewAcc}.

drain_all_info_futures(FutureQ, UserFun, Acc) ->
    case queue:out(FutureQ) of
        {{value, {DbName, Future}}, RestQ} ->
            InfoProps = fabric2_fdb:get_info_wait(Future),
            DbInfo = make_db_info(DbName, InfoProps),
            NewAcc = maybe_stop(UserFun({row, DbInfo}, Acc)),
            drain_all_info_futures(RestQ, UserFun, NewAcc);
        {empty, _} ->
            Acc
    end.

drain_deleted_info_futures(FutureQ, Count, _UserFun, Acc) when Count < 100 ->
    {FutureQ, Count, Acc};
drain_deleted_info_futures(FutureQ, Count, UserFun, Acc) when Count >= 100 ->
    {{value, {DbName, TimeStamp, Future}}, RestQ} = queue:out(FutureQ),
    BaseProps = fabric2_fdb:get_info_wait(Future),
    DeletedProps =
        BaseProps ++
            [
                {deleted, true},
                {timestamp, TimeStamp}
            ],
    DbInfo = make_db_info(DbName, DeletedProps),
    NewAcc = maybe_stop(UserFun({row, DbInfo}, Acc)),
    {RestQ, Count - 1, NewAcc}.

drain_all_deleted_info_futures(FutureQ, UserFun, Acc) ->
    case queue:out(FutureQ) of
        {{value, {DbName, TimeStamp, Future}}, RestQ} ->
            BaseProps = fabric2_fdb:get_info_wait(Future),
            DeletedProps =
                BaseProps ++
                    [
                        {deleted, true},
                        {timestamp, TimeStamp}
                    ],
            DbInfo = make_db_info(DbName, DeletedProps),
            NewAcc = maybe_stop(UserFun({row, DbInfo}, Acc)),
            drain_all_deleted_info_futures(RestQ, UserFun, NewAcc);
        {empty, _} ->
            Acc
    end.

fold_docs_get_revs(Db, <<?LOCAL_DOC_PREFIX, _/binary>> = DocId, _) ->
    fabric2_fdb:get_local_doc_rev_future(Db, DocId);
fold_docs_get_revs(Db, DocId, true) ->
    fabric2_fdb:get_all_revs_future(Db, DocId);
fold_docs_get_revs(Db, DocId, false) ->
    fabric2_fdb:get_winning_revs_future(Db, DocId, 1).

fold_docs_get_revs_wait(_Db, <<?LOCAL_DOC_PREFIX, _/binary>>, RevsFuture) ->
    Rev = fabric2_fdb:get_local_doc_rev_wait(RevsFuture),
    [Rev];
fold_docs_get_revs_wait(Db, _DocId, RevsFuture) ->
    fabric2_fdb:get_revs_wait(Db, RevsFuture).

fold_docs_get_doc_body_future(
    Db,
    <<?LOCAL_DOC_PREFIX, _/binary>> = DocId,
    [Rev]
) ->
    fabric2_fdb:get_local_doc_body_future(Db, DocId, Rev);
fold_docs_get_doc_body_future(Db, DocId, Revs) ->
    Winner = get_rev_winner(Revs),
    fabric2_fdb:get_doc_body_future(Db, DocId, Winner).

fold_docs_get_doc_body_wait(
    Db,
    <<?LOCAL_DOC_PREFIX, _/binary>> = DocId,
    [Rev],
    _DocOpts,
    BodyFuture
) ->
    case fabric2_fdb:get_local_doc_body_wait(Db, DocId, Rev, BodyFuture) of
        {not_found, missing} -> {not_found, missing};
        Doc -> {ok, Doc}
    end;
fold_docs_get_doc_body_wait(Db, DocId, Revs, DocOpts, BodyFuture) ->
    RevInfo = get_rev_winner(Revs),
    Base = fabric2_fdb:get_doc_body_wait(
        Db,
        DocId,
        RevInfo,
        BodyFuture
    ),
    apply_open_doc_opts(Base, Revs, DocOpts).

drain_fold_docs_revs_futures(_TxDb, #{revs_count := C} = Acc) when C < 100 ->
    Acc;
drain_fold_docs_revs_futures(TxDb, Acc) ->
    drain_one_fold_docs_revs_future(TxDb, Acc).

drain_all_fold_docs_revs_futures(_TxDb, #{revs_count := C} = Acc) when C =< 0 ->
    Acc;
drain_all_fold_docs_revs_futures(TxDb, #{revs_count := C} = Acc) when C > 0 ->
    NewAcc = drain_one_fold_docs_revs_future(TxDb, Acc),
    drain_all_fold_docs_revs_futures(TxDb, NewAcc).

drain_one_fold_docs_revs_future(TxDb, Acc) ->
    #{
        revs_q := RevsQ,
        revs_count := RevsCount,
        body_q := BodyQ,
        body_count := BodyCount
    } = Acc,
    {{value, {DocId, RevsFuture}}, RestRevsQ} = queue:out(RevsQ),

    Revs = fold_docs_get_revs_wait(TxDb, DocId, RevsFuture),
    DocFuture =
        case Revs of
            [] ->
                {DocId, [], not_found};
            [_ | _] ->
                BodyFuture = fold_docs_get_doc_body_future(TxDb, DocId, Revs),
                {DocId, Revs, BodyFuture}
        end,
    NewAcc = Acc#{
        revs_q := RestRevsQ,
        revs_count := RevsCount - 1,
        body_q := queue:in(DocFuture, BodyQ),
        body_count := BodyCount + 1
    },
    drain_fold_docs_body_futures(TxDb, NewAcc).

drain_fold_docs_body_futures(_TxDb, #{body_count := C} = Acc) when C < 100 ->
    Acc;
drain_fold_docs_body_futures(TxDb, Acc) ->
    drain_one_fold_docs_body_future(TxDb, Acc).

drain_all_fold_docs_body_futures(_TxDb, #{body_count := C} = Acc) when C =< 0 ->
    Acc;
drain_all_fold_docs_body_futures(TxDb, #{body_count := C} = Acc) when C > 0 ->
    NewAcc = drain_one_fold_docs_body_future(TxDb, Acc),
    drain_all_fold_docs_body_futures(TxDb, NewAcc).

drain_one_fold_docs_body_future(TxDb, Acc) ->
    #{
        body_q := BodyQ,
        body_count := BodyCount,
        doc_opts := DocOpts,
        user_fun := UserFun,
        user_acc := UserAcc
    } = Acc,
    {{value, {DocId, Revs, BodyFuture}}, RestBodyQ} = queue:out(BodyQ),
    Doc =
        case BodyFuture of
            not_found ->
                {not_found, missing};
            _ ->
                fold_docs_get_doc_body_wait(TxDb, DocId, Revs, DocOpts, BodyFuture)
        end,
    NewUserAcc = maybe_stop(UserFun(DocId, Doc, UserAcc)),
    Acc#{
        body_q := RestBodyQ,
        body_count := BodyCount - 1,
        user_acc := NewUserAcc
    }.

get_rev_winner(Revs) ->
    [Winner] = lists:filter(
        fun(Rev) ->
            maps:get(winner, Rev)
        end,
        Revs
    ),
    Winner.

new_revid(Db, Doc) ->
    #doc{
        id = DocId,
        body = Body,
        revs = {OldStart, OldRevs},
        atts = Atts,
        deleted = Deleted
    } = Doc,

    {NewAtts, AttSigInfo} = lists:mapfoldl(
        fun(Att, Acc) ->
            [Name, Type, Data, Md5] = couch_att:fetch([name, type, data, md5], Att),
            case Data of
                {loc, _, _, _} ->
                    {Att, [{Name, Type, Md5} | Acc]};
                _ ->
                    Att1 = couch_att:flush(Db, DocId, Att),
                    Att2 = couch_att:store(revpos, OldStart + 1, Att1),
                    {Att2, [{Name, Type, couch_att:fetch(md5, Att2)} | Acc]}
            end
        end,
        [],
        Atts
    ),

    Rev =
        case length(Atts) == length(AttSigInfo) of
            true ->
                OldRev =
                    case OldRevs of
                        [] -> 0;
                        [OldRev0 | _] -> OldRev0
                    end,
                SigTerm = [Deleted, OldStart, OldRev, Body, AttSigInfo],
                couch_hash:md5_hash(term_to_binary(SigTerm, [{minor_version, 1}]));
            false ->
                erlang:error(missing_att_info)
        end,

    Doc#doc{
        revs = {OldStart + 1, [Rev | OldRevs]},
        atts = NewAtts
    }.

get_all_docs_meta(TxDb, Options) ->
    NS = couch_util:get_value(namespace, Options),
    DocCount = get_doc_count(TxDb, NS),
    case lists:keyfind(update_seq, 1, Options) of
        {_, true} ->
            UpdateSeq = fabric2_db:get_update_seq(TxDb),
            [{update_seq, UpdateSeq}];
        _ ->
            []
    end ++ [{total, DocCount}, {offset, null}].

maybe_set_interactive(#{} = Db, Options) ->
    Interactive = fabric2_util:get_value(interactive, Options, false),
    Db#{interactive := Interactive}.

maybe_set_user_ctx(Db, Options) ->
    case fabric2_util:get_value(user_ctx, Options) of
        #user_ctx{} = UserCtx ->
            set_user_ctx(Db, UserCtx);
        undefined ->
            Db
    end.

is_member(Db, {SecProps}) when is_list(SecProps) ->
    case is_admin(Db, {SecProps}) of
        true ->
            true;
        false ->
            case is_public_db(SecProps) of
                true ->
                    true;
                false ->
                    {Members} = get_members(SecProps),
                    UserCtx = get_user_ctx(Db),
                    is_authorized(Members, UserCtx)
            end
    end.

is_authorized(Group, UserCtx) ->
    #user_ctx{
        name = UserName,
        roles = UserRoles
    } = UserCtx,
    Names = fabric2_util:get_value(<<"names">>, Group, []),
    Roles = fabric2_util:get_value(<<"roles">>, Group, []),
    case check_security(roles, UserRoles, [<<"_admin">> | Roles]) of
        true ->
            true;
        false ->
            check_security(names, UserName, Names)
    end.

check_security(roles, [], _) ->
    false;
check_security(roles, UserRoles, Roles) ->
    UserRolesSet = ordsets:from_list(UserRoles),
    RolesSet = ordsets:from_list(Roles),
    not ordsets:is_disjoint(UserRolesSet, RolesSet);
check_security(names, _, []) ->
    false;
check_security(names, null, _) ->
    false;
check_security(names, UserName, Names) ->
    lists:member(UserName, Names).

throw_security_error(#user_ctx{name = null} = UserCtx) ->
    Reason = <<"You are not authorized to access this db.">>,
    throw_security_error(UserCtx, Reason);
throw_security_error(#user_ctx{name = _} = UserCtx) ->
    Reason = <<"You are not allowed to access this db.">>,
    throw_security_error(UserCtx, Reason).

throw_security_error(#user_ctx{} = UserCtx, Reason) ->
    Error = security_error_type(UserCtx),
    throw({Error, Reason}).

security_error_type(#user_ctx{name = null}) ->
    unauthorized;
security_error_type(#user_ctx{name = _}) ->
    forbidden.

is_public_db(SecProps) ->
    {Members} = get_members(SecProps),
    Names = fabric2_util:get_value(<<"names">>, Members, []),
    Roles = fabric2_util:get_value(<<"roles">>, Members, []),
    Names =:= [] andalso Roles =:= [].

get_admins(SecProps) ->
    fabric2_util:get_value(<<"admins">>, SecProps, {[]}).

get_members(SecProps) ->
    % we fallback to readers here for backwards compatibility
    case fabric2_util:get_value(<<"members">>, SecProps) of
        undefined ->
            fabric2_util:get_value(<<"readers">>, SecProps, {[]});
        Members ->
            Members
    end.

apply_open_doc_opts(Doc0, Revs, Options) ->
    IncludeRevsInfo = lists:member(revs_info, Options),
    IncludeConflicts = lists:member(conflicts, Options),
    IncludeDelConflicts = lists:member(deleted_conflicts, Options),
    IncludeLocalSeq = lists:member(local_seq, Options),

    % This revs_info becomes fairly useless now that we're
    % not keeping old document bodies around...
    Meta1 =
        if
            not IncludeRevsInfo ->
                [];
            true ->
                {Pos, [Rev | RevPath]} = Doc0#doc.revs,
                RevPathMissing = lists:map(fun(R) -> {R, missing} end, RevPath),
                [{revs_info, Pos, [{Rev, available} | RevPathMissing]}]
        end,

    Meta2 =
        if
            not IncludeConflicts ->
                [];
            true ->
                Conflicts = [RI || RI = #{winner := false, deleted := false} <- Revs],
                if
                    Conflicts == [] ->
                        [];
                    true ->
                        ConflictRevs = [maps:get(rev_id, RI) || RI <- Conflicts],
                        [{conflicts, ConflictRevs}]
                end
        end,

    Meta3 =
        if
            not IncludeDelConflicts ->
                [];
            true ->
                DelConflicts = [RI || RI = #{winner := false, deleted := true} <- Revs],
                if
                    DelConflicts == [] ->
                        [];
                    true ->
                        DelConflictRevs = [maps:get(rev_id, RI) || RI <- DelConflicts],
                        [{deleted_conflicts, DelConflictRevs}]
                end
        end,

    Meta4 =
        if
            not IncludeLocalSeq ->
                [];
            true ->
                #{winner := true, sequence := SeqVS} = lists:last(Revs),
                [{local_seq, fabric2_fdb:vs_to_seq(SeqVS)}]
        end,

    Doc1 =
        case lists:keyfind(atts_since, 1, Options) of
            {_, PossibleAncestors} ->
                #doc{
                    revs = DocRevs,
                    atts = Atts0
                } = Doc0,
                RevPos = find_ancestor_rev_pos(DocRevs, PossibleAncestors),
                Atts1 = lists:map(
                    fun(Att) ->
                        [AttPos, Data] = couch_att:fetch([revpos, data], Att),
                        if
                            AttPos > RevPos -> couch_att:store(data, Data, Att);
                            true -> couch_att:store(data, stub, Att)
                        end
                    end,
                    Atts0
                ),
                Doc0#doc{atts = Atts1};
            false ->
                Doc0
        end,

    {ok, Doc1#doc{meta = Meta1 ++ Meta2 ++ Meta3 ++ Meta4}}.

find_ancestor_rev_pos({_, []}, _PossibleAncestors) ->
    0;
find_ancestor_rev_pos(_DocRevs, []) ->
    0;
find_ancestor_rev_pos({RevPos, [RevId | Rest]}, AttsSinceRevs) ->
    case lists:member({RevPos, RevId}, AttsSinceRevs) of
        true -> RevPos;
        false -> find_ancestor_rev_pos({RevPos - 1, Rest}, AttsSinceRevs)
    end.

filter_found_revs(RevInfo, Revs) ->
    #{
        rev_id := {Pos, Rev},
        rev_path := RevPath
    } = RevInfo,
    FullRevPath = [Rev | RevPath],
    lists:flatmap(
        fun({FindPos, FindRev} = RevIdToFind) ->
            if
                FindPos > Pos ->
                    [RevIdToFind];
                true ->
                    % Add 1 because lists:nth is 1 based
                    Idx = Pos - FindPos + 1,
                    case Idx > length(FullRevPath) of
                        true ->
                            [RevIdToFind];
                        false ->
                            case lists:nth(Idx, FullRevPath) == FindRev of
                                true -> [];
                                false -> [RevIdToFind]
                            end
                    end
            end
        end,
        Revs
    ).

find_possible_ancestors(RevInfos, MissingRevs) ->
    % Find any revinfos that are possible ancestors
    % of the missing revs. A possible ancestor is
    % any rev that has a start position less than
    % any missing revision. Stated alternatively,
    % find any revinfo that could theoretically
    % extended to be one or more of the missing
    % revisions.
    %
    % Since we are looking at any missing revision
    % we can just compare against the maximum missing
    % start position.
    MaxMissingPos =
        case MissingRevs of
            [] -> 0;
            [_ | _] -> lists:max([Start || {Start, _Rev} <- MissingRevs])
        end,
    lists:flatmap(
        fun(RevInfo) ->
            #{rev_id := {RevPos, _} = RevId} = RevInfo,
            case RevPos < MaxMissingPos of
                true -> [RevId];
                false -> []
            end
        end,
        RevInfos
    ).

apply_before_doc_update(Db, Docs, Options) ->
    UpdateType =
        case lists:member(replicated_changes, Options) of
            true -> replicated_changes;
            false -> interactive_edit
        end,
    lists:map(
        fun(Doc) ->
            fabric2_db_plugin:before_doc_update(Db, Doc, UpdateType)
        end,
        Docs
    ).

update_doc_int(#{} = Db, #doc{} = Doc, Options) ->
    IsLocal =
        case Doc#doc.id of
            <<?LOCAL_DOC_PREFIX, _/binary>> -> true;
            _ -> false
        end,
    try
        case {IsLocal, is_replicated(Options)} of
            {false, false} -> update_doc_interactive(Db, Doc, Options);
            {false, true} -> update_doc_replicated(Db, Doc, Options);
            {true, _} -> update_local_doc(Db, Doc, Options)
        end
    catch
        throw:{?MODULE, Return} ->
            Return
    end.

batch_update_docs(Db, Docs, Options) ->
    BAcc = #bacc{
        db = Db,
        docs = Docs,
        batch_size = get_batch_size(Options),
        options = Options,
        rev_futures = #{},
        seen = [],
        results = []
    },
    #bacc{results = Res} = batch_update_docs(BAcc),
    lists:reverse(Res).

batch_update_docs(#bacc{docs = []} = BAcc) ->
    BAcc;
batch_update_docs(#bacc{db = Db} = BAcc) ->
    #bacc{
        db = Db,
        docs = Docs,
        options = Options
    } = BAcc,

    BAccTx2 = fabric2_fdb:transactional(Db, fun(TxDb) ->
        BAccTx = BAcc#bacc{db = TxDb},
        case is_replicated(Options) of
            false ->
                Tagged = tag_docs(Docs),
                RevFutures = get_winning_rev_futures(TxDb, Tagged),
                BAccTx1 = BAccTx#bacc{
                    docs = Tagged,
                    rev_futures = RevFutures
                },
                batch_update_interactive_tx(BAccTx1);
            true ->
                BAccTx1 = batch_update_replicated_tx(BAccTx),
                % For replicated updates reset `seen` after every transaction
                BAccTx1#bacc{seen = []}
        end
    end),

    % Clean up after the transaction ends so we can recurse with a clean state
    maps:map(
        fun(Tag, RangeFuture) when is_reference(Tag) ->
            ok = erlfdb:cancel(RangeFuture, [flush])
        end,
        BAccTx2#bacc.rev_futures
    ),

    BAcc1 = BAccTx2#bacc{
        db = Db,
        rev_futures = #{}
    },

    batch_update_docs(BAcc1).

batch_update_interactive_tx(#bacc{docs = []} = BAcc) ->
    BAcc;
batch_update_interactive_tx(#bacc{} = BAcc) ->
    #bacc{
        db = TxDb,
        docs = [Doc | Docs],
        options = Options,
        batch_size = MaxSize,
        rev_futures = RevFutures,
        seen = Seen,
        results = Results
    } = BAcc,
    {Res, Seen1} =
        try
            update_docs_interactive(TxDb, Doc, Options, RevFutures, Seen)
        catch
            throw:{?MODULE, Return} ->
                {Return, Seen}
        end,
    BAcc1 = BAcc#bacc{
        docs = Docs,
        results = [Res | Results],
        seen = Seen1
    },
    case fabric2_fdb:get_approximate_tx_size(TxDb) > MaxSize of
        true -> BAcc1;
        false -> batch_update_interactive_tx(BAcc1)
    end.

batch_update_replicated_tx(#bacc{docs = []} = BAcc) ->
    BAcc;
batch_update_replicated_tx(#bacc{} = BAcc) ->
    #bacc{
        db = TxDb,
        docs = [Doc | Docs],
        options = Options,
        batch_size = MaxSize,
        seen = Seen,
        results = Results
    } = BAcc,
    case lists:member(Doc#doc.id, Seen) of
        true ->
            % If we already updated this doc in the current transaction, wait
            % till the next transaction to update it again.
            BAcc;
        false ->
            Res = update_doc_int(TxDb, Doc, Options),
            BAcc1 = BAcc#bacc{
                docs = Docs,
                results = [Res | Results],
                seen = [Doc#doc.id | Seen]
            },
            case fabric2_fdb:get_approximate_tx_size(TxDb) > MaxSize of
                true -> BAcc1;
                false -> batch_update_replicated_tx(BAcc1)
            end
    end.

update_docs_interactive(
    Db,
    #doc{id = <<?LOCAL_DOC_PREFIX, _/binary>>} = Doc,
    Options,
    _Futures,
    SeenIds
) ->
    {update_local_doc(Db, Doc, Options), SeenIds};
update_docs_interactive(Db, Doc, Options, Futures, SeenIds) ->
    case lists:member(Doc#doc.id, SeenIds) of
        true ->
            {conflict, SeenIds};
        false ->
            Future = maps:get(doc_tag(Doc), Futures),
            case update_doc_interactive(Db, Doc, Future, Options) of
                {ok, _} = Resp ->
                    {Resp, [Doc#doc.id | SeenIds]};
                _ = Resp ->
                    {Resp, SeenIds}
            end
    end.

update_doc_interactive(Db, Doc0, Options) ->
    % Get the current winning revision. This is needed
    % regardless of which branch we're updating. The extra
    % revision we're grabbing is an optimization to
    % save us a round trip if we end up deleting
    % the winning revision branch.
    NumRevs =
        if
            Doc0#doc.deleted -> 2;
            true -> 1
        end,
    Future = fabric2_fdb:get_winning_revs_future(Db, Doc0#doc.id, NumRevs),
    update_doc_interactive(Db, Doc0, Future, Options).

update_doc_interactive(Db, Doc0, Future, _Options) ->
    RevInfos = fabric2_fdb:get_revs_wait(Db, Future),
    {Winner, SecondPlace} =
        case RevInfos of
            [] -> {not_found, not_found};
            [WRI] -> {WRI, not_found};
            [WRI, SPRI] -> {WRI, SPRI}
        end,
    WinnerRevId =
        case Winner of
            not_found ->
                {0, <<>>};
            _ ->
                case maps:get(deleted, Winner) of
                    true -> {0, <<>>};
                    false -> maps:get(rev_id, Winner)
                end
        end,

    % Check that a revision was specified if required
    Doc0RevId = doc_to_revid(Doc0),
    HasRev = Doc0RevId =/= {0, <<>>},
    if
        HasRev orelse WinnerRevId == {0, <<>>} -> ok;
        true -> ?RETURN({Doc0, conflict})
    end,

    % Allow inserting new deleted documents. Only works when the document has
    % never existed to match CouchDB 3.x
    case not HasRev andalso Doc0#doc.deleted andalso is_map(Winner) of
        true -> ?RETURN({Doc0, conflict});
        false -> ok
    end,

    % Get the target revision to update
    Target =
        case Doc0RevId == WinnerRevId of
            true ->
                Winner;
            false ->
                case fabric2_fdb:get_non_deleted_rev(Db, Doc0#doc.id, Doc0RevId) of
                    #{deleted := false} = Target0 ->
                        Target0;
                    not_found ->
                        % Either a missing revision or a deleted
                        % revision. Either way a conflict. Note
                        % that we get not_found for a deleted revision
                        % because we only check for the non-deleted
                        % key in fdb
                        ?RETURN({Doc0, conflict})
                end
        end,

    Doc1 =
        case Winner of
            #{deleted := true} when not Doc0#doc.deleted ->
                % When recreating a deleted document we want to extend
                % the winning revision branch rather than create a
                % new branch. If we did not do this we could be
                % recreating into a state that previously existed.
                Doc0#doc{revs = fabric2_util:revinfo_to_revs(Winner)};
            #{} ->
                % Otherwise we're extending the target's revision
                % history with this update
                Doc0#doc{revs = fabric2_util:revinfo_to_revs(Target)};
            not_found ->
                % Creating a new doc means our revs start empty
                Doc0
        end,

    % Validate the doc update and create the
    % new revinfo map
    Doc2 = prep_and_validate(Db, Doc1, Target),

    Doc3 = new_revid(Db, Doc2),

    #doc{
        deleted = NewDeleted,
        revs = {NewRevPos, [NewRev | NewRevPath]},
        atts = Atts
    } = Doc4 = stem_revisions(Db, Doc3),

    NewRevInfo = #{
        winner => undefined,
        exists => false,
        deleted => NewDeleted,
        rev_id => {NewRevPos, NewRev},
        rev_path => NewRevPath,
        sequence => undefined,
        branch_count => undefined,
        att_hash => fabric2_util:hash_atts(Atts),
        rev_size => fabric2_util:rev_size(Doc4)
    },

    % Gather the list of possible winnig revisions
    Possible =
        case Target == Winner of
            true when not Doc4#doc.deleted ->
                [NewRevInfo];
            true when Doc4#doc.deleted ->
                case SecondPlace of
                    #{} -> [NewRevInfo, SecondPlace];
                    not_found -> [NewRevInfo]
                end;
            false ->
                [NewRevInfo, Winner]
        end,

    % Sort the rev infos such that the winner is first
    {NewWinner0, NonWinner} =
        case fabric2_util:sort_revinfos(Possible) of
            [W] -> {W, not_found};
            [W, NW] -> {W, NW}
        end,

    BranchCount =
        case Winner of
            not_found -> 1;
            #{branch_count := BC} -> BC
        end,
    NewWinner = NewWinner0#{branch_count := BranchCount},
    ToUpdate =
        if
            NonWinner == not_found -> [];
            true -> [NonWinner]
        end,
    ToRemove =
        if
            Target == not_found -> [];
            true -> [Target]
        end,

    ok = fabric2_fdb:write_doc(
        Db,
        Doc4,
        NewWinner,
        Winner,
        ToUpdate,
        ToRemove
    ),

    {ok, {NewRevPos, NewRev}}.

update_doc_replicated(Db, Doc0, _Options) ->
    #doc{
        id = DocId,
        deleted = Deleted,
        revs = {RevPos, [Rev | RevPath]}
    } = Doc0,

    DocRevInfo0 = #{
        winner => undefined,
        exists => false,
        deleted => Deleted,
        rev_id => {RevPos, Rev},
        rev_path => RevPath,
        sequence => undefined,
        branch_count => undefined,
        att_hash => <<>>,
        rev_size => null
    },

    AllRevInfos = fabric2_fdb:get_all_revs(Db, DocId),

    RevTree = lists:foldl(
        fun(RI, TreeAcc) ->
            RIPath = fabric2_util:revinfo_to_path(RI),
            {Merged, _} = couch_key_tree:merge(TreeAcc, RIPath),
            Merged
        end,
        [],
        AllRevInfos
    ),

    DocRevPath = fabric2_util:revinfo_to_path(DocRevInfo0),

    {NewTree, Status} = couch_key_tree:merge(RevTree, DocRevPath),
    if
        Status /= internal_node ->
            ok;
        true ->
            % We already know this revision so nothing
            % left to do.
            ?RETURN({Doc0, {ok, []}})
    end,

    % Its possible to have a replication with fewer than $revs_limit
    % revisions which extends an existing branch. To avoid
    % losing revision history we extract the new node from the
    % tree and use the combined path after stemming.
    {[{_, {RevPos, UnstemmedRevs}}], []} =
        couch_key_tree:get(NewTree, [{RevPos, Rev}]),

    Doc1 = stem_revisions(Db, Doc0#doc{revs = {RevPos, UnstemmedRevs}}),

    {RevPos, [Rev | NewRevPath]} = Doc1#doc.revs,
    DocRevInfo1 = DocRevInfo0#{rev_path := NewRevPath},

    % Find any previous revision we knew about for
    % validation and attachment handling.
    AllLeafsFull = couch_key_tree:get_all_leafs_full(NewTree),
    LeafPath = get_leaf_path(RevPos, Rev, AllLeafsFull),
    PrevRevInfo = find_prev_revinfo(RevPos, LeafPath),
    Doc2 = prep_and_validate(Db, Doc1, PrevRevInfo),
    Doc3 = flush_doc_atts(Db, Doc2),
    DocRevInfo2 = DocRevInfo1#{
        atts_hash => fabric2_util:hash_atts(Doc3#doc.atts),
        rev_size => fabric2_util:rev_size(Doc3)
    },

    % Possible winners are the previous winner and
    % the new DocRevInfo
    Winner =
        case fabric2_util:sort_revinfos(AllRevInfos) of
            [#{winner := true} = WRI | _] -> WRI;
            [] -> not_found
        end,
    {NewWinner0, NonWinner} =
        case Winner == PrevRevInfo of
            true ->
                {DocRevInfo2, not_found};
            false ->
                [W, NW] = fabric2_util:sort_revinfos([Winner, DocRevInfo2]),
                {W, NW}
        end,

    NewWinner = NewWinner0#{branch_count := length(AllLeafsFull)},
    ToUpdate =
        if
            NonWinner == not_found -> [];
            true -> [NonWinner]
        end,
    ToRemove =
        if
            PrevRevInfo == not_found -> [];
            true -> [PrevRevInfo]
        end,

    ok = fabric2_fdb:write_doc(
        Db,
        Doc3,
        NewWinner,
        Winner,
        ToUpdate,
        ToRemove
    ),

    {ok, []}.

update_local_doc(Db, Doc0, _Options) ->
    Doc1 =
        case increment_local_doc_rev(Doc0) of
            {ok, Updated} -> Updated;
            {error, Error} -> ?RETURN({Doc0, Error})
        end,

    ok = fabric2_fdb:write_local_doc(Db, Doc1),

    #doc{revs = {0, [Rev]}} = Doc1,
    {ok, {0, integer_to_binary(Rev)}}.

flush_doc_atts(Db, Doc) ->
    #doc{
        id = DocId,
        atts = Atts
    } = Doc,
    NewAtts = lists:map(
        fun(Att) ->
            case couch_att:fetch(data, Att) of
                {loc, _, _, _} ->
                    Att;
                _ ->
                    couch_att:flush(Db, DocId, Att)
            end
        end,
        Atts
    ),
    Doc#doc{atts = NewAtts}.

get_winning_rev_futures(Db, Docs) ->
    lists:foldl(
        fun(Doc, Acc) ->
            #doc{
                id = DocId,
                deleted = Deleted
            } = Doc,
            IsLocal =
                case DocId of
                    <<?LOCAL_DOC_PREFIX, _/binary>> -> true;
                    _ -> false
                end,
            if
                IsLocal ->
                    Acc;
                true ->
                    NumRevs =
                        if
                            Deleted -> 2;
                            true -> 1
                        end,
                    Future = fabric2_fdb:get_winning_revs_future(Db, DocId, NumRevs),
                    DocTag = doc_tag(Doc),
                    Acc#{DocTag => Future}
            end
        end,
        #{},
        Docs
    ).

prep_and_validate(Db, NewDoc, PrevRevInfo) ->
    HasStubs = couch_doc:has_stubs(NewDoc),
    HasVDUs = [] /= maps:get(validate_doc_update_funs, Db),
    IsDDoc =
        case NewDoc#doc.id of
            <<?DESIGN_DOC_PREFIX, _/binary>> -> true;
            _ -> false
        end,

    WasDeleted =
        case PrevRevInfo of
            not_found -> false;
            #{deleted := D} -> D
        end,

    PrevDoc =
        case HasStubs orelse (HasVDUs and not IsDDoc) of
            true when PrevRevInfo /= not_found, not WasDeleted ->
                case fabric2_fdb:get_doc_body(Db, NewDoc#doc.id, PrevRevInfo) of
                    #doc{} = PDoc -> PDoc;
                    {not_found, _} -> nil
                end;
            _ ->
                nil
        end,

    MergedDoc =
        if
            not HasStubs ->
                NewDoc;
            true ->
                % This will throw an error if we have any
                % attachment stubs missing data
                couch_doc:merge_stubs(NewDoc, PrevDoc)
        end,
    check_duplicate_attachments(MergedDoc),
    validate_doc_update(Db, MergedDoc, PrevDoc),
    MergedDoc.

validate_doc_update(Db, #doc{id = <<"_design/", _/binary>>} = Doc, _) ->
    case catch check_is_admin(Db) of
        ok -> validate_ddoc(Db, Doc);
        Error -> ?RETURN({Doc, Error})
    end;
validate_doc_update(Db, Doc, PrevDoc) ->
    #{
        security_doc := Security,
        validate_doc_update_funs := VDUs
    } = Db,
    Fun = fun() ->
        JsonCtx = fabric2_util:user_ctx_to_json(Db),
        lists:map(
            fun(VDU) ->
                try
                    case VDU(Doc, PrevDoc, JsonCtx, Security) of
                        ok -> ok;
                        Error1 -> throw(Error1)
                    end
                catch
                    throw:Error2 ->
                        ?RETURN({Doc, Error2})
                end
            end,
            VDUs
        )
    end,
    Stat = [couchdb, query_server, vdu_process_time],
    if
        VDUs == [] -> ok;
        true -> couch_stats:update_histogram(Stat, Fun)
    end.

validate_ddoc(Db, DDoc) ->
    try
        ok = couch_views_validate:validate_ddoc(Db, DDoc)
    catch
        throw:{invalid_design_doc, Reason} ->
            throw({bad_request, invalid_design_doc, Reason});
        throw:{compilation_error, Reason} ->
            throw({bad_request, compilation_error, Reason});
        throw:Error ->
            ?RETURN({DDoc, Error})
    end.

validate_atomic_update(_, false) ->
    ok;
validate_atomic_update(AllDocs, true) ->
    % TODO actually perform the validation.  This requires some hackery, we need
    % to basically extract the prep_and_validate_updates function from couch_db
    % and only run that, without actually writing in case of a success.
    Error = {not_implemented, <<"all_or_nothing is not supported">>},
    PreCommitFailures = lists:map(
        fun(#doc{id = Id, revs = {Pos, Revs}}) ->
            case Revs of
                [] -> RevId = <<>>;
                [RevId | _] -> ok
            end,
            {{Id, {Pos, RevId}}, Error}
        end,
        AllDocs
    ),
    throw({aborted, PreCommitFailures}).

check_duplicate_attachments(#doc{atts = Atts}) ->
    lists:foldl(
        fun(Att, Names) ->
            Name = couch_att:fetch(name, Att),
            case ordsets:is_element(Name, Names) of
                true -> throw({bad_request, <<"Duplicate attachments">>});
                false -> ordsets:add_element(Name, Names)
            end
        end,
        ordsets:new(),
        Atts
    ).

get_since_seq(Db, rev, <<>>) ->
    get_since_seq(Db, rev, now);
get_since_seq(_Db, _Dir, Seq) when Seq == <<>>; Seq == <<"0">>; Seq == 0 ->
    fabric2_util:seq_zero_vs();
get_since_seq(Db, Dir, Seq) when Seq == now; Seq == <<"now">> ->
    CurrSeq = fabric2_fdb:get_last_change(Db),
    get_since_seq(Db, Dir, CurrSeq);
get_since_seq(_Db, _Dir, Seq) when is_binary(Seq), size(Seq) == 24 ->
    fabric2_fdb:next_vs(fabric2_fdb:seq_to_vs(Seq));
get_since_seq(Db, Dir, List) when is_list(List) ->
    get_since_seq(Db, Dir, list_to_binary(List));
get_since_seq(_Db, _Dir, Seq) ->
    erlang:error({invalid_since_seq, Seq}).

get_leaf_path(Pos, Rev, [{Pos, [{Rev, _RevInfo} | LeafPath]} | _]) ->
    LeafPath;
get_leaf_path(Pos, Rev, [_WrongLeaf | RestLeafs]) ->
    get_leaf_path(Pos, Rev, RestLeafs).

find_prev_revinfo(_Pos, []) ->
    not_found;
find_prev_revinfo(Pos, [{_Rev, ?REV_MISSING} | RestPath]) ->
    find_prev_revinfo(Pos - 1, RestPath);
find_prev_revinfo(_Pos, [{_Rev, #{} = RevInfo} | _]) ->
    RevInfo.

increment_local_doc_rev(#doc{deleted = true} = Doc) ->
    {ok, Doc#doc{revs = {0, [0]}}};
increment_local_doc_rev(#doc{revs = {0, []}} = Doc) ->
    {ok, Doc#doc{revs = {0, [1]}}};
increment_local_doc_rev(#doc{revs = {0, [RevStr | _]}} = Doc) ->
    try
        PrevRev = binary_to_integer(RevStr),
        {ok, Doc#doc{revs = {0, [PrevRev + 1]}}}
    catch
        error:badarg ->
            {error, <<"Invalid rev format">>}
    end;
increment_local_doc_rev(#doc{}) ->
    {error, <<"Invalid rev format">>}.

doc_to_revid(#doc{revs = Revs}) ->
    case Revs of
        {0, []} -> {0, <<>>};
        {RevPos, [Rev | _]} -> {RevPos, Rev}
    end.

tag_docs([]) ->
    [];
tag_docs([#doc{meta = Meta} = Doc | Rest]) ->
    Meta1 = lists:keystore(ref, 1, Meta, {ref, make_ref()}),
    NewDoc = Doc#doc{meta = Meta1},
    [NewDoc | tag_docs(Rest)].

doc_tag(#doc{meta = Meta}) ->
    fabric2_util:get_value(ref, Meta).

idrevs({Id, Revs}) when is_list(Revs) ->
    {docid(Id), [rev(R) || R <- Revs]}.

docid(DocId) when is_list(DocId) ->
    list_to_binary(DocId);
docid(DocId) ->
    DocId.

rev(Rev) when is_list(Rev); is_binary(Rev) ->
    couch_doc:parse_rev(Rev);
rev({Seq, Hash} = Rev) when is_integer(Seq), is_binary(Hash) ->
    Rev.

maybe_stop({ok, Acc}) ->
    Acc;
maybe_stop({stop, Acc}) ->
    throw({stop, Acc}).

set_design_doc_keys(Options1) ->
    Dir = couch_util:get_value(dir, Options1, fwd),
    Options2 = set_design_doc_start_key(Options1, Dir),
    set_design_doc_end_key(Options2, Dir).

set_design_doc_start_key(Options, fwd) ->
    Key1 = couch_util:get_value(start_key, Options, ?FIRST_DDOC_KEY),
    Key2 = max(Key1, ?FIRST_DDOC_KEY),
    lists:keystore(start_key, 1, Options, {start_key, Key2});
set_design_doc_start_key(Options, rev) ->
    Key1 = couch_util:get_value(start_key, Options, ?LAST_DDOC_KEY),
    Key2 = min(Key1, ?LAST_DDOC_KEY),
    lists:keystore(start_key, 1, Options, {start_key, Key2}).

set_design_doc_end_key(Options, fwd) ->
    case couch_util:get_value(end_key_gt, Options) of
        undefined ->
            Key1 = couch_util:get_value(end_key, Options, ?LAST_DDOC_KEY),
            Key2 = min(Key1, ?LAST_DDOC_KEY),
            lists:keystore(end_key, 1, Options, {end_key, Key2});
        EKeyGT ->
            Key2 = min(EKeyGT, ?LAST_DDOC_KEY),
            lists:keystore(end_key_gt, 1, Options, {end_key_gt, Key2})
    end;
set_design_doc_end_key(Options, rev) ->
    case couch_util:get_value(end_key_gt, Options) of
        undefined ->
            Key1 = couch_util:get_value(end_key, Options, ?FIRST_DDOC_KEY),
            Key2 = max(Key1, ?FIRST_DDOC_KEY),
            lists:keystore(end_key, 1, Options, {end_key, Key2});
        EKeyGT ->
            Key2 = max(EKeyGT, ?FIRST_DDOC_KEY),
            lists:keystore(end_key_gt, 1, Options, {end_key_gt, Key2})
    end.

stem_revisions(#{} = Db, #doc{} = Doc) ->
    #{revs_limit := RevsLimit} = Db,
    #doc{revs = {RevPos, Revs}} = Doc,
    case RevPos >= RevsLimit of
        true -> Doc#doc{revs = {RevPos, lists:sublist(Revs, RevsLimit)}};
        false -> Doc
    end.

open_json_doc(Db, DocId, OpenOpts, DocOpts) ->
    case fabric2_db:open_doc(Db, DocId, OpenOpts) of
        {not_found, missing} ->
            [];
        {ok, #doc{deleted = true}} ->
            [{doc, null}];
        {ok, #doc{} = Doc} ->
            [{doc, couch_doc:to_json_obj(Doc, DocOpts)}]
    end.

get_cached_db(#{} = Db, Opts) when is_list(Opts) ->
    MaxAge = fabric2_util:get_value(max_age, Opts, 0),
    Now = erlang:monotonic_time(millisecond),
    Age = Now - maps:get(check_current_ts, Db),
    case Age < MaxAge of
        true ->
            Db;
        false ->
            fabric2_fdb:transactional(Db, fun(TxDb) ->
                fabric2_fdb:ensure_current(TxDb)
            end)
    end.

is_replicated(Options) when is_list(Options) ->
    lists:member(replicated_changes, Options).

get_batch_size(Options) ->
    case fabric2_util:get_value(batch_size, Options) of
        undefined ->
            config:get_integer(
                "fabric",
                "update_docs_batch_size",
                ?DEFAULT_UPDATE_DOCS_BATCH_SIZE
            );
        Val when is_integer(Val) ->
            Val
    end.
