UINT WINAPI MsiDatabaseExportA( MSIHANDLE handle, LPCSTR szTable, LPCSTR szFolder, LPCSTR szFilename ) { LPWSTR path = NULL, file = NULL, table = NULL; UINT r = ERROR_OUTOFMEMORY; TRACE("%lx %s %s %s\n", handle, debugstr_a(szTable), debugstr_a(szFolder), debugstr_a(szFilename)); if( szTable ) { table = strdupAtoW( szTable ); if( !table ) goto end; } if( szFolder ) { path = strdupAtoW( szFolder ); if( !path ) goto end; } if( szFilename ) { file = strdupAtoW( szFilename ); if( !file ) goto end; } r = MsiDatabaseExportW( handle, table, path, file ); end: msi_free( table ); msi_free( path ); msi_free( file ); return r; }
/*********************************************************************** * msidbExportTables * * Takes a list of tables or '*' (for all) to export to text archive * files in specified folder * * For each table, a file called <tablename>.idt is exported containing * tab separated ASCII. * * Examples (note wildcard escape for *nix/bash): * msidb -d <pathtomsi>.msi -f <workdir> -e \* * msidb -d <pathtomsi>.msi -f <workdir> -e File Directory Binary **********************************************************************/ static BOOL msidbExportTables(LPCWSTR dbfile, LPCWSTR wdir, LPWSTR tables[]) { static const WCHAR ext[] = {'.', 'i', 'd', 't', 0}; static const WCHAR all[] = {'*', 0}; UINT r, len; MSIHANDLE dbhandle, tableListView, rec; LPWSTR tableFile = 0; WCHAR tableName[MAX_TABLE_NAME]; DWORD size = sizeof(tableName) / sizeof(tableName[0]); int i = 0; r = MsiOpenDatabaseW(dbfile, (LPCWSTR) MSIDBOPEN_READONLY, &dbhandle); if (r != ERROR_SUCCESS) return FALSE; if (strcmpW(tables[0], all) == 0) { r = MsiDatabaseOpenView(dbhandle, "SELECT Name FROM _Tables", &tableListView); r = MsiViewExecute(tableListView, 0); r = MsiViewFetch(tableListView, &rec); while (r == ERROR_SUCCESS) { size = sizeof(tableName) / sizeof(tableName[0]); r = MsiRecordGetStringW(rec, 1, tableName, &size); if (r == ERROR_SUCCESS) { len = lstrlenW(tableName) + 5; tableFile = malloc(len * sizeof (WCHAR)); if (tableFile == NULL) return FALSE; lstrcpyW(tableFile, tableName); lstrcatW(tableFile, ext); r = MsiDatabaseExportW(dbhandle, tableName, wdir, tableFile); free(tableFile); MsiCloseHandle(rec); } r = MsiViewFetch(tableListView, &rec); } MsiViewClose(tableListView); MsiCloseHandle(tableListView); } else { for (i = 0; i < MAX_TABLES && tables[i] != 0; ++i) { len = lstrlenW(tables[i]) + 5; tableFile = malloc(len * sizeof (WCHAR)); if (tableFile == NULL) return FALSE; lstrcpyW(tableFile, tables[i]); lstrcatW(tableFile, ext); r = MsiDatabaseExportW(dbhandle, tables[i], wdir, tableFile); free(tableFile); } } MsiCloseHandle(dbhandle); return TRUE; }