msi: Implement the MSIMODIFY_ASSIGN action of MsiViewModify for the streams table.

This commit is contained in:
James Hawkins 2008-02-04 11:28:36 -06:00 committed by Alexandre Julliard
parent 56574c7c6e
commit 146e34e662
1 changed files with 74 additions and 15 deletions

View File

@ -54,9 +54,9 @@ typedef struct tagMSISTREAMSVIEW
UINT row_size; UINT row_size;
} MSISTREAMSVIEW; } MSISTREAMSVIEW;
static BOOL add_stream_to_table(MSISTREAMSVIEW *sv, STREAM *stream, int index) static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, int size)
{ {
if (index >= sv->max_streams) if (size >= sv->max_streams)
{ {
sv->max_streams *= 2; sv->max_streams *= 2;
sv->streams = msi_realloc(sv->streams, sv->max_streams * sizeof(STREAM *)); sv->streams = msi_realloc(sv->streams, sv->max_streams * sizeof(STREAM *));
@ -64,7 +64,6 @@ static BOOL add_stream_to_table(MSISTREAMSVIEW *sv, STREAM *stream, int index)
return FALSE; return FALSE;
} }
sv->streams[index] = stream;
return TRUE; return TRUE;
} }
@ -139,12 +138,6 @@ static UINT STREAMS_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec
} }
static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask) static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask)
{
FIXME("(%p, %d, %p, %d): stub!\n", view, row, rec, mask);
return ERROR_SUCCESS;
}
static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, BOOL temporary)
{ {
MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view; MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
STREAM *stream; STREAM *stream;
@ -156,7 +149,10 @@ static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, BOOL tem
ULONG count; ULONG count;
UINT r = ERROR_FUNCTION_FAILED; UINT r = ERROR_FUNCTION_FAILED;
TRACE("(%p, %p, %d)\n", view, rec, temporary); TRACE("(%p, %p)\n", view, rec);
if (row > sv->num_rows)
return ERROR_FUNCTION_FAILED;
r = MSI_RecordGetIStream(rec, 2, &stm); r = MSI_RecordGetIStream(rec, 2, &stm);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
@ -201,8 +197,7 @@ static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, BOOL tem
IStorage_OpenStream(sv->db->storage, name, 0, IStorage_OpenStream(sv->db->storage, name, 0,
STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
if (!add_stream_to_table(sv, stream, sv->num_rows++)) sv->streams[row] = stream;
goto done;
done: done:
msi_free(name); msi_free(name);
@ -213,6 +208,16 @@ done:
return r; return r;
} }
static UINT STREAMS_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, BOOL temporary)
{
MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
if (!streams_set_table_size(sv, ++sv->num_rows))
return ERROR_FUNCTION_FAILED;
return STREAMS_set_row(view, sv->num_rows - 1, rec, 0);
}
static UINT STREAMS_delete_row(struct tagMSIVIEW *view, UINT row) static UINT STREAMS_delete_row(struct tagMSIVIEW *view, UINT row)
{ {
FIXME("(%p %d): stub!\n", view, row); FIXME("(%p %d): stub!\n", view, row);
@ -278,6 +283,52 @@ static UINT STREAMS_get_column_info(struct tagMSIVIEW *view,
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
static UINT streams_find_row(MSISTREAMSVIEW *sv, MSIRECORD *rec, UINT *row)
{
LPCWSTR str;
UINT i, id, data;
str = MSI_RecordGetString(rec, 1);
msi_string2idW(sv->db->strings, str, &id);
for (i = 0; i < sv->num_rows; i++)
{
STREAMS_fetch_int(&sv->view, i, 1, &data);
if (data == id)
{
*row = i;
return ERROR_SUCCESS;
}
}
return ERROR_FUNCTION_FAILED;
}
static UINT streams_modify_update(struct tagMSIVIEW *view, MSIRECORD *rec)
{
MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
UINT r, row;
r = streams_find_row(sv, rec, &row);
if (r != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
return STREAMS_set_row(view, row, rec, 0);
}
static UINT streams_modify_assign(struct tagMSIVIEW *view, MSIRECORD *rec)
{
MSISTREAMSVIEW *sv = (MSISTREAMSVIEW *)view;
UINT r, row;
r = streams_find_row(sv, rec, &row);
if (r == ERROR_SUCCESS)
return streams_modify_update(view, rec);
return STREAMS_insert_row(view, rec, FALSE);
}
static UINT STREAMS_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row) static UINT STREAMS_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
{ {
UINT r; UINT r;
@ -286,15 +337,21 @@ static UINT STREAMS_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRE
switch (eModifyMode) switch (eModifyMode)
{ {
case MSIMODIFY_ASSIGN:
r = streams_modify_assign(view, rec);
break;
case MSIMODIFY_INSERT: case MSIMODIFY_INSERT:
r = STREAMS_insert_row(view, rec, FALSE); r = STREAMS_insert_row(view, rec, FALSE);
break; break;
case MSIMODIFY_UPDATE:
r = streams_modify_update(view, rec);
break;
case MSIMODIFY_VALIDATE_NEW: case MSIMODIFY_VALIDATE_NEW:
case MSIMODIFY_INSERT_TEMPORARY: case MSIMODIFY_INSERT_TEMPORARY:
case MSIMODIFY_UPDATE:
case MSIMODIFY_REFRESH: case MSIMODIFY_REFRESH:
case MSIMODIFY_ASSIGN:
case MSIMODIFY_REPLACE: case MSIMODIFY_REPLACE:
case MSIMODIFY_MERGE: case MSIMODIFY_MERGE:
case MSIMODIFY_DELETE: case MSIMODIFY_DELETE:
@ -425,11 +482,13 @@ static UINT add_streams_to_table(MSISTREAMSVIEW *sv)
STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream); STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
CoTaskMemFree(stat.pwcsName); CoTaskMemFree(stat.pwcsName);
if (!add_stream_to_table(sv, stream, count++)) if (!streams_set_table_size(sv, ++count))
{ {
count = -1; count = -1;
break; break;
} }
sv->streams[count - 1] = stream;
} }
IEnumSTATSTG_Release(stgenum); IEnumSTATSTG_Release(stgenum);