/*
 * 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, annotation("__out_opt")] 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);

};
