summaryrefslogtreecommitdiff
path: root/setup_native/source/win32/wintools/msidb/msidb.c
diff options
context:
space:
mode:
Diffstat (limited to 'setup_native/source/win32/wintools/msidb/msidb.c')
-rw-r--r--setup_native/source/win32/wintools/msidb/msidb.c620
1 files changed, 0 insertions, 620 deletions
diff --git a/setup_native/source/win32/wintools/msidb/msidb.c b/setup_native/source/win32/wintools/msidb/msidb.c
deleted file mode 100644
index 2c100975fe7b..000000000000
--- a/setup_native/source/win32/wintools/msidb/msidb.c
+++ /dev/null
@@ -1,620 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <dirent.h>
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <msi.h>
-#include <msiquery.h>
-#include <msidefs.h>
-
-#include "wine/unicode.h"
-
-#define MAX_TABLES 50
-#define MAX_STREAMS 10
-#define MAX_STORAGES 10
-#define MAX_TABLE_NAME 50
-#define MAX_STREAM_NAME 62
-#define MAX_STORAGE_NAME 31
-
-static const WCHAR PATH_DELIMITERW[] = {'/', 0};
-static const char PATH_DELIMITER[] = {'/', 0};
-
-
-static WCHAR *strdupAtoW( UINT cp, const char *str )
-{
- WCHAR *ret = NULL;
- if (str)
- {
- DWORD len = MultiByteToWideChar( cp, 0, str, -1, NULL, 0 );
- if ((ret = malloc( len * sizeof(WCHAR) )))
- MultiByteToWideChar( cp, 0, str, -1, ret, len );
- }
- return ret;
-}
-
-static char *strdupWtoA( UINT cp, const WCHAR *str )
-{
- char *ret = NULL;
- if (str)
- {
- DWORD len = WideCharToMultiByte(cp, 0, str, -1, NULL, 0, NULL, NULL);
- if ( (ret = malloc(len)) )
- WideCharToMultiByte(cp, 0, str, -1, ret, len, NULL, NULL);
- }
- return ret;
-}
-
-static BOOL msidbImportStorages(LPCWSTR dbfile, LPCWSTR wdir, LPWSTR storageNames[])
-{
- static const WCHAR delim[] = {'/', 0};
- UINT r, len, i;
- MSIHANDLE dbhandle, view, rec;
- WCHAR *storagePath = 0;
- char *query = "INSERT INTO _Storages (Name, Data) VALUES(?, ?)";
-
- r = MsiOpenDatabaseW(dbfile, (LPWSTR) MSIDBOPEN_TRANSACT, &dbhandle);
- if (r != ERROR_SUCCESS) return FALSE;
-
- r = MsiDatabaseOpenView(dbhandle, query, &view);
- if (r != ERROR_SUCCESS) return FALSE;
- MsiViewExecute(view, 0);
- r = MsiViewFetch(view, &rec);
- if (r != ERROR_SUCCESS) return FALSE;
-
- for (i = 0; i < MAX_STORAGES && storageNames[i] != 0; ++i)
- {
- len = lstrlenW(wdir) + lstrlenW(storageNames[i]) + 2;
- storagePath = malloc(len * sizeof(WCHAR));
- if (storagePath == NULL) return FALSE;
-
- lstrcpyW(storagePath, wdir);
- lstrcatW(storagePath, delim);
- lstrcatW(storagePath, storageNames[i]);
-
- rec = MsiCreateRecord(2);
- MsiRecordSetStringW(rec, 1, storageNames[i]);
- r = MsiRecordSetStreamW(rec, 2, storagePath);
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
-
- r = MsiViewExecute(view, rec);
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
-
- MsiCloseHandle(rec);
- }
-
- MsiViewClose(view);
- MsiCloseHandle(view);
- MsiDatabaseCommit(dbhandle);
- MsiCloseHandle(dbhandle);
- return TRUE;
-}
-
-static BOOL msidbExportStorage(LPCWSTR dbfile, LPCWSTR wdir, LPWSTR storageName)
-{
- UINT r, len;
- MSIHANDLE dbhandle, view, rec;
- char queryBuffer[100];
- char *storageNameA = strdupWtoA(CP_ACP, storageName);
- char *wdirA = strdupWtoA(CP_ACP, wdir);
- char *storagePath = NULL;
- char *dataBuffer;
- DWORD dataLen = 0;
- FILE *fp = NULL;
- sprintf(queryBuffer, "SELECT * FROM _Storages WHERE Name = '%s'", storageNameA);
-
- r = MsiOpenDatabaseW(dbfile, (LPWSTR) MSIDBOPEN_READONLY, &dbhandle);
- if (r != ERROR_SUCCESS)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
-
- MsiDatabaseOpenView(dbhandle, queryBuffer, &view);
- MsiViewExecute(view, 0);
- r = MsiViewFetch(view, &rec);
- if (r != ERROR_SUCCESS)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
-
- if (MsiRecordReadStream(rec, 2, 0, &dataLen) != ERROR_SUCCESS)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
-
- if ((dataBuffer = malloc(dataLen)) == NULL)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
- if (MsiRecordReadStream(rec, 2, dataBuffer, &dataLen) != ERROR_SUCCESS)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
-
- len = strlen(wdirA) + strlen(storageNameA) + 2;
- storagePath = malloc(len * sizeof(WCHAR));
- if (storagePath == NULL)
- {
- free(storageNameA);
- free(wdirA);
- return FALSE;
- }
-
- strcpy(storagePath, wdirA);
- strcat(storagePath, "/");
- strcat(storagePath, storageNameA);
-
- fp = fopen(storagePath , "wb");
- if (fp != NULL)
- {
- fwrite(dataBuffer, 1, dataLen, fp);
- fclose(fp);
- }
-
- free(storagePath);
- MsiCloseHandle(rec);
-
- MsiViewClose(view);
- MsiCloseHandle(view);
- MsiCloseHandle(dbhandle);
- free(storageNameA);
- free(wdirA);
- return TRUE;
-}
-
-static BOOL msidbImportStreams(LPCWSTR dbfile, LPCWSTR wdir, LPWSTR streamNames[])
-{
- UINT r, len;
- MSIHANDLE dbhandle, view, rec;
- int i = 0;
- WCHAR *streamPath = 0;
- char *query = "INSERT INTO _Streams (Name, Data) VALUES(?, ?)";
-
- r = MsiOpenDatabaseW(dbfile, (LPWSTR) MSIDBOPEN_TRANSACT, &dbhandle);
- if (r != ERROR_SUCCESS) return FALSE;
-
- r = MsiDatabaseOpenView(dbhandle, query, &view);
- if (r != ERROR_SUCCESS) return FALSE;
-
- for (i = 0; i < MAX_STREAMS && streamNames[i] != NULL; i++)
- {
- len = lstrlenW(wdir) + lstrlenW(streamNames[i]) + 2;
- streamPath = malloc(len * sizeof(WCHAR));
- if (streamPath == NULL) return FALSE;
-
- lstrcpyW(streamPath, wdir);
- lstrcatW(streamPath, PATH_DELIMITERW);
- lstrcatW(streamPath, streamNames[i]);
-
- rec = MsiCreateRecord(2);
- MsiRecordSetStringW(rec, 1, streamNames[i]);
- r = MsiRecordSetStreamW(rec, 2, streamPath);
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
-
- r = MsiViewExecute(view, rec);
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
-
- MsiCloseHandle(rec);
- }
-
- MsiViewClose(view);
- MsiCloseHandle(view);
- MsiDatabaseCommit(dbhandle);
- MsiCloseHandle(dbhandle);
- return TRUE;
-}
-
-/***********************************************************************
- * msidbExportStream
- *
- * Exports a stream to a file with an .idb extension.
- *
- * Examples (note wildcard escape for *nix/bash):
- * msidb -d <pathtomsi>.msi -f <workdir> -x <streamname>
- * msidb -d <pathtomsi>.msi -f <workdir> -x data.cab
- **********************************************************************/
-static BOOL msidbExportStream(LPCWSTR dbfile, LPCWSTR wdir, LPCWSTR streamName)
-{
- static const char ext[] = {'.', 'i', 'd', 'b', 0};
- UINT r, len;
- MSIHANDLE dbhandle, streamListView, rec;
- char queryBuffer[100];
- FILE *fp = 0;
- char *streamNameA = strdupWtoA(CP_ACP, streamName);
- char *wdirA = strdupWtoA(CP_ACP, wdir);
- char *streamFileA = 0;
- char streamPath[MAX_PATH];
- char *dataBuffer;
- DWORD dataLen = 0;
-
- r = MsiOpenDatabaseW(dbfile, (LPCWSTR) MSIDBOPEN_READONLY, &dbhandle);
- if (r != ERROR_SUCCESS)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
-
- sprintf(queryBuffer, "SELECT * FROM _Streams WHERE Name = '%s'", streamNameA);
- MsiDatabaseOpenView(dbhandle, queryBuffer, &streamListView);
- MsiViewExecute(streamListView, 0);
- r = MsiViewFetch(streamListView, &rec);
- if (r != ERROR_SUCCESS)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
-
- if (MsiRecordReadStream(rec, 2, 0, &dataLen) != ERROR_SUCCESS)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
- dataBuffer = malloc(dataLen);
- if (!dataBuffer)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
- if (MsiRecordReadStream(rec, 2, dataBuffer, &dataLen) != ERROR_SUCCESS)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
-
- len = strlen(streamNameA) + 5;
- streamFileA = malloc(len);
- if (streamFileA == NULL)
- {
- free(wdirA);
- free(streamNameA);
- return FALSE;
- }
-
- strcpy(streamFileA, streamNameA);
- strcat(streamFileA, ext);
-
- strcpy(streamPath, wdirA);
- strcat(streamPath, PATH_DELIMITER);
- strcat(streamPath, streamFileA);
-
- fp = fopen(streamPath , "wb");
- if (fp != NULL)
- {
- fwrite(dataBuffer, 1, dataLen, fp);
- fclose(fp);
- }
-
- free(streamFileA);
- MsiCloseHandle(rec);
-
- MsiViewClose(streamListView);
- MsiCloseHandle(streamListView);
- MsiCloseHandle(dbhandle);
- free(wdirA);
- free(streamNameA);
- return TRUE;
-}
-
-/***********************************************************************
- * msidbImportTables
- *
- * Takes a list of tables or '*' (for all) to import from text archive
- * files in specified folder
- *
- * For each table, a file called <tablename>.idt is imported containing
- * tab separated ASCII.
- *
- * Examples (note wildcard escape for *nix/bash):
- * msidb -d <pathtomsi>.msi -f <workdir> -i \*
- * msidb -d <pathtomsi>.msi -f <workdir> -i File Directory Binary
- **********************************************************************/
-static BOOL msidbImportTables(LPCWSTR dbfile, LPCWSTR wdir, LPWSTR tables[], BOOL create)
-{
- static const WCHAR ext[] = {'.', 'i', 'd', 't', 0};
- static const WCHAR all[] = {'*', 0};
-
- UINT r, len;
- char *dirNameA;
- char *fileName;
- DIR *dir;
- struct dirent *ent;
-
- int i = 0;
- MSIHANDLE dbhandle;
-
- LPWSTR tableFile = 0;
- LPCWSTR oFlag = (LPCWSTR) MSIDBOPEN_TRANSACT;
-
- if (create == TRUE) oFlag = (LPCWSTR) MSIDBOPEN_CREATE;
- r = MsiOpenDatabaseW(dbfile, oFlag, &dbhandle);
-
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
-
- if (strcmpW(tables[0], all) == 0)
- {
- dirNameA = strdupWtoA(CP_ACP, wdir);
- dir = opendir(dirNameA);
-
- if (dir)
- {
- while ((ent = readdir(dir)) != NULL)
- {
- if (ent->d_type != DT_REG) continue;
- fileName = ent->d_name;
- if (strcmp(fileName+strlen(fileName)-4*sizeof(fileName[0]), ".idt") != 0) continue;
- if (strcmp(fileName, ".") == 0 || strcmp(fileName, "..") == 0) continue;
- tableFile = strdupAtoW(CP_ACP, fileName);
- r = MsiDatabaseImportW(dbhandle, wdir, tableFile);
- free(tableFile);
- }
- }
- else
- {
- free(dirNameA);
- return FALSE;
- }
- closedir(dir);
- free(dirNameA);
- }
- 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 = MsiDatabaseImportW(dbhandle, wdir, tableFile);
- free(tableFile);
-
- if (r != ERROR_SUCCESS)
- {
- return FALSE;
- }
- }
- }
-
- MsiDatabaseCommit(dbhandle);
- MsiCloseHandle(dbhandle);
- return TRUE;
-}
-
-/***********************************************************************
- * 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 = SAL_N_ELEMENTS(tableName);
- 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 = SAL_N_ELEMENTS(tableName);
- 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;
-}
-
-static void usage( void )
-{
- printf(
- "Usage: msidb [options] [tables]\n"
- "\nOptions:\n"
- " -d <path> Fully qualified path to MSI database file\n"
- " -f <wdir> Path to the text archive folder\n"
- " -c Create or overwrite with new database and import tables\n"
- " -i <tables> Import tables from text archive files - "
- "use * for all\n"
- " -e <tables> Export tables to files archive in directory - "
- "use * for all\n"
- " -x <stream> Saves stream as <stream>.idb in <wdir>\n"
- " -a <file> Adds stream from file to database\n"
- " -r <storage> Adds storage to database as substorage\n");
-}
-
-int wmain(int argc, WCHAR *argv[])
-{
- LPWSTR dbfile, streamName, storageName;
- LPWSTR wdir = (LPWSTR) L".";
- LPWSTR streamFiles[MAX_STREAMS] = {0};
- LPWSTR storageNames[MAX_STORAGES] = {0};
- LPWSTR iTables[MAX_TABLES] = {0};
- LPWSTR oTables[MAX_TABLES] = {0};
- BOOL createdb = FALSE;
- int i = 0;
- int currStream = 0;
- int currStorage = 0;
- dbfile = streamName = storageName = NULL;
-
- while (argv[1] && (argv[1][0] == '-' || argv[1][0] == '/'))
- {
- switch (tolower(argv[1][1]))
- {
- case 'i': /* Import tables */
- i = 0;
- while (argv[2] && argv[2][0] != '-' && i < 10)
- {
- iTables[i] = argv[2];
- argv++; argc--; i++;
- }
- break;
- case 'e': /* Export tables */
- i = 0;
- while (argv[2] && argv[2][0] != '-' && i < 10)
- {
- oTables[i] = argv[2];
- argv++; argc--; i++;
- }
- break;
- case 'c': /* Create/overwrite .msi db */
- createdb = TRUE;
- break;
- case 'f': /* Specify working dir */
- argv++; argc--;
- wdir = argv[1];
- break;
- case 'd': /* Specify .msi db */
- argv++; argc--;
- dbfile = argv[1];
- break;
- case 'x': /* Save stream to .ibd */
- argv++; argc--;
- streamName = argv[1];
- break;
- case 'a': /* Add stream(s) to db */
- argv++; argc--;
- if (currStream < MAX_STREAMS)
- streamFiles[currStream++] = argv[1];
- break;
- case 'w':
- argv++; argc--;
- storageName = argv[1];
- break;
- case 'r': /* Add strg as substrg to db */
- argv++; argc--;
- if (currStorage < MAX_STORAGES)
- storageNames[currStorage++] = argv[1];
- break;
- case '?':
- case 'h':
- usage();
- return 0;
- }
- argv++; argc--;
- }
-
- if (iTables[0])
- if (!msidbImportTables(dbfile, wdir, iTables, createdb))
- return 1;
-
- if (oTables[0])
- if (!msidbExportTables(dbfile, wdir, oTables))
- return 2;
-
- if (streamName)
- if (!msidbExportStream(dbfile, wdir, streamName))
- return 3;
-
- if (streamFiles[0])
- if (!msidbImportStreams(dbfile, wdir, streamFiles))
- return 4;
-
- if(storageNames[0])
- if (!msidbImportStorages(dbfile, wdir, storageNames))
- return 5;
-
- if (storageName)
- if (!msidbExportStorage(dbfile, wdir, storageName))
- return 6;
-
- if (!iTables[0] && !oTables[0] && !streamName && !streamFiles[0] && !storageNames[0] && !storageName)
- return 7;
-
- return 0;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */