msi: Move database initialization to a separate function.

This commit is contained in:
Hans Leidekker 2010-08-27 10:50:35 +02:00 committed by Alexandre Julliard
parent eef54ffe6b
commit dd7514a38d
1 changed files with 51 additions and 28 deletions

View File

@ -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 )