static void test_MsiOpenDatabase( void ) { UINT r; MSIHANDLE hdb; r = MsiOpenDatabase( mspfile, MSIDBOPEN_CREATE, &hdb ); ok(r == ERROR_SUCCESS, "failed to open database %u\n", r); r = MsiDatabaseCommit( hdb ); ok(r == ERROR_SUCCESS, "failed to commit database %u\n", r); MsiCloseHandle( hdb ); r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); ok(r == ERROR_OPEN_FAILED, "expected ERROR_OPEN_FAILED, got %u\n", r); DeleteFileA( mspfile ); r = MsiOpenDatabase( mspfile, MSIDBOPEN_CREATE + MSIDBOPEN_PATCHFILE, &hdb ); ok(r == ERROR_SUCCESS , "failed to open database %u\n", r); r = MsiDatabaseCommit( hdb ); ok(r == ERROR_SUCCESS, "failed to commit database %u\n", r); MsiCloseHandle( hdb ); r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); ok(r == ERROR_SUCCESS, "failed to open database %u\n", r); MsiCloseHandle( hdb ); DeleteFileA( mspfile ); create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); create_patch( mspfile ); r = MsiOpenDatabase( msifile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); ok(r == ERROR_OPEN_FAILED, "failed to open database %u\n", r ); r = MsiOpenDatabase( mspfile, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &hdb ); ok(r == ERROR_SUCCESS, "failed to open database %u\n", r ); MsiCloseHandle( hdb ); DeleteFileA( msifile ); DeleteFileA( mspfile ); }
int main(int ac, char** av) { if(ac != 2) { std::cout << "usage: " << av[0] << " <run number>" << std::endl; return 1; } // thomas's data size_t run_index = atoi(av[1]); real T_in_pipe[] = {152.9, 203.6, 415.1}; real T_in_head[] = {203.5, 291.8, 487.8}; real T_in_flux[] = {227.7, 315.7, 504.7}; real T_out_flux[] = {244.6, 346.9, 522.5}; real T_out_head[] = {250.8, 355.7, 538.0}; real T_out_pipe[] = {229.3, 332.6, 512.8}; real* T_ym = new real[3]; const char* prob_names[] = {"opt2_run1","opt2_run2","opt2_run3"}; // convert to kelvin for(size_t i = 0; i < 3; ++i) { T_in_pipe[i] += 273.15; T_in_head[i] += 273.15; T_in_flux[i] += 273.15; T_out_flux[i] += 273.15; T_out_head[i] += 273.15; T_out_pipe[i] += 273.15; T_ym[i] = (T_in_flux[i] + T_out_flux[i]) * 0.5; } // solve // dimensions real w_total = 6.00e-2; real w_irrad = 2.00e-2; real pipe = 6.35e-3; real l_total = 4.00e-2; real l_irrad = 2.00e-2; // calculations real l_1 = (l_total - l_irrad) / 2.0; real l_3 = l_irrad - pipe * 2.0; real w_ends = (w_total - w_irrad) / 2.0; real w_1 = (w_ends - pipe) / 2.0; // lists auto xd = math::make_array_1<real,1>({0, w_1, pipe, w_1, w_irrad, w_1, pipe, w_1}); auto yd = math::make_array_1<real,1>({0, 1e-2, 5e-2}); auto zd = math::make_array_1<real,1>({0, l_1, pipe, l_3*0.5, l_3*0.5, pipe, l_1}); real nom_size = 5e-4; auto nx = xd->sub({1},{-1})->divide(nom_size)->ceil<size_t>(); auto ny = yd->sub({1},{-1})->divide(nom_size)->ceil<size_t>(); auto nz = zd->sub({1},{-1})->divide(nom_size)->ceil<size_t>(); auto x = xd->cumsum(); auto y = yd->cumsum(); auto z = zd->cumsum(); coor_type X({x,y,z}); cell_count_type n({nx,ny,nz}); //================================================================= real s = 1.0e10; //nx = [10, 10, 10, 50, 10, 10, 10]; //ny = [50, 50]; //nz = [10, 10, 30, 10, 10]; // the default boundary for solve source is const = 1.0 auto const_bou(std::make_shared<boundary_single>(1.0)); auto T_bou_i(std::make_shared<boundary_single>(T_in_pipe[run_index])); auto T_bou_o(std::make_shared<boundary_single>(T_out_pipe[run_index])); patch_v_bou_vec_type v_bou_s_def({ {{const_bou},{const_bou}}, {{const_bou},{const_bou}} }); patch_v_bou_vec_type v_bou_T_i({ {{T_bou_i},{T_bou_i}}, {{T_bou_i},{T_bou_i}} }); patch_v_bou_vec_type v_bou_T_o({ {{T_bou_o},{T_bou_o}}, {{T_bou_o},{T_bou_o}} }); patch_v_bou_type v_bou_def({{"s",v_bou_s_def}}); patch_v_bou_type v_bou_i({{"s",v_bou_s_def},{"T",v_bou_T_i}}); patch_v_bou_type v_bou_o({{"s",v_bou_s_def},{"T",v_bou_T_o}}); // create patch groups; point pt_xz( x->get(0), (y->get(0) + y->get(1)) / 2.0, (z->get(2) + z->get(3)) / 2.0); point pt_ym( (x->get(2) + x->get(5)) / 2.0, 0.0, z->get(3)); point pt_h_in( (x->get(3) + x->get(4)) / 2.0, y->get(1), (z->get(1) + z->get(2)) / 2.0); point pt_h_out( (x->get(3) + x->get(4)) / 2.0, y->get(1), (z->get(4) + z->get(5)) / 2.0); point pt_in( x->get(2), (y->get(1) + y->get(2)) / 2.0, (z->get(1) + z->get(2)) / 2.0); point pt_out( x->get(5), (y->get(1) + y->get(2)) / 2.0, (z->get(4) + z->get(5)) / 2.0); //============================================================== auto prob = std::make_shared<Prob>(prob_names[run_index], X, n, 2E4, 2E4); prob->create_equation("T", 10.0, 1.5, 1.5); prob->create_equation("s", 10.0, 1.5, 1.5); auto g_xyz = prob->create_patch_group("xyz", {{"T",0.0}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_xz); auto g_h_in = prob->create_patch_group("h_in", {{"T",0.0}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_h_in); auto g_h_out = prob->create_patch_group("h_out", {{"T",0.0}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_h_out); auto g_in = prob->create_patch_group("in", {{"T",0.0}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_in); auto g_out = prob->create_patch_group("out", {{"T",0.0}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_out); auto g_ym = prob->create_patch_group("out", {{"T",T_ym[run_index]}, {"s",2.0}}, {{"T",0.0},{"s",s}}, pt_ym); // create patches auto p_in_xm = g_in->create_patch("p_in_xm", -1, {1}, {1,2}, {1,2}, v_bou_i); auto p_in_xp = g_in->create_patch("p_in_xp", 1, {2}, {1,2}, {1,2}, v_bou_i); auto p_in_zm = g_in->create_patch("p_in_zm", -3, {1,2}, {1,2}, {1}, v_bou_i); auto p_in_zp = g_in->create_patch("p_in_zp", 3, {1,2}, {1,2}, {2}, v_bou_i); auto p_out_xm = g_out->create_patch("p_out_xm", -1, {5}, {1,2}, {4,5}, v_bou_o); auto p_out_xp = g_out->create_patch("p_out_xp", 1, {6}, {1,2}, {4,5}, v_bou_o); auto p_out_zm = g_out->create_patch("p_out_zm", -3, {5,6}, {1,2}, {4}, v_bou_o); auto p_out_zp = g_out->create_patch("p_out_zp", 3, {5,6}, {1,2}, {5}, v_bou_o); // ym auto p_ym_0_0 = g_ym->create_patch("p_ym_0_0", -2, {0,1,2,3}, {0}, {0,1}, v_bou_def); auto p_ym_0_1 = g_ym->create_patch("p_ym_0_1", -2, {0,1,2,3}, {0}, {1,2,3,4,5}, v_bou_def); auto p_ym_0_2 = g_ym->create_patch("p_ym_0_2", -2, {0,1,2,3}, {0}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}}, "s":{{1.0,1.0},{1.0,1.0}}}); auto p_ym_1_0 = g_ym->create_patch("p_ym_1_0", -2, {3,4}, {0}, {0,1}, v_bou_def); auto p_ym_1_1 = g_ym->create_patch("p_ym_1_1", -2, {3,4}, {0}, {1,2,3,4,5}, v_bou_def); auto p_ym_1_2 = g_ym->create_patch("p_ym_1_2", -2, {3,4}, {0}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,T_irr_zp}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_ym_2_0 = g_ym->create_patch("p_ym_2_0", -2, {4,5,6,7}, {0}, {0,1}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}}, "s":{{1.0,1.0},{1.0,1.0}}}); auto p_ym_2_1 = g_ym->create_patch("p_ym_2_1", -2, {4,5,6,7}, {0}, {1,2,3,4,5}, v_bou_def);// = {"T":{{0.0,T_irr_xp},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_ym_2_2 = g_ym->create_patch("p_ym_2_2", -2, {4,5,6,7}, {0}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}}, "s":{{1.0,1.0},{1.0,1.0}}}); // yp auto p_yp_0_0 = g_in->create_patch("p_yp_0_0", 2, {0,1,2,3}, {1}, {0,1}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_0_1_0 = g_in->create_patch("p_yp_0_1_0", 2, {0,1}, {1}, {1,2,3}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_0_1_1 = g_in->create_patch("p_yp_0_1_1", 2, {1,2}, {1}, {2,3}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_0_1_2 = g_in->create_patch("p_yp_0_1_2", 2, {2,3}, {1}, {1,2,3}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_0_2 = g_h_out->create_patch("p_yp_0_2", 2, {0,1,2,3}, {1}, {3,4,5}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_0_3 = g_h_out->create_patch("p_yp_0_3", 2, {0,1,2,3}, {1}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_1_0 = g_h_in->create_patch("p_yp_1_0", 2, {3,4}, {1}, {0,1}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_1_1 = g_h_in->create_patch("p_yp_1_1", 2, {3,4}, {1}, {1,2,3}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_1_2 = g_h_out->create_patch("p_yp_1_2", 2, {3,4}, {1}, {3,4,5}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_1_3 = g_h_out->create_patch("p_yp_1_3", 2, {3,4}, {1}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_0 = g_h_in->create_patch("p_yp_2_0", 2, {4,5,6,7}, {1}, {0,1}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_1 = g_h_in->create_patch("p_yp_2_1", 2, {4,5,6,7}, {1}, {1,2,3}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_2_0 = g_out->create_patch("p_yp_2_2_0", 2, {4,5}, {1}, {3,4,5}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_2_1 = g_out->create_patch("p_yp_2_2_1", 2, {5,6}, {1}, {3,4}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_2_2 = g_out->create_patch("p_yp_2_2_2", 2, {6,7}, {1}, {3,4,5}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_yp_2_3 = g_out->create_patch("p_yp_2_3", 2, {4,5,6,7}, {1}, {5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); // xp auto p_xm = g_xyz->create_patch("p_xm", -1, {0}, {0,1}, {0,1,2,3,4,5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_xp = g_xyz->create_patch("p_xp", 1, {7}, {0,1}, {0,1,2,3,4,5,6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_zm = g_xyz->create_patch("p_zm", -3, {0,1,2,3,4,5,6,7}, {0,1}, {0}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); auto p_zp = g_xyz->create_patch("p_zp", 3, {0,1,2,3,4,5,6,7}, {0,1}, {6}, v_bou_def);// = {"T":{{0.0,0.0},{0.0,0.0}},"s":{{1.0,1.0},{1.0,1.0}}}); // stitching // in xm stitch(p_in_xm, p_in_zm); stitch(p_in_xm, p_in_zp); stitch(p_in_xm, p_yp_0_1_0); // in xp stitch(p_in_xp, p_in_zm); stitch(p_in_xp, p_in_zp); stitch(p_in_xp, p_yp_0_1_2); // in z stitch(p_in_zm, p_yp_0_0); stitch(p_in_zp, p_yp_0_1_1); // out xm stitch(p_out_xm, p_out_zm); stitch(p_out_xm, p_out_zp); stitch(p_out_xm, p_yp_2_2_0); // out xp stitch(p_out_xp, p_out_zm); stitch(p_out_xp, p_out_zp); stitch(p_out_xp, p_yp_2_2_2); // out z stitch(p_out_zp, p_yp_2_3); stitch(p_out_zm, p_yp_2_2_1); // xm stitch(p_xm,p_ym_0_0); stitch(p_xm,p_ym_0_1); stitch(p_xm,p_ym_0_2); stitch(p_xm,p_yp_0_0); stitch(p_xm,p_yp_0_1_0); stitch(p_xm,p_yp_0_2); stitch(p_xm,p_yp_0_3); stitch(p_xm,p_zm); stitch(p_xm,p_zp); // xp stitch(p_xp,p_ym_2_0); stitch(p_xp,p_ym_2_1);; stitch(p_xp,p_ym_2_2); stitch(p_xp,p_yp_2_0); stitch(p_xp,p_yp_2_1); stitch(p_xp,p_yp_2_2_2); stitch(p_xp,p_yp_2_3); stitch(p_xp,p_zm); stitch(p_xp,p_zp); //zm; stitch(p_zm,p_ym_0_0); stitch(p_zm,p_ym_1_0); stitch(p_zm,p_ym_2_0); stitch(p_zm,p_yp_0_0); stitch(p_zm,p_yp_1_0); stitch(p_zm,p_yp_2_0); // zp; stitch(p_zp,p_ym_0_2); stitch(p_zp,p_ym_1_2); stitch(p_zp,p_ym_2_2); stitch(p_zp,p_yp_0_3); stitch(p_zp,p_yp_1_3); stitch(p_zp,p_yp_2_3); // yp // row 0 stitch(p_yp_0_0, p_yp_1_0); stitch(p_yp_0_0, p_yp_0_1_0); stitch(p_yp_0_0, p_yp_0_1_2); stitch(p_yp_1_0, p_yp_1_1); stitch(p_yp_1_0, p_yp_2_0); stitch(p_yp_2_0, p_yp_2_1); // row 1 stitch(p_yp_0_1_0, p_yp_0_1_1); stitch(p_yp_0_1_0, p_yp_0_2); stitch(p_yp_0_1_1, p_yp_0_1_2); stitch(p_yp_0_1_1, p_yp_0_2); stitch(p_yp_0_1_2, p_yp_1_1); stitch(p_yp_0_1_2, p_yp_0_2); stitch(p_yp_1_1, p_yp_2_1); stitch(p_yp_1_1, p_yp_1_2); stitch(p_yp_2_1, p_yp_2_2_0); stitch(p_yp_2_1, p_yp_2_2_1); stitch(p_yp_2_1, p_yp_2_2_2); // row 2 stitch(p_yp_0_2, p_yp_1_2); stitch(p_yp_0_2, p_yp_0_3); stitch(p_yp_1_2, p_yp_2_2_0); stitch(p_yp_1_2, p_yp_1_3); stitch(p_yp_2_2_0, p_yp_2_2_1); stitch(p_yp_2_2_0, p_yp_2_3); stitch(p_yp_2_2_1, p_yp_2_2_2); stitch(p_yp_2_2_2, p_yp_2_3); // row 3 stitch(p_yp_0_3, p_yp_1_3); stitch(p_yp_1_3, p_yp_2_3); // ym; stitch(p_ym_0_0, p_ym_0_1); stitch(p_ym_0_0, p_ym_1_0); stitch(p_ym_1_0, p_ym_1_1); stitch(p_ym_1_0, p_ym_2_0); stitch(p_ym_2_0, p_ym_2_1); stitch(p_ym_0_1, p_ym_1_1); stitch(p_ym_0_1, p_ym_0_2); stitch(p_ym_1_1, p_ym_2_1); stitch(p_ym_1_1, p_ym_1_2); stitch(p_ym_2_1, p_ym_2_2); stitch(p_ym_0_2, p_ym_1_2); stitch(p_ym_1_2, p_ym_2_2); for(auto g : prob->patch_groups_) { g->get_value_of_interest_residual("T"); } // solve; prob->connection_info(); solve_with_source(prob); //solve_source(prob); //solve_temp(prob); prob->value_stats("T"); };
WaterQuadTree::WaterQuadTree(const glm::dmat4& rotation, const glm::dmat4& translation, double extents, double radii, std::shared_ptr<Shader> shader) : Drawable(), _translation(translation), _rotation(rotation), _extents(extents), _radii(radii) { set_shader(shader); create_patch(); }
static void test_system_tables( void ) { UINT r; const char *query; MSIHANDLE hproduct, hdb, hview, hrec; if (!pMsiApplyPatchA) { win_skip("MsiApplyPatchA is not available\n"); return; } if (is_process_limited()) { skip("process is limited\n"); return; } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); create_patch( mspfile ); MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); if (r != ERROR_SUCCESS) { skip("Product installation failed with error code %d\n", r); goto cleanup; } r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); hdb = MsiGetActiveDatabase( hproduct ); ok( hdb, "failed to get database handle\n" ); r = find_entry( hdb, "_Streams", "\5SummaryInformation" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); query = "SELECT * FROM `_Storages`"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); r = find_entry( hdb, "_Tables", "Directory" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "File" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Component" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Feature" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "FeatureComponents" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Property" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "InstallExecuteSequence" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Media" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "_Property" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); MsiCloseHandle( hdb ); MsiCloseHandle( hproduct ); r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ "expected ERROR_SUCCESS, got %u\n", r ); if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); goto uninstall; } r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); hdb = MsiGetActiveDatabase( hproduct ); ok( hdb, "failed to get database handle\n" ); r = find_entry( hdb, "_Streams", "\5SummaryInformation" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); query = "SELECT * FROM `_Storages`"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); r = find_entry( hdb, "_Tables", "Directory" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "File" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Component" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Feature" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "FeatureComponents" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Property" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "InstallExecuteSequence" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Media" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "_Property" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "MsiPatchHeaders" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "Patch" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); r = find_entry( hdb, "_Tables", "PatchPackage" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); MsiCloseHandle( hdb ); MsiCloseHandle( hproduct ); uninstall: r = MsiInstallProductA( msifile, "REMOVE=ALL" ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); }
static void test_simple_patch( void ) { UINT r; DWORD size; char path[MAX_PATH], install_source[MAX_PATH], buffer[32]; const char *query; MSIHANDLE hpackage, hdb, hview, hrec; if (!pMsiApplyPatchA) { win_skip("MsiApplyPatchA is not available\n"); return; } if (is_process_limited()) { skip("process is limited\n"); return; } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); create_patch( mspfile ); MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); if (r != ERROR_SUCCESS) { skip("Product installation failed with error code %u\n", r); goto cleanup; } size = get_pf_file_size( "msitest\\patch.txt" ); ok( size == 1000, "expected 1000, got %u\n", size ); size = sizeof(install_source); r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", "InstallSource", install_source, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); strcpy( path, CURR_DIR ); strcat( path, "\\" ); strcat( path, msifile ); r = MsiOpenPackageA( path, &hpackage ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); hdb = MsiGetActiveDatabase( hpackage ); ok( hdb, "failed to get database handle\n" ); query = "SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); query = "SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' " "AND `Value` = 'Installer Database'"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); buffer[0] = 0; size = sizeof(buffer); r = MsiGetProperty( hpackage, "PATCHNEWSUMMARYSUBJECT", buffer, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !strcmp( buffer, "Installer Database" ), "expected \'Installer Database\', got \'%s\'\n", buffer ); MsiCloseHandle( hdb ); MsiCloseHandle( hpackage ); r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ "expected ERROR_SUCCESS, got %u\n", r ); if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); goto uninstall; } size = get_pf_file_size( "msitest\\patch.txt" ); ok( size == 1002, "expected 1002, got %u\n", size ); /* show that MsiOpenPackage applies registered patches */ r = MsiOpenPackageA( path, &hpackage ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); hdb = MsiGetActiveDatabase( hpackage ); ok( hdb, "failed to get database handle\n" ); query = "SELECT * FROM `Property` where `Property` = 'PATCHNEWPACKAGECODE'"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); query = "SELECT * FROM `Property` WHERE `Property` = 'PATCHNEWSUMMARYSUBJECT' " "AND `Value` = 'Installation Database'"; r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); buffer[0] = 0; size = sizeof(buffer); r = MsiGetProperty( hpackage, "PATCHNEWSUMMARYSUBJECT", buffer, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !strcmp( buffer, "Installation Database" ), "expected \'Installation Database\', got \'%s\'\n", buffer ); MsiCloseHandle( hdb ); MsiCloseHandle( hpackage ); /* show that patches are not committed to the local package database */ size = sizeof(path); r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", "LocalPackage", path, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiOpenDatabaseA( path, MSIDBOPEN_READONLY, &hdb ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiDatabaseOpenView( hdb, query, &hview ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewExecute( hview, 0 ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); r = MsiViewFetch( hview, &hrec ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); MsiCloseHandle( hdb ); uninstall: size = sizeof(path); r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", "InstallSource", path, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !strcasecmp( path, install_source ), "wrong path %s\n", path ); r = MsiInstallProductA( msifile, "REMOVE=ALL" ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !delete_pf( "msitest\\patch.txt", TRUE ), "file not removed\n" ); ok( !delete_pf( "msitest", FALSE ), "directory not removed\n" ); cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); }
static void test_patch_registration( void ) { UINT r, size; char buffer[MAX_PATH], patch_code[39]; if (!pMsiApplyPatchA || !pMsiGetPatchInfoExA || !pMsiEnumPatchesExA) { win_skip("required functions not available\n"); return; } if (is_process_limited()) { skip("process is limited\n"); return; } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); create_database( msifile, tables, sizeof(tables) / sizeof(struct msi_table) ); create_patch( mspfile ); MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); if (r != ERROR_SUCCESS) { skip("Product installation failed with error code %d\n", r); goto cleanup; } r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ "expected ERROR_SUCCESS, got %u\n", r ); if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); goto uninstall; } buffer[0] = 0; size = sizeof(buffer); r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( buffer[0], "buffer empty\n" ); buffer[0] = 0; size = sizeof(buffer); r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_MACHINE, INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); ok( r == ERROR_UNKNOWN_PRODUCT, "expected ERROR_UNKNOWN_PRODUCT, got %u\n", r ); buffer[0] = 0; size = sizeof(buffer); r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_USERMANAGED, INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !buffer[0], "got %s\n", buffer ); r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSIPATCHSTATE_APPLIED, 0, patch_code, NULL, NULL, NULL, NULL ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); ok( !strcmp( patch_code, "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}" ), "wrong patch code\n" ); r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_MACHINE, MSIPATCHSTATE_APPLIED, 0, patch_code, NULL, NULL, NULL, NULL ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); r = pMsiEnumPatchesExA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, 0, patch_code, NULL, NULL, NULL, NULL ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); uninstall: r = MsiInstallProductA( msifile, "REMOVE=ALL" ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); buffer[0] = 0; size = sizeof(buffer); r = pMsiGetPatchInfoExA( "{0F96CDC0-4CDF-4304-B283-7B9264889EF7}", "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", NULL, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); ok( r == ERROR_UNKNOWN_PRODUCT, "expected ERROR_UNKNOWN_PRODUCT, got %u\n", r ); cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); }