/*
 * 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
 */

[
    object,
    uuid(0c733a8c-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface IAccessor : IUnknown
{

    typedef DWORD DBACCESSORFLAGS;

    typedef DWORD DBBINDSTATUS;

    [local]
    HRESULT AddRefAccessor([in] HACCESSOR hAccessor,
                           [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount);

    [call_as(AddRefAccessor)]
    HRESULT RemoteAddRefAccessor([in] HACCESSOR hAccessor,
                                 [in, out, unique] DBREFCOUNT *pcRefCount,
                                 [out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT CreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags,
                           [in] DBCOUNTITEM cBindings,
                           [in, size_is(cBindings), annotation("__in_ecount(cBindings)")] const DBBINDING rgBindings[],
                           [in] DBLENGTH cbRowSize,
                           [out, annotation("__out")] HACCESSOR *phAccessor,
                           [out, size_is(cBindings), annotation("__out_ecount_opt(cBindings)")] DBBINDSTATUS rgStatus[]);

    [call_as(CreateAccessor)]
    HRESULT RemoteCreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags,
                                 [in] DBCOUNTITEM cBindings,
                                 [in, unique, size_is((ULONG)cBindings)] DBBINDING *rgBindings,
                                 [in] DBLENGTH cbRowSize,
                                 [out] HACCESSOR *phAccessor,
                                 [in, out, unique, size_is((ULONG)cBindings)] DBBINDSTATUS *rgStatus,
                                 [out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT GetBindings([in] HACCESSOR hAccessor,
                        [out, annotation("__out")] DBACCESSORFLAGS *pdwAccessorFlags,
                        [in, out, annotation("__out_opt")] DBCOUNTITEM *pcBindings,
                        [out, size_is(,*pcBindings), annotation("__deref_out_ecount_opt(*pcBindings)")] DBBINDING **prgBindings);

    [call_as(GetBindings)]
    HRESULT RemoteGetBindings([in] HACCESSOR hAccessor,
                              [out] DBACCESSORFLAGS *pdwAccessorFlags,
                              [in, out] DBCOUNTITEM *pcBindings,
                              [out, size_is(,(ULONG)*pcBindings)] DBBINDING **prgBindings,
                              [out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT ReleaseAccessor([in] HACCESSOR hAccessor,
                            [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount);

    [call_as(ReleaseAccessor)]
    HRESULT RemoteReleaseAccessor([in] HACCESSOR hAccessor,
                                  [in, out, unique] DBREFCOUNT *pcRefCount,
                                  [out] IErrorInfo **ppErrorInfoRem);

};
