/*
 * 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(0c733a7c-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface IRowset : IUnknown
{
    typedef DWORD DBROWOPTIONS;

    HRESULT AddRefRows([in] DBCOUNTITEM cRows,
                       [in, size_is(cRows)] const HROW rghRows[],
                       [out, size_is(cRows)] DBREFCOUNT rgRefCounts[],
                       [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);

    HRESULT GetData([in] HROW hRow,
                    [in] HACCESSOR hAccessor,
                    [out] void *pData);

    HRESULT GetNextRows([in] HCHAPTER hReserved,
                        [in] DBROWOFFSET lRowsOffset,
                        [in] DBROWCOUNT cRows,
                        [out] DBCOUNTITEM *pcRowObtained,
                        [out, size_is(,cRows)] HROW **prghRows);

    HRESULT ReleaseRows([in] DBCOUNTITEM cRows,
                        [in, size_is(cRows)] const HROW rghRows[],
                        [in, size_is(cRows)] DBROWOPTIONS rgRowOptions[],
                        [out, size_is(cRows)] DBREFCOUNT rgRefCounts[],
                        [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);

    HRESULT RestartPosition([in] HCHAPTER hReserved);
}
