/*
 * Copyright (C) 2009 Huw Davies
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#if 0
#pragma makedep install
#endif

[
    local,
    object,
    uuid(0c733a7d-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface IRowsetLocate : IRowset
{
    typedef DWORD DBCOMPARE;

    enum DBCOMPAREENUM
    {
        DBCOMPARE_LT,
        DBCOMPARE_EQ,
        DBCOMPARE_GT,
        DBCOMPARE_NE,
        DBCOMPARE_NOTCOMPARABLE
    };

    HRESULT Compare([in] HCHAPTER hReserved,
                    [in] DBBKMARK cbBookmark1,
                    [in, size_is(cbBookmark1)] const BYTE *pBookmark1,
                    [in] DBBKMARK cbBookmark2,
                    [in, size_is(cbBookmark2)] const BYTE *pBookmark2,
                    [out] DBCOMPARE *pComparison);

    HRESULT GetRowsAt([in] HWATCHREGION hReserved1,
                      [in] HCHAPTER hReserved2,
                      [in] DBBKMARK cbBookmark,
                      [in, size_is(cbBookmark)] const BYTE *pBookmark,
                      [in] DBROWOFFSET lRowsOffset,
                      [in] DBROWCOUNT cRows,
                      [out] DBCOUNTITEM *pcRowsObtained,
                      [out, size_is(,cRows)] HROW **prghRows);

    HRESULT GetRowsByBookmark([in] HCHAPTER hReserved,
                              [in] DBCOUNTITEM cRows,
                              [in, size_is(cRows)] const DBBKMARK rgcbBookmarks[],
                              [in, size_is(cRows)] const BYTE *rgpBookmarks[],
                              [out, size_is(cRows)] HROW rghRows[],
                              [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);

    HRESULT Hash([in] HCHAPTER hReserved,
                 [in] DBBKMARK cBookmarks,
                 [in, size_is(cBookmarks)] const DBBKMARK rgcbBookmarks[],
                 [in, size_is(cBookmarks)] const BYTE *rgpBookmarks[],
                 [out, size_is(cBookmarks)] DBHASHVALUE rgHashedValues[],
                 [out, size_is(cBookmarks)] DBROWSTATUS rgBookmarkStatus[]);
}
