/ libpkg / private / pkgdb.h
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