typedef struct tabSTORAGE
{
UINT str_index;
- LPWSTR name;
IStorage *storage;
} STORAGE;
return TRUE;
}
-static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPWSTR name, IStorage *stg)
+static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPCWSTR name, IStorage *stg)
{
STORAGE *storage;
if (!storage)
return NULL;
- storage->name = strdupW(name);
- if (!storage->name)
- {
- msi_free(storage);
- return NULL;
- }
-
- storage->str_index = msi_addstringW(sv->db->strings, 0, storage->name, -1, 1, StringNonPersistent);
+ storage->str_index = msi_addstringW(sv->db->strings, name, -1, 1, StringNonPersistent);
storage->storage = stg;
if (storage->storage)
static HRESULT stream_to_storage(IStream *stm, IStorage **stg)
{
- ILockBytes *lockbytes;
+ ILockBytes *lockbytes = NULL;
STATSTG stat;
LPVOID data;
HRESULT hr;
done:
msi_free(data);
- ILockBytes_Release(lockbytes);
+ if (lockbytes) ILockBytes_Release(lockbytes);
return hr;
}
static UINT STORAGES_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask)
{
MSISTORAGESVIEW *sv = (MSISTORAGESVIEW *)view;
- IStorage *stg, *substg;
+ IStorage *stg, *substg = NULL;
IStream *stm;
LPWSTR name = NULL;
HRESULT hr;
done:
msi_free(name);
- IStorage_Release(substg);
+ if (substg) IStorage_Release(substg);
IStorage_Release(stg);
IStream_Release(stm);
return r;
}
-static UINT STORAGES_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, BOOL temporary)
+static UINT STORAGES_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary)
{
MSISTORAGESVIEW *sv = (MSISTORAGESVIEW *)view;
if (!storages_set_table_size(sv, ++sv->num_rows))
return ERROR_FUNCTION_FAILED;
- return STORAGES_set_row(view, sv->num_rows - 1, rec, 0);
+ if (row == -1)
+ row = sv->num_rows - 1;
+
+ /* FIXME have to readjust rows */
+
+ return STORAGES_set_row(view, row, rec, 0);
}
static UINT STORAGES_delete_row(struct tagMSIVIEW *view, UINT row)
return ERROR_SUCCESS;
}
-static UINT STORAGES_get_column_info(struct tagMSIVIEW *view,
- UINT n, LPWSTR *name, UINT *type)
+static UINT STORAGES_get_column_info(struct tagMSIVIEW *view, UINT n,
+ LPWSTR *name, UINT *type, BOOL *temporary,
+ LPWSTR *table_name)
{
LPCWSTR name_ptr = NULL;
static const WCHAR Name[] = {'N','a','m','e',0};
static const WCHAR Data[] = {'D','a','t','a',0};
+ static const WCHAR _Storages[] = {'_','S','t','o','r','a','g','e','s',0};
- TRACE("(%p, %d, %p, %p)\n", view, n, name, type);
+ TRACE("(%p, %d, %p, %p, %p, %p)\n", view, n, name, type, temporary,
+ table_name);
if (n == 0 || n > NUM_STORAGES_COLS)
return ERROR_INVALID_PARAMETER;
if (!*name) return ERROR_FUNCTION_FAILED;
}
+ if (table_name)
+ {
+ *table_name = strdupW(_Storages);
+ if (!*table_name)
+ {
+ msi_free(name);
+ return ERROR_FUNCTION_FAILED;
+ }
+ }
+
+ if (temporary)
+ *temporary = FALSE;
+
return ERROR_SUCCESS;
}
static UINT storages_find_row(MSISTORAGESVIEW *sv, MSIRECORD *rec, UINT *row)
{
LPCWSTR str;
- UINT i, id, data;
+ UINT r, i, id, data;
str = MSI_RecordGetString(rec, 1);
- msi_string2idW(sv->db->strings, str, &id);
+ r = msi_string2idW(sv->db->strings, str, &id);
+ if (r != ERROR_SUCCESS)
+ return r;
for (i = 0; i < sv->num_rows; i++)
{
if (r == ERROR_SUCCESS)
return storages_modify_update(view, rec);
- return STORAGES_insert_row(view, rec, FALSE);
+ return STORAGES_insert_row(view, rec, -1, FALSE);
}
static UINT STORAGES_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
break;
case MSIMODIFY_INSERT:
- r = STORAGES_insert_row(view, rec, FALSE);
+ r = STORAGES_insert_row(view, rec, -1, FALSE);
break;
case MSIMODIFY_UPDATE:
{
if (sv->storages[i]->storage)
IStorage_Release(sv->storages[i]->storage);
-
msi_free(sv->storages[i]);
}
msi_free(sv->storages);
sv->storages = NULL;
+ msi_free(sv);
return ERROR_SUCCESS;
}
UINT val, UINT *row, MSIITERHANDLE *handle)
{
MSISTORAGESVIEW *sv = (MSISTORAGESVIEW *)view;
- UINT index = (UINT)*handle;
+ UINT index = PtrToUlong(*handle);
TRACE("(%d, %d): %d\n", *row, col, val);
index++;
}
- *handle = (MSIITERHANDLE)++index;
+ *handle = UlongToPtr(++index);
if (index >= sv->num_rows)
return ERROR_NO_MORE_ITEMS;
NULL,
NULL,
NULL,
+ NULL,
};
static INT add_storages_to_table(MSISTORAGESVIEW *sv)
rows = add_storages_to_table(sv);
if (rows < 0)
+ {
+ msi_free( sv );
return ERROR_FUNCTION_FAILED;
-
+ }
sv->num_rows = rows;
*view = (MSIVIEW *)sv;