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


-record(db, {
    vsn = 1,
    name,
    filepath,

    engine = {couch_bt_engine, undefined},

    main_pid = nil,
    compactor_pid = nil,

    committed_update_seq,

    instance_start_time, % number of microsecs since jan 1 1970 as a binary string

    user_ctx = #user_ctx{},
    security = [],
    validate_doc_funs = undefined,

    before_doc_update = nil, % nil | fun(Doc, Db) -> NewDoc
    after_doc_read = nil,    % nil | fun(Doc, Db) -> NewDoc

    % feature removed in 3.x, but field kept to avoid changing db record size
    % and breaking rolling cluster upgrade
    waiting_delayed_commit_deprecated,

    options = [],
    compression
}).


-define(OLD_DB_REC, {
    db,
    _, % MainPid
    _, % CompactorPid
    _, % InstanceStartTime
    _, % Fd
    _, % FdMonitor
    _, % Header
    _, % CommittedUpdateSeq
    _, % IdTree
    _, % SeqTree
    _, % LocalTree
    _, % UpdateSeq
    _, % Name
    _, % FilePath
    _, % ValidateDocFuns
    _, % Security
    _, % SecurityPtr
    _, % UserCtx
    _, % WaitingDelayedCommit
    _, % RevsLimit
    _, % FsyncOptions
    _, % Options
    _, % Compression
    _, % BeforeDocUpdate
    _  % AfterDocRead
}).


-define(OLD_DB_NAME(Db), element(2, Db)).
-define(OLD_DB_MAIN_PID(Db), element(13, Db)).
-define(OLD_DB_USER_CTX(Db), element(18, Db)).
-define(OLD_DB_SECURITY(Db), element(16, Db)).
