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 PyObject* record_setstream(msiobj* record, PyObject *args) { int status; int field; wchar_t *data; if (!PyArg_ParseTuple(args, "iu:SetStream", &field, &data)) return NULL; if ((status = MsiRecordSetStreamW(record->h, field, data)) != ERROR_SUCCESS) return msierror(status); Py_RETURN_NONE; }
static PyObject* record_setstream(msiobj* record, PyObject *args) { int status; int field; Py_UNICODE *data; if (!PyArg_ParseTuple(args, "iu:SetStream", &field, &data)) return NULL; if ((status = MsiRecordSetStreamW(record->h, field, data)) != ERROR_SUCCESS) return msierror(status); Py_INCREF(Py_None); return Py_None; }
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; }
UINT WINAPI MsiRecordSetStreamA(MSIHANDLE hRecord, UINT iField, LPCSTR szFilename) { LPWSTR wstr = NULL; UINT ret; TRACE("%d %d %s\n", hRecord, iField, debugstr_a(szFilename)); if( szFilename ) { wstr = strdupAtoW( szFilename ); if( !wstr ) return ERROR_OUTOFMEMORY; } ret = MsiRecordSetStreamW(hRecord, iField, wstr); msi_free(wstr); return ret; }