1use crate::migrations;
4use ckb_db::{ReadOnlyDB, RocksDB};
5use ckb_db_migration::{DefaultMigration, Migrations};
6use ckb_db_schema::{COLUMN_META, COLUMNS};
7use ckb_error::Error;
8use ckb_types::core::hardfork::HardForks;
9use std::cmp::Ordering;
10use std::path::PathBuf;
11use std::sync::Arc;
12
13const INIT_DB_VERSION: &str = "20191127135521";
14
15pub struct Migrate {
17 migrations: Migrations,
18 path: PathBuf,
19}
20
21impl Migrate {
22 pub fn new<P: Into<PathBuf>>(path: P, hardforks: HardForks) -> Self {
24 let mut migrations = Migrations::default();
25 migrations.add_migration(Arc::new(DefaultMigration::new(INIT_DB_VERSION)));
26 migrations.add_migration(Arc::new(migrations::ChangeMoleculeTableToStruct)); migrations.add_migration(Arc::new(migrations::CellMigration)); migrations.add_migration(Arc::new(migrations::AddNumberHashMapping)); migrations.add_migration(Arc::new(migrations::AddExtraDataHash)); migrations.add_migration(Arc::new(migrations::AddBlockExtensionColumnFamily)); migrations.add_migration(Arc::new(migrations::AddChainRootMMR)); migrations.add_migration(Arc::new(migrations::AddBlockFilterColumnFamily)); migrations.add_migration(Arc::new(migrations::AddBlockFilterHash)); migrations.add_migration(Arc::new(migrations::BlockExt2019ToZero::new(hardforks))); Migrate {
37 migrations,
38 path: path.into(),
39 }
40 }
41
42 pub fn open_read_only_db(&self) -> Result<Option<ReadOnlyDB>, Error> {
44 ReadOnlyDB::open_cf(&self.path, vec![COLUMN_META])
46 }
47
48 pub fn check(&self, db: &ReadOnlyDB, include_background: bool) -> Ordering {
57 self.migrations.check(db, include_background)
58 }
59
60 pub fn require_expensive(&self, db: &ReadOnlyDB, include_background: bool) -> bool {
62 self.migrations.expensive(db, include_background)
63 }
64
65 pub fn can_run_in_background(&self, db: &ReadOnlyDB) -> bool {
67 self.migrations.can_run_in_background(db)
68 }
69
70 pub fn open_bulk_load_db(&self) -> Result<Option<RocksDB>, Error> {
72 RocksDB::prepare_for_bulk_load_open(&self.path, COLUMNS)
73 }
74
75 pub fn migrate(self, db: RocksDB, run_in_background: bool) -> Result<RocksDB, Error> {
77 self.migrations.migrate(db, run_in_background)
78 }
79
80 pub fn init_db_version(self, db: &RocksDB) -> Result<(), Error> {
82 self.migrations.init_db_version(db)
83 }
84}