msi: Move database initialization to a separate function.
This commit is contained in:
parent
eef54ffe6b
commit
dd7514a38d
|
@ -255,6 +255,43 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT db_initialize( IStorage *stg, const GUID *clsid )
|
||||||
|
{
|
||||||
|
static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 };
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = IStorage_SetClass( stg, clsid );
|
||||||
|
if (FAILED( hr ))
|
||||||
|
{
|
||||||
|
WARN("failed to set class id 0x%08x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the _Tables stream */
|
||||||
|
hr = write_stream_data( stg, szTables, NULL, 0, TRUE );
|
||||||
|
if (FAILED( hr ))
|
||||||
|
{
|
||||||
|
WARN("failed to create _Tables stream 0x%08x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = msi_init_string_table( stg );
|
||||||
|
if (FAILED( hr ))
|
||||||
|
{
|
||||||
|
WARN("failed to initialize string table 0x%08x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IStorage_Commit( stg, 0 );
|
||||||
|
if (FAILED( hr ))
|
||||||
|
{
|
||||||
|
WARN("failed to commit changes 0x%08x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
|
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
|
||||||
{
|
{
|
||||||
IStorage *stg = NULL;
|
IStorage *stg = NULL;
|
||||||
|
@ -266,8 +303,6 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
|
||||||
BOOL created = FALSE, patch = FALSE;
|
BOOL created = FALSE, patch = FALSE;
|
||||||
WCHAR path[MAX_PATH];
|
WCHAR path[MAX_PATH];
|
||||||
|
|
||||||
static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 };
|
|
||||||
|
|
||||||
TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) );
|
TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) );
|
||||||
|
|
||||||
if( !pdb )
|
if( !pdb )
|
||||||
|
@ -298,34 +333,22 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
|
||||||
r = StgOpenStorage( szDBPath, NULL,
|
r = StgOpenStorage( szDBPath, NULL,
|
||||||
STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg);
|
STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg);
|
||||||
}
|
}
|
||||||
else if( szPersist == MSIDBOPEN_CREATE || szPersist == MSIDBOPEN_CREATEDIRECT )
|
else if( szPersist == MSIDBOPEN_CREATE )
|
||||||
{
|
{
|
||||||
if ( szPersist == MSIDBOPEN_CREATE )
|
r = StgCreateDocfile( szDBPath,
|
||||||
{
|
STGM_CREATE|STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg );
|
||||||
r = StgCreateDocfile( szDBPath,
|
|
||||||
STGM_CREATE|STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = StgCreateDocfile( szDBPath,
|
|
||||||
STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg);
|
|
||||||
}
|
|
||||||
if( SUCCEEDED(r) )
|
if( SUCCEEDED(r) )
|
||||||
{
|
r = db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
|
||||||
IStorage_SetClass( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
|
created = TRUE;
|
||||||
/* create the _Tables stream */
|
}
|
||||||
r = write_stream_data(stg, szTables, NULL, 0, TRUE);
|
else if( szPersist == MSIDBOPEN_CREATEDIRECT )
|
||||||
if (SUCCEEDED(r))
|
{
|
||||||
{
|
r = StgCreateDocfile( szDBPath,
|
||||||
r = msi_init_string_table( stg );
|
STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg );
|
||||||
if (SUCCEEDED(r))
|
|
||||||
{
|
if( SUCCEEDED(r) )
|
||||||
r = IStorage_Commit( stg, 0 );
|
r = db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
|
||||||
if (FAILED(r))
|
|
||||||
WARN("failed to commit changes 0x%08x\n", r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
created = TRUE;
|
created = TRUE;
|
||||||
}
|
}
|
||||||
else if( szPersist == MSIDBOPEN_TRANSACT )
|
else if( szPersist == MSIDBOPEN_TRANSACT )
|
||||||
|
|
Loading…
Reference in New Issue