int pkg_delete(struct pkg *pkg, struct pkgdb *db, int force) { struct pkg **rdeps; int i, ret; struct sbuf *rdep_msg; if (pkg == NULL) return (ERROR_BAD_ARG("pkg")); if (db == NULL) return (ERROR_BAD_ARG("db")); /* * Ensure that we have all the informations we need */ if ((ret = pkgdb_loadrdeps(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadfiles(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadscripts(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadmtree(db, pkg)) != EPKG_OK) return (ret); rdeps = pkg_rdeps(pkg); if (rdeps[0] != NULL) { rdep_msg = sbuf_new_auto(); sbuf_printf(rdep_msg, "%s-%s is required by other packages:", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION)); for (i = 0;rdeps[i] != NULL; i++) { sbuf_cat(rdep_msg, " "); sbuf_printf(rdep_msg, "%s-%s", pkg_get(rdeps[i], PKG_NAME), pkg_get(rdeps[i], PKG_VERSION)); } if (!force) { sbuf_finish(rdep_msg); ret = pkg_error_set(EPKG_REQUIRED, "%s", sbuf_get(rdep_msg)); sbuf_free(rdep_msg); return ret; } sbuf_cat(rdep_msg, ", deleting anyway"); sbuf_finish(rdep_msg); fprintf(stderr, "%s\n", sbuf_get(rdep_msg)); sbuf_free(rdep_msg); } if ((ret = pkg_script_pre_deinstall(pkg)) != EPKG_OK) return (ret); if ((ret = pkg_delete_files(pkg, force)) != EPKG_OK) return (ret); if ((ret = pkg_script_post_deinstall(pkg)) != EPKG_OK) return (ret); return (pkgdb_unregister_pkg(db, pkg_get(pkg, PKG_ORIGIN))); }
int pkg_delete2(struct pkg *pkg, struct pkgdb *db, int force, int upgrade) { struct pkg_dep *rdep = NULL; int ret; assert(pkg != NULL); assert(db != NULL); /* * Do not trust the existing entries as it may have changed if we * delete packages in batch. */ pkg_list_free(pkg, PKG_RDEPS); /* * Ensure that we have all the informations we need */ if ((ret = pkgdb_loadrdeps(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadfiles(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loaddirs(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadscripts(db, pkg)) != EPKG_OK) return (ret); if ((ret = pkgdb_loadmtree(db, pkg)) != EPKG_OK) return (ret); if (!upgrade) pkg_emit_deinstall_begin(pkg); else pkg_emit_upgrade_begin(pkg); /* If there are dependencies */ if (pkg_rdeps(pkg, &rdep) == EPKG_OK) { pkg_emit_required(pkg, force); if (!force) return (EPKG_REQUIRED); } if (upgrade) { if (( ret = pkg_script_run(pkg, PKG_SCRIPT_PRE_UPGRADE)) != EPKG_OK ) return (ret); } else { if ((ret = pkg_script_run(pkg, PKG_SCRIPT_PRE_DEINSTALL)) != EPKG_OK) return (ret); } if ((ret = pkg_delete_files(pkg, force)) != EPKG_OK) return (ret); if (!upgrade) if ((ret = pkg_script_run(pkg, PKG_SCRIPT_POST_DEINSTALL)) != EPKG_OK) return (ret); if ((ret = pkg_delete_dirs(db, pkg, force)) != EPKG_OK) return (ret); if (!upgrade) pkg_emit_deinstall_finished(pkg); return (pkgdb_unregister_pkg(db, pkg_get(pkg, PKG_ORIGIN))); }
int pkgdb_it_next(struct pkgdb_it *it, struct pkg **pkg_p, int flags) { struct pkg *pkg; int ret; if (it == NULL) return (ERROR_BAD_ARG("it")); switch (sqlite3_step(it->stmt)) { case SQLITE_ROW: if (*pkg_p == NULL) pkg_new(pkg_p, PKG_INSTALLED); else pkg_reset(*pkg_p, PKG_INSTALLED); pkg = *pkg_p; pkg->rowid = sqlite3_column_int64(it->stmt, 0); pkg_set(pkg, PKG_ORIGIN, sqlite3_column_text(it->stmt, 1)); pkg_set(pkg, PKG_NAME, sqlite3_column_text(it->stmt, 2)); pkg_set(pkg, PKG_VERSION, sqlite3_column_text(it->stmt, 3)); pkg_set(pkg, PKG_COMMENT, sqlite3_column_text(it->stmt, 4)); pkg_set(pkg, PKG_DESC, sqlite3_column_text(it->stmt, 5)); pkg_set(pkg, PKG_MESSAGE, sqlite3_column_text(it->stmt, 6)); pkg_set(pkg, PKG_ARCH, sqlite3_column_text(it->stmt, 7)); pkg_set(pkg, PKG_OSVERSION, sqlite3_column_text(it->stmt, 8)); pkg_set(pkg, PKG_MAINTAINER, sqlite3_column_text(it->stmt, 9)); pkg_set(pkg, PKG_WWW, sqlite3_column_text(it->stmt, 10)); pkg_set(pkg, PKG_PREFIX, sqlite3_column_text(it->stmt, 11)); pkg_setflatsize(pkg, sqlite3_column_int64(it->stmt, 12)); if (it->type == IT_UPGRADE) { pkg->type = PKG_UPGRADE; pkg_set(pkg, PKG_NEWVERSION, sqlite3_column_text(it->stmt, 13)); pkg_setnewflatsize(pkg, sqlite3_column_int64(it->stmt, 14)); pkg_setnewpkgsize(pkg, sqlite3_column_int64(it->stmt, 15)); pkg_set(pkg, PKG_REPOPATH, sqlite3_column_text(it->stmt, 16)); } if (flags & PKG_LOAD_DEPS) if ((ret = pkgdb_loaddeps(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_RDEPS) if ((ret = pkgdb_loadrdeps(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_CONFLICTS) if ((ret = pkgdb_loadconflicts(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_FILES) if ((ret = pkgdb_loadfiles(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_SCRIPTS) if ((ret = pkgdb_loadscripts(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_OPTIONS) if ((ret = pkgdb_loadoptions(it->db, pkg)) != EPKG_OK) return (ret); if (flags & PKG_LOAD_MTREE) if ((ret = pkgdb_loadmtree(it->db, pkg)) != EPKG_OK) return (ret); return (EPKG_OK); case SQLITE_DONE: return (EPKG_END); default: return (ERROR_SQLITE(it->db->sqlite)); } }