diff options
-rw-r--r-- | include/libmsi-database.h | 5 | ||||
-rw-r--r-- | libmsi/libmsi-database.c | 16 | ||||
-rw-r--r-- | tests/testdatabase.c | 32 | ||||
-rw-r--r-- | tools/msibuild.c | 19 |
4 files changed, 43 insertions, 29 deletions
diff --git a/include/libmsi-database.h b/include/libmsi-database.h index c3f4a99..bd1e5f3 100644 --- a/include/libmsi-database.h +++ b/include/libmsi-database.h @@ -57,7 +57,10 @@ gboolean libmsi_database_export (LibmsiDatabase *db, const char *table, int fd, GError **error); -LibmsiResult libmsi_database_import (LibmsiDatabase *, const char *, const char *); +gboolean libmsi_database_import (LibmsiDatabase *db, + const char *folder, + const char *filename, + GError **error); LibmsiCondition libmsi_database_is_table_persistent (LibmsiDatabase *, const char *); LibmsiResult libmsi_database_merge (LibmsiDatabase *, LibmsiDatabase *, const char *); LibmsiResult libmsi_database_get_summary_info (LibmsiDatabase *, unsigned, LibmsiSummaryInfo **); diff --git a/libmsi/libmsi-database.c b/libmsi/libmsi-database.c index 33e0702..70d39b9 100644 --- a/libmsi/libmsi-database.c +++ b/libmsi/libmsi-database.c @@ -1200,19 +1200,27 @@ done: return r; } -LibmsiResult libmsi_database_import(LibmsiDatabase *db, const char *szFolder, const char *szFilename) +gboolean +libmsi_database_import (LibmsiDatabase *db, + const char *folder, + const char *filename, + GError **error) { unsigned r; - TRACE("%x %s %s\n",db,debugstr_a(szFolder), debugstr_a(szFilename)); + TRACE("%x %s %s\n",db,debugstr_a(folder), debugstr_a(filename)); if( !db ) return LIBMSI_RESULT_INVALID_HANDLE; g_object_ref(db); - r = _libmsi_database_import( db, szFolder, szFilename ); + r = _libmsi_database_import(db, folder, filename); g_object_unref(db); - return r; + + if (r != LIBMSI_RESULT_SUCCESS) + g_set_error (error, LIBMSI_RESULT_ERROR, r, G_STRFUNC); + + return r == LIBMSI_RESULT_SUCCESS; } static unsigned msi_export_record( int fd, LibmsiRecord *row, unsigned start ) diff --git a/tests/testdatabase.c b/tests/testdatabase.c index abc2d30..8386dbf 100644 --- a/tests/testdatabase.c +++ b/tests/testdatabase.c @@ -1689,10 +1689,14 @@ static void write_file(const char *filename, const char *data, int data_size) static unsigned add_table_to_db(LibmsiDatabase *hdb, const char *table_data) { - unsigned r; + GError *err = NULL; + unsigned r = LIBMSI_RESULT_SUCCESS; write_file("temp_file", table_data, (strlen(table_data) - 1) * sizeof(char)); - r = libmsi_database_import(hdb, CURR_DIR, "temp_file"); + if (!libmsi_database_import(hdb, CURR_DIR, "temp_file", &err)) + r = err->code; + + g_clear_error(&err); unlink("temp_file"); return r; @@ -2024,8 +2028,8 @@ static void test_binary_import(void) hdb = libmsi_database_new(msifile, LIBMSI_DB_OPEN_CREATE, NULL); ok(hdb , "Failed to open database\n"); - r = libmsi_database_import(hdb, CURR_DIR, "bin_import.idt"); - ok(r == LIBMSI_RESULT_SUCCESS , "Failed to import Binary table\n"); + r = libmsi_database_import(hdb, CURR_DIR, "bin_import.idt", NULL); + ok(r , "Failed to import Binary table\n"); /* read file from the Binary table */ sql = "SELECT * FROM `Binary`"; @@ -5253,8 +5257,8 @@ static void test_quotes(void) write_file("import.idt", import_dat, (sizeof(import_dat) - 1) * sizeof(char)); - r = libmsi_database_import(hdb, CURR_DIR, "import.idt"); - ok(r == LIBMSI_RESULT_SUCCESS, "Expected LIBMSI_RESULT_SUCCESS, got %d\n", r); + r = libmsi_database_import(hdb, CURR_DIR, "import.idt", NULL); + ok(r, "libmsi_database_import() failed\n"); unlink("import.idt"); @@ -5679,8 +5683,8 @@ static void test_forcecodepage(void) create_file_data("forcecodepage.idt", "\r\n\r\n850\t_ForceCodepage\r\n", 0); - r = libmsi_database_import(hdb, CURR_DIR, "forcecodepage.idt"); - ok(r == LIBMSI_RESULT_SUCCESS, "Expected LIBMSI_RESULT_SUCCESS, got %d\n", r); + r = libmsi_database_import(hdb, CURR_DIR, "forcecodepage.idt", NULL); + ok(r, "libmsi_database_import() failed\n"); fd = open("forcecodepage.idt", O_WRONLY | O_BINARY | O_CREAT, 0644); ok(fd != -1, "cannot open file\n"); @@ -5695,8 +5699,8 @@ static void test_forcecodepage(void) create_file_data("forcecodepage.idt", "\r\n\r\n9999\t_ForceCodepage\r\n", 0); - r = libmsi_database_import(hdb, CURR_DIR, "forcecodepage.idt"); - ok(r == LIBMSI_RESULT_FUNCTION_FAILED, "Expected LIBMSI_RESULT_FUNCTION_FAILED, got %d\n", r); + r = libmsi_database_import(hdb, CURR_DIR, "forcecodepage.idt", NULL); + ok(!r, "Expected failure\n"); g_object_unref(hdb); unlink(msifile); @@ -6477,8 +6481,8 @@ static void test_dbmerge(void) create_file_data("codepage.idt", "\r\n\r\n850\t_ForceCodepage\r\n", 0); - r = libmsi_database_import(hdb, CURR_DIR, "codepage.idt"); - ok(r == LIBMSI_RESULT_SUCCESS, "Expected LIBMSI_RESULT_SUCCESS, got %d\n", r); + r = libmsi_database_import(hdb, CURR_DIR, "codepage.idt", NULL); + ok(r, "libmsi_database_import() failed\n"); sql = "DROP TABLE `One`"; r = run_query(hdb, 0, sql); @@ -7261,8 +7265,8 @@ static void test_embedded_nulls(void) ok(hdb, "failed to open database %u\n", r ); write_file( "temp_file", control_table, sizeof(control_table) ); - r = libmsi_database_import( hdb, CURR_DIR, "temp_file" ); - ok( r == LIBMSI_RESULT_SUCCESS, "failed to import table %u\n", r ); + r = libmsi_database_import( hdb, CURR_DIR, "temp_file", NULL); + ok(r, "libmsi_database_import() failed\n"); unlink( "temp_file" ); r = do_query( hdb, "SELECT `Text` FROM `Control` WHERE `Dialog` = 'LicenseAgreementDlg'", &hrec ); diff --git a/tools/msibuild.c b/tools/msibuild.c index 51e27be..50cbd6a 100644 --- a/tools/msibuild.c +++ b/tools/msibuild.c @@ -129,21 +129,21 @@ static LibmsiResult open_database(const char *msifile, LibmsiDatabase **db, static LibmsiDatabase *db; static LibmsiSummaryInfo *si; -static int import_table(char *table) +static gboolean import_table(char *table, GError **error) { - LibmsiResult r; + gboolean success = TRUE; char dir[PATH_MAX]; if (getcwd(dir, PATH_MAX) == NULL) return 1; - r = libmsi_database_import(db, dir, table); - if (r != LIBMSI_RESULT_SUCCESS) + if (!libmsi_database_import(db, dir, table, error)) { - fprintf(stderr, "failed to import table %s (%u)\n", table, r); + fprintf(stderr, "failed to import table %s\n", table); + success = FALSE; } - return (r != LIBMSI_RESULT_SUCCESS); + return success; } static gboolean add_summary_info(const char *name, const char *author, @@ -249,7 +249,7 @@ static void show_usage(void) int main(int argc, char *argv[]) { GError *error = NULL; - int r; + int r = LIBMSI_RESULT_SUCCESS; int n; g_type_init(); @@ -293,10 +293,9 @@ int main(int argc, char *argv[]) break; case 'i': do { - ret = import_table(argv[1]); - if (ret) { + if (!import_table(argv[1], &error)) break; - } + argc--, argv++; } while (argv[1] && argv[1][0] != '-'); argc--, argv++; |