1//===----------------------------------------------------------------------===//
2// DuckDB
3//
4// duckdb/catalog/dependency_manager.hpp
5//
6//
7//===----------------------------------------------------------------------===//
8
9#pragma once
10
11#include "duckdb/catalog/catalog_entry.hpp"
12#include "duckdb/catalog/catalog_set.hpp"
13
14#include <mutex>
15
16namespace duckdb {
17class Catalog;
18class Transaction;
19
20//! The DependencyManager is in charge of managing dependencies between catalog entries
21class DependencyManager {
22 friend class CatalogSet;
23
24public:
25 DependencyManager(Catalog &catalog);
26
27 //! Erase the object from the DependencyManager; this should only happen when the object itself is destroyed
28 void EraseObject(CatalogEntry *object);
29 // //! Clear all the dependencies of all entries in the catalog set
30 void ClearDependencies(CatalogSet &set);
31
32private:
33 Catalog &catalog;
34 //! Map of objects that DEPEND on [object], i.e. [object] can only be deleted when all entries in the dependency map
35 //! are deleted.
36 unordered_map<CatalogEntry *, unordered_set<CatalogEntry *>> dependents_map;
37 //! Map of objects that the source object DEPENDS on, i.e. when any of the entries in the vector perform a CASCADE
38 //! drop then [object] is deleted as wel
39 unordered_map<CatalogEntry *, unordered_set<CatalogEntry *>> dependencies_map;
40
41private:
42 void AddObject(Transaction &transaction, CatalogEntry *object, unordered_set<CatalogEntry *> &dependencies);
43 void DropObject(Transaction &transaction, CatalogEntry *object, bool cascade, set_lock_map_t &lock_set);
44 void AlterObject(Transaction &transaction, CatalogEntry *old_obj, CatalogEntry *new_obj);
45 void EraseObjectInternal(CatalogEntry *object);
46};
47} // namespace duckdb
48