Fill in missing code in MysqlChangesets

Summary: Add in the missing code to establish a MySQL connection to the `changesets` crate. Also add unit tests for `MysqlChangesets`.

Reviewed By: jsgf

Differential Revision: D7174371

fbshipit-source-id: b531c5d5efb95eeb5e39188c4d608540f0c0261f
This commit is contained in:
Arun Kulshreshtha 2018-03-06 17:02:15 -08:00 committed by Facebook Github Bot
parent bb8c39183e
commit 9f091474bb
3 changed files with 60 additions and 4 deletions

View File

@ -0,0 +1,14 @@
CREATE TABLE changesets (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
repo_id INTEGER NOT NULL,
cs_id BINARY(20) NOT NULL,
gen BIGINT NOT NULL,
UNIQUE (repo_id, cs_id)
);
CREATE TABLE csparents (
cs_id BIGINT NOT NULL,
parent_id BIGINT NOT NULL,
seq INTEGER NOT NULL,
PRIMARY KEY (cs_id, parent_id, seq)
);

View File

@ -113,9 +113,30 @@ pub struct MysqlChangesets {
}
impl MysqlChangesets {
pub fn open(_params: ConnectionParams) -> Result<Self> {
// TODO (kulshrax) connect to MySQL, and make this async (return a Future)
unimplemented!();
pub fn open(params: ConnectionParams) -> Result<Self> {
let url = params.to_diesel_url()?;
let conn = MysqlConnection::establish(&url)?;
Ok(Self {
connection: Mutex::new(conn),
})
}
pub fn create_test_db<P: AsRef<str>>(prefix: P) -> Result<Self> {
let params = db::create_test_db(prefix)?;
Self::create(params)
}
fn create(params: ConnectionParams) -> Result<Self> {
let changesets = Self::open(params)?;
let up_query = include_str!("../schemas/mysql-changesets.sql");
changesets
.connection
.lock()
.expect("lock poisoned")
.batch_execute(&up_query)?;
Ok(changesets)
}
}

View File

@ -21,7 +21,8 @@ use std::sync::Arc;
use futures::Future;
use changesets::{ChangesetEntry, ChangesetInsert, Changesets, ErrorKind, SqliteChangesets};
use changesets::{ChangesetEntry, ChangesetInsert, Changesets, ErrorKind, MysqlChangesets,
SqliteChangesets};
use mercurial_types_mocks::nodehash::*;
use mercurial_types_mocks::repo::*;
@ -245,6 +246,18 @@ changesets_test_impl! {
}
}
changesets_test_impl! {
mysql_test => {
new: new_mysql,
}
}
changesets_test_impl! {
mysql_arced_test => {
new: new_mysql_arced,
}
}
fn new_sqlite() -> SqliteChangesets {
let db = SqliteChangesets::in_memory().expect("Creating an in-memory SQLite database failed");
db
@ -253,3 +266,11 @@ fn new_sqlite() -> SqliteChangesets {
fn new_sqlite_arced() -> Arc<Changesets> {
Arc::new(new_sqlite())
}
fn new_mysql() -> MysqlChangesets {
MysqlChangesets::create_test_db("changesets_test").expect("Failed to create test database")
}
fn new_mysql_arced() -> Arc<Changesets> {
Arc::new(new_mysql())
}