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

[
    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);

};
