Rework component, feature and file loading to use MSI_IterateRecords.

This commit is contained in:
Aric Stewart 2005-06-23 16:43:24 +00:00 committed by Alexandre Julliard
parent c883a44257
commit 04598248af
1 changed files with 75 additions and 117 deletions

View File

@ -1016,8 +1016,68 @@ static int load_component(MSIPACKAGE* package, MSIRECORD * row)
return index;
}
static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
typedef struct {
MSIPACKAGE *package;
INT index;
INT cnt;
} _ilfs;
static UINT iterate_component_check(MSIRECORD *row, LPVOID param)
{
_ilfs* ilfs= (_ilfs*)param;
INT c_indx;
c_indx = load_component(ilfs->package,row);
ilfs->package->features[ilfs->index].Components[ilfs->cnt] = c_indx;
ilfs->package->features[ilfs->index].ComponentCount ++;
TRACE("Loaded new component to index %i\n",c_indx);
return ERROR_SUCCESS;
}
static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param)
{
_ilfs* ilfs= (_ilfs*)param;
LPCWSTR component;
DWORD rc;
INT c_indx;
INT cnt = ilfs->package->features[ilfs->index].ComponentCount;
MSIQUERY * view;
static const WCHAR Query[] =
{'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ',
'`','C','o','m','p','o','n','e','n','t','`',' ',
'W','H','E','R','E',' ',
'`','C','o','m','p','o','n','e','n','t','`',' ',
'=','\'','%','s','\'',0};
component = MSI_RecordGetString(row,1);
/* check to see if the component is already loaded */
c_indx = get_loaded_component(ilfs->package,component);
if (c_indx != -1)
{
TRACE("Component %s already loaded at %i\n", debugstr_w(component),
c_indx);
ilfs->package->features[ilfs->index].Components[cnt] = c_indx;
ilfs->package->features[ilfs->index].ComponentCount ++;
return ERROR_SUCCESS;
}
rc = MSI_OpenQuery(ilfs->package->db, &view, Query, component);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
ilfs->cnt = cnt;
rc = MSI_IterateRecords(view, NULL, iterate_component_check, ilfs);
msiobj_release( &view->hdr );
return ERROR_SUCCESS;
}
static UINT load_feature(MSIRECORD * row, LPVOID param)
{
MSIPACKAGE* package = (MSIPACKAGE*)param;
int index = package->loaded_features;
DWORD sz;
static const WCHAR Query1[] =
@ -1027,17 +1087,12 @@ static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
'C','o','m','p','o','n','e','n','t','s','`',' ',
'W','H','E','R','E',' ',
'`','F','e', 'a','t','u','r','e','_','`',' ','=','\'','%','s','\'',0};
static const WCHAR Query2[] =
{'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ',
'`','C','o','m','p','o','n','e','n','t','`',' ',
'W','H','E','R','E',' ',
'`','C','o','m','p','o','n','e','n','t','`',' ',
'=','\'','%','s','\'',0};
MSIQUERY * view;
MSIQUERY * view2;
MSIRECORD * row2;
MSIRECORD * row3;
UINT rc;
_ilfs ilfs;
ilfs.package = package;
ilfs.index = index;
/* fill in the data */
@ -1084,79 +1139,20 @@ static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
/* load feature components */
rc = MSI_OpenQuery(package->db, &view, Query1, package->features[index].Feature);
rc = MSI_OpenQuery(package->db, &view, Query1,
package->features[index].Feature);
if (rc != ERROR_SUCCESS)
return;
rc = MSI_ViewExecute(view,0);
if (rc != ERROR_SUCCESS)
{
MSI_ViewClose(view);
return ERROR_SUCCESS;
MSI_IterateRecords(view, NULL, iterate_load_featurecomponents , &ilfs);
msiobj_release(&view->hdr);
return;
return ERROR_SUCCESS;
}
while (1)
{
LPCWSTR component;
DWORD rc;
INT c_indx;
INT cnt = package->features[index].ComponentCount;
rc = MSI_ViewFetch(view,&row2);
if (rc != ERROR_SUCCESS)
break;
component = MSI_RecordGetString(row2,1);
/* check to see if the component is already loaded */
c_indx = get_loaded_component(package,component);
if (c_indx != -1)
{
TRACE("Component %s already loaded at %i\n", debugstr_w(component),
c_indx);
package->features[index].Components[cnt] = c_indx;
package->features[index].ComponentCount ++;
msiobj_release( &row2->hdr );
continue;
}
rc = MSI_OpenQuery(package->db, &view2, Query2, component);
if (rc != ERROR_SUCCESS)
{
msiobj_release( &row2->hdr );
continue;
}
rc = MSI_ViewExecute(view2,0);
if (rc != ERROR_SUCCESS)
{
msiobj_release( &row2->hdr );
MSI_ViewClose(view2);
msiobj_release( &view2->hdr );
continue;
}
while (1)
{
DWORD rc;
rc = MSI_ViewFetch(view2,&row3);
if (rc != ERROR_SUCCESS)
break;
c_indx = load_component(package,row3);
msiobj_release( &row3->hdr );
package->features[index].Components[cnt] = c_indx;
package->features[index].ComponentCount ++;
TRACE("Loaded new component to index %i\n",c_indx);
}
MSI_ViewClose(view2);
msiobj_release( &view2->hdr );
msiobj_release( &row2->hdr );
}
MSI_ViewClose(view);
msiobj_release(&view->hdr);
}
static UINT load_file(MSIPACKAGE* package, MSIRECORD * row)
static UINT load_file(MSIRECORD *row, LPVOID param)
{
MSIPACKAGE* package = (MSIPACKAGE*)param;
DWORD index = package->loaded_files;
LPCWSTR component;
@ -1203,7 +1199,6 @@ static UINT load_file(MSIPACKAGE* package, MSIRECORD * row)
static UINT load_all_files(MSIPACKAGE *package)
{
MSIQUERY * view;
MSIRECORD * row;
UINT rc;
static const WCHAR Query[] =
{'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@ -1217,26 +1212,7 @@ static UINT load_all_files(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
MSI_ViewClose(view);
msiobj_release(&view->hdr);
return ERROR_SUCCESS;
}
while (1)
{
rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
break;
}
load_file(package,row);
msiobj_release(&row->hdr);
}
MSI_ViewClose(view);
rc = MSI_IterateRecords(view, NULL, load_file, package);
msiobj_release(&view->hdr);
return ERROR_SUCCESS;
@ -1259,7 +1235,6 @@ static UINT load_all_files(MSIPACKAGE *package)
static UINT ACTION_CostInitialize(MSIPACKAGE *package)
{
MSIQUERY * view;
MSIRECORD * row;
UINT rc;
static const WCHAR Query_all[] =
{'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@ -1280,25 +1255,8 @@ static UINT ACTION_CostInitialize(MSIPACKAGE *package)
rc = MSI_DatabaseOpenViewW(package->db,Query_all,&view);
if (rc != ERROR_SUCCESS)
return rc;
rc = MSI_ViewExecute(view,0);
if (rc != ERROR_SUCCESS)
{
MSI_ViewClose(view);
msiobj_release(&view->hdr);
return rc;
}
while (1)
{
DWORD rc;
rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
break;
load_feature(package,row);
msiobj_release(&row->hdr);
}
MSI_ViewClose(view);
rc = MSI_IterateRecords(view, NULL, load_feature, package);
msiobj_release(&view->hdr);
load_all_files(package);