pkgdb.h
1 /*- 2 * Copyright (c) 2011-2025 Baptiste Daroussin <bapt@FreeBSD.org> 3 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org> 4 * Copyright (c) 2023 Serenity Cyber Security, LLC 5 * Author: Gleb Popov <arrowd@FreeBSD.org> 6 * 7 */ 8 9 #ifndef _PKGDB_H 10 #define _PKGDB_H 11 12 #include "pkg.h" 13 14 #include <sqlite3.h> 15 #include "pkg/vec.h" 16 17 typedef vec_t(struct pkg_repo *) repos_t; 18 struct pkgdb { 19 sqlite3 *sqlite; 20 bool prstmt_initialized; 21 repos_t repos; 22 }; 23 24 struct pkgdb_sqlite_it { 25 sqlite3 *sqlite; 26 sqlite3_stmt *stmt; 27 short flags; 28 short finished; 29 short pkg_type; 30 }; 31 32 struct pkg_repo_it; 33 34 struct pkgdb_it { 35 struct pkgdb *db; 36 vec_t(struct pkg_repo_it *) remote; 37 size_t remote_pos; 38 struct pkgdb_sqlite_it *local; 39 }; 40 41 #define PKGDB_IT_FLAG_CYCLED (0x1) 42 #define PKGDB_IT_FLAG_ONCE (0x1 << 1) 43 #define PKGDB_IT_FLAG_AUTO (0x1 << 2) 44 45 46 /** 47 * Transaction/savepoint handling. 48 * @param savepoint -- if NULL or an empty string, use BEGIN, ROLLBACK, COMMIT 49 * otherwise use SAVEPOINT, ROLLBACK TO, RELEASE. 50 * @return an error code. 51 */ 52 int pkgdb_transaction_begin_sqlite(sqlite3 *sqlite, const char *savepoint); 53 int pkgdb_transaction_commit_sqlite(sqlite3 *sqlite, const char *savepoint); 54 int pkgdb_transaction_rollback_sqlite(sqlite3 *sqlite, const char *savepoint); 55 56 struct pkgdb_it *pkgdb_it_new_sqlite(struct pkgdb *db, sqlite3_stmt *s, 57 int type, short flags); 58 struct pkgdb_it *pkgdb_it_new_repo(struct pkgdb *db); 59 void pkgdb_it_repo_attach(struct pkgdb_it *it, struct pkg_repo_it *rit); 60 61 /** 62 * Load missing flags for a specific package from pkgdb 63 */ 64 int pkgdb_ensure_loaded(struct pkgdb *db, struct pkg *pkg, unsigned flags); 65 int pkgdb_ensure_loaded_sqlite(sqlite3 *sqlite, struct pkg *pkg, unsigned flags); 66 67 void pkgshell_open(const char **r); 68 69 /** 70 * Register a conflicts list in a repo 71 * @param origin the origin of a package 72 * @param conflicts a list of conflicts origins 73 * @param conflicts_num number of conflicts for this package 74 * @param sqlite database 75 * @return error code 76 */ 77 int pkgdb_repo_register_conflicts(const char *origin, char **conflicts, 78 int conflicts_num, sqlite3 *sqlite); 79 80 /** 81 * Get query for the specified match type 82 * @param pattern 83 * @param match 84 * @return 85 */ 86 const char * pkgdb_get_pattern_query(const char *pattern, match_t match); 87 88 /** 89 * Find provides for a specified require in repos 90 * @param db 91 * @param provide 92 * @param repo 93 * @return 94 */ 95 struct pkgdb_it *pkgdb_repo_shlib_require(struct pkgdb *db, 96 const char *provide, c_charv_t *repos); 97 /** 98 * Find requires for a specified provide in repos 99 * @param db 100 * @param require 101 * @param repo 102 * @return 103 */ 104 struct pkgdb_it *pkgdb_repo_shlib_provide(struct pkgdb *db, 105 const char *require, c_charv_t *repos); 106 107 struct pkgdb_it *pkgdb_repo_provide(struct pkgdb *db, const char *require, c_charv_t *repo); 108 109 struct pkgdb_it *pkgdb_repo_require(struct pkgdb *db, const char *provide, c_charv_t *repo); 110 111 /** 112 * Unregister a package from the database 113 * @return An error code. 114 */ 115 int pkgdb_unregister_pkg(struct pkgdb *pkg, int64_t id); 116 117 /** 118 * Optimize db for using of solver 119 */ 120 int pkgdb_begin_solver(struct pkgdb *db); 121 122 /** 123 * Restore normal db operations 124 * @param db 125 * @return 126 */ 127 int pkgdb_end_solver(struct pkgdb *db); 128 129 /** 130 * Check access mode for the specified file 131 * @param mode 132 * @param dbdir 133 * @param dbname 134 * @return 135 */ 136 int pkgdb_check_access(unsigned mode, const char *dbname); 137 138 /* 139 * SQLite utility functions 140 */ 141 void pkgdb_regex(sqlite3_context *ctx, int argc, sqlite3_value **argv); 142 void pkgdb_regex_delete(void *p); 143 void pkgdb_now(sqlite3_context *ctx, int argc, __unused sqlite3_value **argv); 144 int pkgdb_sqlcmd_init(sqlite3 *db, const char **err, const void *noused); 145 int pkgdb_update_config_file_content(struct pkg *pkg, sqlite3 *s); 146 void pkgdb_syscall_overload(void); 147 void pkgdb_nfs_corruption(sqlite3 *s); 148 bool pkgdb_file_exists(struct pkgdb *db, const char *path); 149 struct sqlite3_stmt *prepare_sql(sqlite3 *s, const char *sql); 150 void pkgdb_debug(int level, sqlite3_stmt *stmt); 151 152 bool pkgdb_is_provided(struct pkgdb *db, const char *req); 153 bool pkgdb_is_shlib_provided(struct pkgdb *db, const char *req); 154 155 #endif