msi: Use MSI_QueryGetRecord in ACTION_AppSearchDr.

This commit is contained in:
Mike McCormack 2006-11-28 17:46:05 +09:00 committed by Alexandre Julliard
parent e864f2f2c3
commit a0d0453501
1 changed files with 54 additions and 71 deletions

View File

@ -775,87 +775,70 @@ static UINT ACTION_SearchDirectory(MSIPACKAGE *package, MSISIGNATURE *sig,
static UINT ACTION_AppSearchSigName(MSIPACKAGE *package, LPCWSTR sigName, static UINT ACTION_AppSearchSigName(MSIPACKAGE *package, LPCWSTR sigName,
MSISIGNATURE *sig, LPWSTR *appValue); MSISIGNATURE *sig, LPWSTR *appValue);
static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig)
MSISIGNATURE *sig)
{ {
MSIQUERY *view; static const WCHAR query[] = {
's','e','l','e','c','t',' ','*',' ',
'f','r','o','m',' ',
'D','r','L','o','c','a','t','o','r',' ',
'w','h','e','r','e',' ',
'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0};
LPWSTR parentName = NULL, path = NULL, parent = NULL;
WCHAR expanded[MAX_PATH];
MSIRECORD *row;
int depth;
UINT rc; UINT rc;
static const WCHAR ExecSeqQuery[] = {
's','e','l','e','c','t',' ','*',' ',
'f','r','o','m',' ',
'D','r','L','o','c','a','t','o','r',' ',
'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e','_',' ','=',' ',
'\'','%','s','\'',0};
TRACE("(package %p, sig %p)\n", package, sig); TRACE("%s\n", debugstr_w(sig->Name));
rc = MSI_OpenQuery(package->db, &view, ExecSeqQuery, sig->Name);
if (rc == ERROR_SUCCESS) *appValue = NULL;
row = MSI_QueryGetRecord( package->db, query, sig->Name );
if (!row)
{ {
MSIRECORD *row = 0; TRACE("failed to query DrLocator for %s\n", debugstr_w(sig->Name));
WCHAR expanded[MAX_PATH]; return ERROR_SUCCESS;
LPWSTR parentName = NULL, path = NULL, parent = NULL; }
int depth;
rc = MSI_ViewExecute(view, 0); /* check whether parent is set */
if (rc != ERROR_SUCCESS) parentName = msi_dup_record_field(row,2);
if (parentName)
{
MSISIGNATURE parentSig;
rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent);
ACTION_FreeSignature(&parentSig);
msi_free(parentName);
}
/* now look for path */
path = msi_dup_record_field(row,3);
if (MSI_RecordIsNull(row,4))
depth = 0;
else
depth = MSI_RecordGetInteger(row,4);
ACTION_ExpandAnyPath(package, path, expanded, MAX_PATH);
msi_free(path);
if (parent)
{
path = msi_alloc((strlenW(parent) + strlenW(expanded) + 1) * sizeof(WCHAR));
if (!path)
{ {
TRACE("MSI_ViewExecute returned %d\n", rc); rc = ERROR_OUTOFMEMORY;
goto end; goto end;
} }
rc = MSI_ViewFetch(view,&row); strcpyW(path, parent);
if (rc != ERROR_SUCCESS) strcatW(path, expanded);
{
TRACE("MSI_ViewFetch returned %d\n", rc);
rc = ERROR_SUCCESS;
goto end;
}
/* check whether parent is set */
parentName = msi_dup_record_field(row,2);
if (parentName)
{
MSISIGNATURE parentSig;
rc = ACTION_AppSearchSigName(package, parentName, &parentSig,
&parent);
ACTION_FreeSignature(&parentSig);
msi_free(parentName);
}
/* now look for path */
path = msi_dup_record_field(row,3);
if (MSI_RecordIsNull(row,4))
depth = 0;
else
depth = MSI_RecordGetInteger(row,4);
ACTION_ExpandAnyPath(package, path, expanded,
sizeof(expanded) / sizeof(expanded[0]));
msi_free(path);
if (parent)
{
path = msi_alloc((strlenW(parent) + strlenW(expanded) + 1) * sizeof(WCHAR));
if (!path)
goto end;
strcpyW(path, parent);
strcatW(path, expanded);
}
else
path = expanded;
rc = ACTION_SearchDirectory(package, sig, path, depth, appValue);
end:
if (path != expanded)
msi_free(path);
msi_free(parent);
if (row)
msiobj_release(&row->hdr);
MSI_ViewClose(view);
msiobj_release(&view->hdr);
} }
else else
{ path = expanded;
TRACE("MSI_OpenQuery returned %d\n", rc);
rc = ERROR_SUCCESS; rc = ACTION_SearchDirectory(package, sig, path, depth, appValue);
}
end:
if (path != expanded)
msi_free(path);
msi_free(parent);
msiobj_release(&row->hdr);
TRACE("returning %d\n", rc); TRACE("returning %d\n", rc);
return rc; return rc;