/*
 * 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(cBindings)] DBBINDING *rgBindings,
                                 [in] DBLENGTH cbRowSize,
                                 [out] HACCESSOR *phAccessor,
                                 [in, out, unique, size_is(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(,*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);

};
