31 #include "wine/unicode.h" 37 #include "msiserver.h" 54 #define IS_INTMSIDBOPEN(x) (((ULONG_PTR)(x) >> 16) == 0) 69 IStorage_Release(
t->stg );
90 IStorage_AddRef( stg );
103 IStorage_Release( db->
storage );
114 static const WCHAR szTables[] = {
'_',
'T',
'a',
'b',
'l',
'e',
's',0 };
117 hr = IStorage_SetClass( stg,
clsid );
120 WARN(
"failed to set class id 0x%08x\n",
hr);
128 WARN(
"failed to create _Tables stream 0x%08x\n",
hr);
135 WARN(
"failed to initialize string table 0x%08x\n",
hr);
139 hr = IStorage_Commit( stg, 0 );
142 WARN(
"failed to commit changes 0x%08x\n",
hr);
167 TRACE(
"Database is a patch\n");
179 szDBPath = szPersist;
195 r =
db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
204 r =
db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
219 ERR(
"unknown flag %p\n",szPersist);
229 r = IStorage_Stat( stg, &
stat, STATFLAG_NONAME );
232 FIXME(
"Failed to stat storage\n");
240 ERR(
"storage GUID is not a MSI database GUID %s\n",
247 ERR(
"storage GUID is not the MSI patch GUID %s\n",
257 FIXME(
"Failed to allocate a handle\n");
291 IStorage_AddRef( stg );
298 IStorage_Release( stg );
393 while (chars_left && *
ptr !=
'\n')
411 while (chars_left && *
ptr ==
'\r')
418 while (chars_left && *
ptr !=
'\t' && *
ptr !=
'\n' && *
ptr !=
'\r')
431 if (*
ptr ==
'\n' || *
ptr ==
'\r')
433 while (chars_left && (*
ptr ==
'\n' || *
ptr ==
'\r'))
444 (*entries)[
i] = save;
451 *num_entries =
count;
459 static const WCHAR create_fmt[] = {
'C',
'R',
'E',
'A',
'T',
'E',
' ',
'T',
'A',
'B',
'L',
'E',
' ',
'`',
'%',
's',
'`',
' ',
'(',
' ',0};
478 static const WCHAR column_fmt[] = {
'`',
'%',
's',
'`',
' ',
'%',
's',
'%',
's',
'%',
's',
'%',
's',
' ',0};
479 static const WCHAR size_fmt[] = {
'(',
'%',
's',
')',0};
480 static const WCHAR type_char[] = {
'C',
'H',
'A',
'R',0};
481 static const WCHAR type_int[] = {
'I',
'N',
'T',0};
482 static const WCHAR type_long[] = {
'L',
'O',
'N',
'G',0};
483 static const WCHAR type_object[] = {
'O',
'B',
'J',
'E',
'C',
'T',0};
484 static const WCHAR type_notnull[] = {
' ',
'N',
'O',
'T',
' ',
'N',
'U',
'L',
'L',0};
485 static const WCHAR localizable[] = {
' ',
'L',
'O',
'C',
'A',
'L',
'I',
'Z',
'A',
'B',
'L',
'E',0};
491 for (
i = 0;
i < num_columns;
i++)
496 if (
i == num_columns - 1)
532 WARN(
"invalid int width %u\n",
len);
571 static const WCHAR key_fmt[] = {
'`',
'%',
's',
'`',
',',
' ',0};
572 static const WCHAR postlude_fmt[] = {
'P',
'R',
'I',
'M',
'A',
'R',
'Y',
' ',
'K',
'E',
'Y',
' ',
'%',
's',
')',0};
574 for (
i = 0,
size = 1;
i < num_keys;
i++)
581 for (
i = 0,
ptr = keys;
i < num_keys;
i++)
594 sprintfW(postlude, postlude_fmt, keys);
607 LPWSTR prelude, columns_sql, postlude;
613 if (!prelude || !columns_sql || !postlude)
674 for (
i = 0;
i < num_columns;
i++)
678 case 'L':
case 'l':
case 'S':
case 's':
700 ERR(
"Unhandled column type: %c\n",
types[
i][0]);
711 int num_columns,
int num_records,
720 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
721 'F',
'R',
'O',
'M',
' ',
'`',
'%',
's',
'`',0
736 for (
i = 0;
i < num_records;
i++)
761 DWORD num_labels, num_types;
762 DWORD num_columns, num_records = 0;
769 {
'_',
'S',
'u',
'm',
'm',
'a',
'r',
'y',
'I',
'n',
'f',
'o',
'r',
'm',
'a',
't',
'i',
'o',
'n',0};
770 static const WCHAR forcecodepage[] =
771 {
'_',
'F',
'o',
'r',
'c',
'e',
'C',
'o',
'd',
'e',
'p',
'a',
'g',
'e',0};
799 if (num_columns == 1 && !columns[0][0] && num_labels == 1 && !labels[0][0] &&
806 if (num_columns != num_types)
831 records = temp_records;
865 for (
i = 0;
i < num_records;
i++)
886 if ( !remote_database )
889 IWineMsiRemoteDatabase_Release( remote_database );
890 WARN(
"MsiDatabaseImport not allowed during a custom action!\n");
978 static const WCHAR fmt_file[] = {
'%',
's',
'/',
'%',
's',
'/',
'%',
's',0 };
979 static const WCHAR fmt_folder[] = {
'%',
's',
'/',
'%',
's',0 };
981 DWORD sz, read_size, write_size;
987 sz =
sizeof(stream_name)/
sizeof(
WCHAR);
1008 read_size =
sizeof(
buffer);
1009 while (read_size ==
sizeof(
buffer))
1052 sep = (
i <
count) ?
"\t" :
"\r\n";
1066 static const char fmt[] =
"\r\n\r\n%u\t_ForceCodepage\r\n";
1081 static const char header[] =
"PropertyId\tValue\r\n" 1083 "_SummaryInformation\tPropertyId\r\n";
1096 static const WCHAR summaryinformation[] = {
1097 '_',
'S',
'u',
'm',
'm',
'a',
'r',
'y',
'I',
'n',
'f',
'o',
'r',
'm',
'a',
't',
'i',
'o',
'n',0 };
1099 's',
'e',
'l',
'e',
'c',
't',
' ',
'*',
' ',
'f',
'r',
'o',
'm',
' ',
'%',
's',0 };
1100 static const WCHAR forcecodepage[] = {
1101 '_',
'F',
'o',
'r',
'c',
'e',
'C',
'o',
'd',
'e',
'p',
'a',
'g',
'e',0 };
1212 if ( !remote_database )
1215 IWineMsiRemoteDatabase_Release( remote_database );
1216 WARN(
"MsiDatabaseExport not allowed during a custom action!\n");
1272 TRACE(
"(%d, %d, %s)\n", hDatabase, hDatabaseMerge,
1313 if (((type1[0] ==
'l') || (type1[0] ==
's')) &&
1314 ((type2[0] ==
'l') || (type2[0] ==
's')))
1317 if (((type1[0] ==
'L') || (type1[0] ==
'S')) &&
1318 ((type2[0] ==
'L') || (type2[0] ==
'S')))
1321 return !
strcmpW( type1, type2 );
1355 dbrec = mergerec =
NULL;
1454 const WCHAR szQuote[] = {
'\'', 0};
1476 ERR(
"failed to get string!\n");
1493 static const WCHAR keyset[] = {
1494 '`',
'%',
's',
'`',
' ',
'=',
' ',
'%',
's',
' ',
'A',
'N',
'D',
' ',0};
1495 static const WCHAR lastkeyset[] = {
1496 '`',
'%',
's',
'`',
' ',
'=',
' ',
'%',
's',
' ',0};
1497 static const WCHAR fmt[] = {
'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
1498 'F',
'R',
'O',
'M',
' ',
'`',
'%',
's',
'`',
' ',
1499 'W',
'H',
'E',
'R',
'E',
' ',
'%',
's',0};
1517 setptr = lastkeyset;
1574 table->numconflicts++;
1591 if (!mergerow->
data)
1617 *numlabels =
count + 1;
1658 *numcolumns =
count;
1713 for (
i = 0;
i <
table->numlabels;
i++)
1721 for (
i = 0;
i <
table->numcolumns;
i++)
1729 for (
i = 0;
i <
table->numtypes;
i++)
1747 static const WCHAR query[] = {
'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
1748 'F',
'R',
'O',
'M',
' ',
'`',
'%',
's',
'`',0};
1776 table->numconflicts = 0;
1798 static const WCHAR query[] = {
'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
1799 'F',
'R',
'O',
'M',
' ',
'`',
'%',
's',
'`',0};
1827 data->curview = mergeview;
1844 struct list *tabledata)
1847 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
1848 '`',
'_',
'T',
'a',
'b',
'l',
'e',
's',
'`',0};
1859 data.tabledata = tabledata;
1902 'C',
'R',
'E',
'A',
'T',
'E',
' ',
'T',
'A',
'B',
'L',
'E',
' ',
1903 '`',
'%',
's',
'`',
' ',
'(',
'`',
'T',
'a',
'b',
'l',
'e',
'`',
' ',
1904 'C',
'H',
'A',
'R',
'(',
'2',
'5',
'5',
')',
' ',
'N',
'O',
'T',
' ',
1905 'N',
'U',
'L',
'L',
',',
' ',
'`',
'N',
'u',
'm',
'R',
'o',
'w',
'M',
'e',
'r',
'g',
'e',
1906 'C',
'o',
'n',
'f',
'l',
'i',
'c',
't',
's',
'`',
' ',
'S',
'H',
'O',
'R',
'T',
' ',
1907 'N',
'O',
'T',
' ',
'N',
'U',
'L',
'L',
' ',
'P',
'R',
'I',
'M',
'A',
'R',
'Y',
' ',
1908 'K',
'E',
'Y',
' ',
'`',
'T',
'a',
'b',
'l',
'e',
'`',
')',0};
1910 'I',
'N',
'S',
'E',
'R',
'T',
' ',
'I',
'N',
'T',
'O',
' ',
1911 '`',
'%',
's',
'`',
' ',
'(',
'`',
'T',
'a',
'b',
'l',
'e',
'`',
',',
' ',
1912 '`',
'N',
'u',
'm',
'R',
'o',
'w',
'M',
'e',
'r',
'g',
'e',
1913 'C',
'o',
'n',
'f',
'l',
'i',
'c',
't',
's',
'`',
')',
' ',
'V',
'A',
'L',
'U',
'E',
'S',
1914 ' ',
'(',
'\'',
'%',
's',
'\'',
',',
' ',
'%',
'd',
')',0};
1947 TRACE(
"(%d, %d, %s)\n", hDatabase, hDatabaseMerge,
1950 if (szTableName && !*szTableName)
1968 if (
table->numconflicts)
1973 table->numconflicts);
2011 WARN(
"MsiGetDatabaseState not allowed during a custom action!\n");
2039 IWineMsiRemoteDatabase_AddRef( iface );
2131 *ppObj = &
This->IWineMsiRemoteDatabase_iface;
void msiobj_addref(MSIOBJECTHDR *info)
#define ERROR_INVALID_PARAMETER
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
#define MSIDBOPEN_READONLY
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
MSIRECORD * MSI_CloneRecord(MSIRECORD *) DECLSPEC_HIDDEN
static LPWSTR msi_build_createsql_postlude(LPWSTR *primary_keys, DWORD num_keys)
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
static HRESULT db_initialize(IStorage *stg, const GUID *clsid)
#define HRESULT_FROM_WIN32(x)
UINT MSI_ViewGetColumnInfo(MSIQUERY *, MSICOLINFO, MSIRECORD **) DECLSPEC_HIDDEN
struct _tagMERGEDATA MERGEDATA
static UINT merge_table(MSIDATABASE *db, MERGETABLE *table)
#define MSIDBOPEN_PATCHFILE
static UINT msi_export_summaryinformation(MSIDATABASE *db, HANDLE handle)
UINT TABLE_CreateView(MSIDATABASE *db, LPCWSTR name, MSIVIEW **view) DECLSPEC_HIDDEN
UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB)
#define MSI_INITIAL_MEDIA_TRANSFORM_DISKID
#define ERROR_NO_MORE_ITEMS
#define STGM_SHARE_EXCLUSIVE
static const IWineMsiRemoteDatabaseVtbl msi_remote_database_vtbl
static UINT msi_export_stream(LPCWSTR folder, LPCWSTR table, MSIRECORD *row, UINT field, UINT start)
ACPI_SIZE strlen(const char *String)
static UINT msi_export_forcecodepage(HANDLE handle, UINT codepage)
UINT MSI_ViewModify(MSIQUERY *, MSIMODIFY, MSIRECORD *) DECLSPEC_HIDDEN
GLsizei const GLchar ** path
static WCHAR * strdupW(const WCHAR *src)
GLdouble GLdouble GLdouble r
WINE_UNICODE_INLINE WCHAR * strchrW(const WCHAR *str, WCHAR ch)
GLuint GLuint GLsizei count
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
HRESULT create_msi_remote_database(IUnknown *pOuter, LPVOID *ppObj)
static UINT merge_diff_row(MSIRECORD *rec, LPVOID param)
#define ERROR_INVALID_HANDLE
UINT MSI_RecordGetStringW(MSIRECORD *, UINT, LPWSTR, LPDWORD) DECLSPEC_HIDDEN
UINT MSI_ViewExecute(MSIQUERY *, MSIRECORD *) DECLSPEC_HIDDEN
BOOL MSI_RecordsAreEqual(MSIRECORD *, MSIRECORD *) DECLSPEC_HIDDEN
static UINT msi_get_table_labels(MSIDATABASE *db, LPCWSTR table, LPWSTR **labels, DWORD *numlabels)
#define GetCurrentDirectoryW(x, y)
GLsizei GLenum GLenum * types
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
#define ERROR_DATATYPE_MISMATCH
const struct column * columns
UINT WINAPI MsiDatabaseMergeW(MSIHANDLE hDatabase, MSIHANDLE hDatabaseMerge, LPCWSTR szTableName)
#define ERROR_NOT_ENOUGH_MEMORY
#define INVALID_HANDLE_VALUE
UINT write_stream_data(IStorage *stg, LPCWSTR stname, LPCVOID data, UINT sz, BOOL bTable) DECLSPEC_HIDDEN
static LPWSTR create_diff_row_query(MSIDATABASE *merge, MSIQUERY *view, LPWSTR table, MSIRECORD *rec)
void enum_stream_names(IStorage *stg) DECLSPEC_HIDDEN
GLenum GLsizei GLenum GLenum const GLvoid * table
static ULONG WINAPI mrd_Release(IWineMsiRemoteDatabase *iface)
static UINT msi_export_field(HANDLE handle, MSIRECORD *row, UINT field)
string_table * msi_load_string_table(IStorage *stg, UINT *bytes_per_strref) DECLSPEC_HIDDEN
UINT WINAPI MsiGetSummaryInformationW(MSIHANDLE hDatabase, LPCWSTR szDatabase, UINT uiUpdateCount, MSIHANDLE *pHandle)
#define cmp(status, error)
#define MSIHANDLETYPE_DATABASE
#define MSI_INITIAL_MEDIA_TRANSFORM_OFFSET
static UINT update_merge_errors(MSIDATABASE *db, LPCWSTR error, LPWSTR table, DWORD numconflicts)
#define IS_INTMSIDBOPEN(x)
static BOOL merge_type_match(LPCWSTR type1, LPCWSTR type2)
static void * msi_realloc(void *mem, size_t len) __WINE_ALLOC_SIZE(2)
static void * msi_alloc_zero(size_t len) __WINE_ALLOC_SIZE(1)
UINT MSI_RecordGetStringA(MSIRECORD *, UINT, LPSTR, LPDWORD) DECLSPEC_HIDDEN
UINT MSI_DatabaseGetPrimaryKeys(MSIDATABASE *, LPCWSTR, MSIRECORD **) DECLSPEC_HIDDEN
static struct @1557 save_path[MOVE_LIST_SIZE]
__WINE_SERVER_LIST_INLINE struct list * list_head(const struct list *list)
static const CHAR suminfo[]
BOOL TABLE_Exists(MSIDATABASE *db, LPCWSTR name) DECLSPEC_HIDDEN
#define sprintf(buf, format,...)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
UINT MSI_OpenQuery(MSIDATABASE *, MSIQUERY **, LPCWSTR,...) DECLSPEC_HIDDEN
void * alloc_msiobject(UINT type, UINT size, msihandledestructor destroy)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define ERROR_WRITE_FAULT
UINT MSI_RecordSetInteger(MSIRECORD *, UINT, int) DECLSPEC_HIDDEN
IWineMsiRemoteDatabase IWineMsiRemoteDatabase_iface
VOID msi_destroy_stringtable(string_table *st) DECLSPEC_HIDDEN
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
#define ERROR_FUNCTION_FAILED
UINT MSI_ViewFetch(MSIQUERY *, MSIRECORD **) DECLSPEC_HIDDEN
UINT WINAPI MsiDatabaseMergeA(MSIHANDLE hDatabase, MSIHANDLE hDatabaseMerge, LPCSTR szTableName)
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
UINT MSI_RecordSetStreamFromFileW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
_STLP_MOVE_TO_STD_NAMESPACE _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _OutputIter __result)
static void free_transforms(MSIDATABASE *db)
static UINT merge_verify_primary_keys(MSIDATABASE *db, MSIDATABASE *mergedb, LPCWSTR table)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
static UINT msi_export_row(MSIRECORD *row, void *arg)
WINE_UNICODE_INLINE long int atolW(const WCHAR *str)
static HRESULT WINAPI mrd_SetMsiHandle(IWineMsiRemoteDatabase *iface, MSIHANDLE handle)
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT) DECLSPEC_HIDDEN
static msi_remote_database_impl * impl_from_IWineMsiRemoteDatabase(IWineMsiRemoteDatabase *iface)
static UINT msi_export_record(struct row_export_info *row_export_info, MSIRECORD *row, UINT start)
static LPWSTR msi_read_text_archive(LPCWSTR path, DWORD *len)
#define ERROR_FILE_NOT_FOUND
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static UINT construct_record(DWORD num_columns, LPWSTR *types, LPWSTR *data, LPWSTR path, MSIRECORD **rec)
void free_cached_tables(MSIDATABASE *db) DECLSPEC_HIDDEN
MSIDBSTATE WINAPI MsiGetDatabaseState(MSIHANDLE handle)
UINT MSI_ViewClose(MSIQUERY *) DECLSPEC_HIDDEN
void append_storage_to_db(MSIDATABASE *db, IStorage *stg)
static VOID MSI_CloseDatabase(MSIOBJECTHDR *arg)
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
static UINT MSI_DatabaseExport(MSIDATABASE *db, LPCWSTR table, LPCWSTR folder, LPCWSTR file)
static UINT merge_diff_tables(MSIRECORD *rec, LPVOID param)
MSICONDITION WINAPI MsiDatabaseIsTablePersistentW(MSIHANDLE hDatabase, LPCWSTR szTableName)
struct _tagMERGEROW MERGEROW
static UINT MSI_DatabaseImport(MSIDATABASE *db, LPCWSTR folder, LPCWSTR file)
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
HRESULT WINAPI StgOpenStorage(const OLECHAR *pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstgOpen)
static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, DWORD num_columns)
UINT WINAPI MsiDatabaseGetPrimaryKeysW(MSIHANDLE hdb, LPCWSTR table, MSIHANDLE *phRec)
#define MSIDBOPEN_CREATEDIRECT
static LPWSTR msi_build_createsql_prelude(LPWSTR table)
UINT WINAPI MsiDatabaseImportW(MSIHANDLE handle, LPCWSTR szFolder, LPCWSTR szFilename)
static HRESULT WINAPI mrd_OpenView(IWineMsiRemoteDatabase *iface, LPCWSTR query, MSIHANDLE *view)
#define MSIDBOPEN_TRANSACT
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
static UINT msi_get_query_types(MSIQUERY *query, LPWSTR **types, DWORD *numtypes)
#define INVALID_FILE_ATTRIBUTES
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static LPWSTR get_key_value(MSIQUERY *view, LPCWSTR key, MSIRECORD *rec)
int msiobj_release(MSIOBJECTHDR *info)
struct _tagMERGETABLE MERGETABLE
static UINT msi_get_query_columns(MSIQUERY *query, LPWSTR **columns, DWORD *numcolumns)
UINT WINAPI MsiDatabaseExportA(MSIHANDLE handle, LPCSTR szTable, LPCSTR szFolder, LPCSTR szFilename)
HRESULT msi_init_string_table(IStorage *stg) DECLSPEC_HIDDEN
MSIRECORD * MSI_CreateRecord(UINT) DECLSPEC_HIDDEN
#define FILE_ATTRIBUTE_NORMAL
static HRESULT WINAPI mrd_IsTablePersistent(IWineMsiRemoteDatabase *iface, LPCWSTR table, MSICONDITION *persistent)
static const WCHAR szTables[]
enum tagMSIDBSTATE MSIDBSTATE
#define InterlockedDecrement
static UINT msi_add_table_to_db(MSIDATABASE *db, LPWSTR *columns, LPWSTR *types, LPWSTR *labels, DWORD num_labels, DWORD num_columns)
HRESULT WINAPI StgCreateDocfile(LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen)
static UINT msi_get_merge_table(MSIDATABASE *db, LPCWSTR name, MERGETABLE **ptable)
UINT msi_add_suminfo(MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns) DECLSPEC_HIDDEN
UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
WINE_UNICODE_INLINE WCHAR * strrchrW(const WCHAR *str, WCHAR ch)
#define ERROR_INVALID_TABLE
static HRESULT WINAPI mrd_GetPrimaryKeys(IWineMsiRemoteDatabase *iface, LPCWSTR table, MSIHANDLE *keys)
UINT(* delete)(struct tagMSIVIEW *)
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
UINT msi_set_string_table_codepage(string_table *st, UINT codepage) DECLSPEC_HIDDEN
static HRESULT WINAPI mrd_GetSummaryInformation(IWineMsiRemoteDatabase *iface, UINT updatecount, MSIHANDLE *suminfo)
int WINAPI lstrlenA(LPCSTR lpString)
#define InterlockedIncrement
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define ERROR_OPEN_FAILED
static ULONG WINAPI mrd_AddRef(IWineMsiRemoteDatabase *iface)
WCHAR * msi_dup_record_field(MSIRECORD *row, INT index) DECLSPEC_HIDDEN
static void free_merge_table(MERGETABLE *table)
static UINT gather_merge_data(MSIDATABASE *db, MSIDATABASE *merge, struct list *tabledata)
UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
MSIHANDLE alloc_msihandle(MSIOBJECTHDR *obj)
#define ReadFile(a, b, c, d, e)
struct _msi_remote_database_impl msi_remote_database_impl
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
static const WCHAR szBackSlash[]
#define MultiByteToWideChar
UINT MSI_RecordReadStream(MSIRECORD *, UINT, char *, LPDWORD) DECLSPEC_HIDDEN
UINT media_transform_disk_id
static UINT msi_add_records_to_table(MSIDATABASE *db, LPWSTR *columns, LPWSTR *types, LPWSTR *labels, LPWSTR **records, int num_columns, int num_records, LPWSTR path)
static BOOL msi_free(void *mem)
UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb, LPCWSTR szQuery, MSIHANDLE *phView)
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
UINT msi_export_suminfo(MSIDATABASE *db, HANDLE handle) DECLSPEC_HIDDEN
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
static IOleDocumentView * view
#define ERROR_PATH_NOT_FOUND
IUnknown * msi_get_remote(MSIHANDLE handle)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
GLuint GLuint GLsizei GLenum type
#define STGM_SHARE_DENY_WRITE
UINT WINAPI MsiDatabaseExportW(MSIHANDLE handle, LPCWSTR szTable, LPCWSTR szFolder, LPCWSTR szFilename)
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
static void free_streams(MSIDATABASE *db)
UINT MSI_IterateRecords(MSIQUERY *, LPDWORD, record_func, LPVOID) DECLSPEC_HIDDEN
static const struct access_res create[16]
static LPWSTR msi_import_stream_filename(LPCWSTR path, LPCWSTR name)
#define IsEqualCLSID(rclsid1, rclsid2)
static HRESULT WINAPI mrd_QueryInterface(IWineMsiRemoteDatabase *iface, REFIID riid, LPVOID *ppobj)
WINE_DEFAULT_DEBUG_CHANNEL(msi)
static WCHAR * strdupAtoW(const char *str)
static void merge_free_rows(MERGETABLE *table)
static const WCHAR szTable[]
UINT media_transform_offset
_CRTIMP int __cdecl read(_In_ int _FileHandle, _Out_writes_bytes_(_MaxCharCount) void *_DstBuf, _In_ unsigned int _MaxCharCount)
UINT msi_get_string_table_codepage(const string_table *st) DECLSPEC_HIDDEN
UINT MSI_RecordGetFieldCount(const MSIRECORD *rec) DECLSPEC_HIDDEN
static void msi_parse_line(LPWSTR *line, LPWSTR **entries, DWORD *num_entries, DWORD *len)
WINE_UNICODE_INLINE int atoiW(const WCHAR *str)
UINT WINAPI MsiDatabaseImportA(MSIHANDLE handle, LPCSTR szFolder, LPCSTR szFilename)
static UINT merge_verify_colnames(MSIQUERY *dbview, MSIQUERY *mergeview)
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
UINT(* insert_row)(struct tagMSIVIEW *view, MSIRECORD *record, UINT row, BOOL temporary)
UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY **) DECLSPEC_HIDDEN
GLuint const GLchar * name