msi: Actually delete the row data instead of blanking it out.
This commit is contained in:
parent
419a8a2426
commit
4b75f33012
|
@ -77,7 +77,6 @@ static UINT DELETE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
|
||||||
{
|
{
|
||||||
MSIDELETEVIEW *dv = (MSIDELETEVIEW*)view;
|
MSIDELETEVIEW *dv = (MSIDELETEVIEW*)view;
|
||||||
UINT r, i, rows = 0, cols = 0;
|
UINT r, i, rows = 0, cols = 0;
|
||||||
MSIRECORD *empty;
|
|
||||||
|
|
||||||
TRACE("%p %p\n", dv, record);
|
TRACE("%p %p\n", dv, record);
|
||||||
|
|
||||||
|
@ -92,17 +91,11 @@ static UINT DELETE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
|
||||||
if( r != ERROR_SUCCESS )
|
if( r != ERROR_SUCCESS )
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
TRACE("blanking %d rows\n", rows);
|
TRACE("deleting %d rows\n", rows);
|
||||||
|
|
||||||
empty = MSI_CreateRecord( cols );
|
|
||||||
if (!empty)
|
|
||||||
return ERROR_FUNCTION_FAILED;
|
|
||||||
|
|
||||||
/* blank out all the rows that match */
|
/* blank out all the rows that match */
|
||||||
for ( i=0; i<rows; i++ )
|
for ( i=0; i<rows; i++ )
|
||||||
dv->table->ops->set_row( dv->table, i, empty, (1<<cols)-1 );
|
dv->table->ops->delete_row( dv->table, i );
|
||||||
|
|
||||||
msiobj_release( &empty->hdr );
|
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1572,6 +1572,13 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row )
|
||||||
data = tv->table->nonpersistent_data;
|
data = tv->table->nonpersistent_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reset the hash tables */
|
||||||
|
for (i = 0; i < tv->num_cols; i++)
|
||||||
|
{
|
||||||
|
msi_free( tv->columns[i].hash_table );
|
||||||
|
tv->columns[i].hash_table = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if ( row == num_rows - 1 )
|
if ( row == num_rows - 1 )
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
|
|
|
@ -4991,7 +4991,7 @@ static void test_viewmodify_delete_temporary(void)
|
||||||
DeleteFileA(msifile);
|
DeleteFileA(msifile);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_msidatabasecommit()
|
static void test_deleterow()
|
||||||
{
|
{
|
||||||
MSIHANDLE hdb, hview, hrec;
|
MSIHANDLE hdb, hview, hrec;
|
||||||
const char *query;
|
const char *query;
|
||||||
|
@ -5040,18 +5040,12 @@ static void test_msidatabasecommit()
|
||||||
size = MAX_PATH;
|
size = MAX_PATH;
|
||||||
r = MsiRecordGetStringA(hrec, 1, buf, &size);
|
r = MsiRecordGetStringA(hrec, 1, buf, &size);
|
||||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
todo_wine
|
ok(!lstrcmpA(buf, "two"), "Expected two, got %s\n", buf);
|
||||||
{
|
|
||||||
ok(!lstrcmpA(buf, "two"), "Expected two, got %s\n", buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
MsiCloseHandle(hrec);
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
r = MsiViewFetch(hview, &hrec);
|
r = MsiViewFetch(hview, &hrec);
|
||||||
todo_wine
|
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
||||||
{
|
|
||||||
ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r);
|
|
||||||
}
|
|
||||||
|
|
||||||
MsiViewClose(hview);
|
MsiViewClose(hview);
|
||||||
MsiCloseHandle(hview);
|
MsiCloseHandle(hview);
|
||||||
|
@ -5089,5 +5083,5 @@ START_TEST(db)
|
||||||
test_defaultdatabase();
|
test_defaultdatabase();
|
||||||
test_order();
|
test_order();
|
||||||
test_viewmodify_delete_temporary();
|
test_viewmodify_delete_temporary();
|
||||||
test_msidatabasecommit();
|
test_deleterow();
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,6 +200,26 @@ static UINT WHERE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
|
||||||
return wv->table->ops->set_row( wv->table, row, rec, mask );
|
return wv->table->ops->set_row( wv->table, row, rec, mask );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT WHERE_delete_row(struct tagMSIVIEW *view, UINT row)
|
||||||
|
{
|
||||||
|
MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view;
|
||||||
|
UINT r;
|
||||||
|
|
||||||
|
TRACE("(%p %d)\n", view, row);
|
||||||
|
|
||||||
|
if ( !wv->table )
|
||||||
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
|
if ( row > wv->row_count )
|
||||||
|
return ERROR_NO_MORE_ITEMS;
|
||||||
|
|
||||||
|
r = find_entry_in_hash( wv->reorder, row, &row );
|
||||||
|
if ( r != ERROR_SUCCESS )
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return wv->table->ops->delete_row( wv->table, row );
|
||||||
|
}
|
||||||
|
|
||||||
static INT INT_evaluate_binary( INT lval, UINT op, INT rval )
|
static INT INT_evaluate_binary( INT lval, UINT op, INT rval )
|
||||||
{
|
{
|
||||||
switch( op )
|
switch( op )
|
||||||
|
@ -549,7 +569,7 @@ static const MSIVIEWOPS where_ops =
|
||||||
WHERE_get_row,
|
WHERE_get_row,
|
||||||
WHERE_set_row,
|
WHERE_set_row,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
WHERE_delete_row,
|
||||||
WHERE_execute,
|
WHERE_execute,
|
||||||
WHERE_close,
|
WHERE_close,
|
||||||
WHERE_get_dimensions,
|
WHERE_get_dimensions,
|
||||||
|
|
Loading…
Reference in New Issue