migrations mutably borrow self
This commit is contained in:
parent
aaad0e87ae
commit
3e61d6f3f9
@ -1,3 +1,19 @@
|
|||||||
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||||
|
// This file is part of Parity.
|
||||||
|
|
||||||
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
|
||||||
|
// Parity is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//! Extras database migrations.
|
//! Extras database migrations.
|
||||||
|
|
||||||
mod v6;
|
mod v6;
|
||||||
|
@ -164,7 +164,7 @@ fn state_database_migrations(pruning: Algorithm) -> Result<MigrationManager, Err
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Migrates database at given position with given migration rules.
|
/// Migrates database at given position with given migration rules.
|
||||||
fn migrate_database(version: u32, db_path: PathBuf, migrations: MigrationManager) -> Result<(), Error> {
|
fn migrate_database(version: u32, db_path: PathBuf, migrations: mut MigrationManager) -> Result<(), Error> {
|
||||||
// check if migration is needed
|
// check if migration is needed
|
||||||
if !migrations.is_needed(version) {
|
if !migrations.is_needed(version) {
|
||||||
return Ok(())
|
return Ok(())
|
||||||
|
@ -25,6 +25,7 @@ use std::path::{Path, PathBuf};
|
|||||||
use ::kvdb::{CompactionProfile, Database, DatabaseConfig, DBTransaction};
|
use ::kvdb::{CompactionProfile, Database, DatabaseConfig, DBTransaction};
|
||||||
|
|
||||||
/// Migration config.
|
/// Migration config.
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// Defines how many elements should be migrated at once.
|
/// Defines how many elements should be migrated at once.
|
||||||
pub batch_size: usize,
|
pub batch_size: usize,
|
||||||
@ -62,7 +63,7 @@ pub trait Migration: 'static {
|
|||||||
/// Version of the database after the migration.
|
/// Version of the database after the migration.
|
||||||
fn version(&self) -> u32;
|
fn version(&self) -> u32;
|
||||||
/// Migrate a source to a destination.
|
/// Migrate a source to a destination.
|
||||||
fn migrate(&self, source: &Database, config: &Config, destination: &mut Database) -> Result<(), Error>;
|
fn migrate(&mut self, source: &Database, config: &Config, destination: &mut Database) -> Result<(), Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A simple migration over key-value pairs.
|
/// A simple migration over key-value pairs.
|
||||||
@ -71,13 +72,13 @@ pub trait SimpleMigration: 'static {
|
|||||||
fn version(&self) -> u32;
|
fn version(&self) -> u32;
|
||||||
/// Should migrate existing object to new database.
|
/// Should migrate existing object to new database.
|
||||||
/// Returns `None` if the object does not exist in new version of database.
|
/// Returns `None` if the object does not exist in new version of database.
|
||||||
fn simple_migrate(&self, key: Vec<u8>, value: Vec<u8>) -> Option<(Vec<u8>, Vec<u8>)>;
|
fn simple_migrate(&mut self, key: Vec<u8>, value: Vec<u8>) -> Option<(Vec<u8>, Vec<u8>)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: SimpleMigration> Migration for T {
|
impl<T: SimpleMigration> Migration for T {
|
||||||
fn version(&self) -> u32 { SimpleMigration::version(self) }
|
fn version(&self) -> u32 { SimpleMigration::version(self) }
|
||||||
|
|
||||||
fn migrate(&self, source: &Database, config: &Config, dest: &mut Database) -> Result<(), Error> {
|
fn migrate(&mut self, source: &Database, config: &Config, dest: &mut Database) -> Result<(), Error> {
|
||||||
let mut batch: BTreeMap<Vec<u8>, Vec<u8>> = BTreeMap::new();
|
let mut batch: BTreeMap<Vec<u8>, Vec<u8>> = BTreeMap::new();
|
||||||
|
|
||||||
for (key, value) in source.iter() {
|
for (key, value) in source.iter() {
|
||||||
@ -174,7 +175,8 @@ impl Manager {
|
|||||||
|
|
||||||
/// Performs migration in order, starting with a source path, migrating between two temporary databases,
|
/// Performs migration in order, starting with a source path, migrating between two temporary databases,
|
||||||
/// and producing a path where the final migration lives.
|
/// and producing a path where the final migration lives.
|
||||||
pub fn execute(&self, old_path: &Path, version: u32) -> Result<PathBuf, Error> {
|
pub fn execute(&mut self, old_path: &Path, version: u32) -> Result<PathBuf, Error> {
|
||||||
|
let config = self.config.clone();
|
||||||
let migrations = try!(self.migrations_from(version).ok_or(Error::MigrationImpossible));
|
let migrations = try!(self.migrations_from(version).ok_or(Error::MigrationImpossible));
|
||||||
let db_config = DatabaseConfig {
|
let db_config = DatabaseConfig {
|
||||||
prefix_size: None,
|
prefix_size: None,
|
||||||
@ -197,7 +199,7 @@ impl Manager {
|
|||||||
let mut new_db = try!(Database::open(&db_config, temp_path_str).map_err(|s| Error::Custom(s)));
|
let mut new_db = try!(Database::open(&db_config, temp_path_str).map_err(|s| Error::Custom(s)));
|
||||||
|
|
||||||
// perform the migration from cur_db to new_db.
|
// perform the migration from cur_db to new_db.
|
||||||
try!(migration.migrate(&cur_db, &self.config, &mut new_db));
|
try!(migration.migrate(&cur_db, &config, &mut new_db));
|
||||||
// next iteration, we will migrate from this db into the other temp.
|
// next iteration, we will migrate from this db into the other temp.
|
||||||
cur_db = new_db;
|
cur_db = new_db;
|
||||||
temp_idx.swap();
|
temp_idx.swap();
|
||||||
@ -216,10 +218,10 @@ impl Manager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn migrations_from(&self, version: u32) -> Option<&[Box<Migration>]> {
|
fn migrations_from(&mut self, version: u32) -> Option<&mut [Box<Migration>]> {
|
||||||
// index of the first required migration
|
// index of the first required migration
|
||||||
let position = self.migrations.iter().position(|m| m.version() == version + 1);
|
let position = self.migrations.iter().position(|m| m.version() == version + 1);
|
||||||
position.map(|p| &self.migrations[p..])
|
position.map(move |p| &mut self.migrations[p..])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user