#[macro_use]
mod macros;
mod commands;
pub mod doc_tests;
pub(crate) mod fixed_sql_commands;
#[cfg(all(feature = "_integration-tests", feature = "schema-manager-dev", test))]
mod integration_tests;
mod migration;
#[cfg(feature = "std")]
pub mod migration_parser;
mod migration_status;
pub mod misc;
mod repeatability;
mod schema_manager_error;
#[cfg(feature = "std")]
pub mod toml_parser;
use crate::{
codec::CodecController,
collection::Vector,
database::{DatabaseTy, Identifier, executor::Executor},
misc::Lease,
};
use alloc::string::String;
pub use commands::*;
pub use migration::*;
pub use migration_status::MigrationStatus;
pub use repeatability::Repeatability;
pub use schema_manager_error::SchemaManagerError;
pub const DEFAULT_BATCH_SIZE: usize = 128;
pub const DEFAULT_CFG_FILE_NAME: &str = "wtx.toml";
pub const VERSION: u32 = 1;
pub(crate) const _WTX: &str = "wtx";
pub(crate) const _WTX_PREFIX: &str = "_wtx";
pub(crate) const _WTX_SCHEMA: &str = "_wtx.";
pub type EmbeddedMigrationsTy = &'static [(
&'static UserMigrationGroup<&'static str>,
&'static [UserMigrationRef<'static, 'static>],
)];
pub type Uid = u32;
pub trait SchemaManagement: Executor {
fn all_elements(
&mut self,
buffer: (&mut String, &mut Vector<Identifier>),
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>;
fn clear(
&mut self,
buffer: (&mut String, &mut Vector<Identifier>),
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>;
fn create_wtx_tables(
&mut self,
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>;
fn delete_migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
uid: Uid,
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>
where
S: Lease<str>;
fn insert_migrations<'migration, DBS, I, S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
migrations: I,
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>
where
DBS: Lease<[DatabaseTy]> + 'migration,
I: Clone + Iterator<Item = &'migration UserMigration<DBS, S>>,
S: Lease<str> + 'migration;
fn migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
results: &mut Vector<DbMigration>,
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>
where
S: Lease<str>;
fn table_names(
&mut self,
buffer_cmd: &mut String,
results: &mut Vector<Identifier>,
schema: &str,
) -> impl Future<Output = Result<(), <Self::Database as CodecController>::Error>>;
}
impl<T> SchemaManagement for &mut T
where
T: SchemaManagement,
{
#[inline]
async fn all_elements(
&mut self,
buffer: (&mut String, &mut Vector<Identifier>),
) -> Result<(), <Self::Database as CodecController>::Error> {
(**self).all_elements(buffer).await
}
#[inline]
async fn clear(
&mut self,
buffer: (&mut String, &mut Vector<Identifier>),
) -> Result<(), <Self::Database as CodecController>::Error> {
(**self).clear(buffer).await
}
#[inline]
async fn create_wtx_tables(&mut self) -> Result<(), <Self::Database as CodecController>::Error> {
(**self).create_wtx_tables().await
}
#[inline]
async fn delete_migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
uid: Uid,
) -> Result<(), <Self::Database as CodecController>::Error>
where
S: Lease<str>,
{
(**self).delete_migrations(buffer_cmd, mg, uid).await
}
#[inline]
async fn insert_migrations<'migration, DBS, I, S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
migrations: I,
) -> Result<(), <Self::Database as CodecController>::Error>
where
DBS: Lease<[DatabaseTy]> + 'migration,
I: Clone + Iterator<Item = &'migration UserMigration<DBS, S>>,
S: Lease<str> + 'migration,
{
(**self).insert_migrations(buffer_cmd, mg, migrations).await
}
#[inline]
async fn migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
results: &mut Vector<DbMigration>,
) -> Result<(), <Self::Database as CodecController>::Error>
where
S: Lease<str>,
{
(**self).migrations(buffer_cmd, mg, results).await
}
#[inline]
async fn table_names(
&mut self,
buffer_cmd: &mut String,
results: &mut Vector<Identifier>,
schema: &str,
) -> Result<(), <Self::Database as CodecController>::Error> {
(**self).table_names(buffer_cmd, results, schema).await
}
}
impl SchemaManagement for () {
#[inline]
async fn all_elements(&mut self, _: (&mut String, &mut Vector<Identifier>)) -> crate::Result<()> {
Ok(())
}
#[inline]
async fn clear(&mut self, _: (&mut String, &mut Vector<Identifier>)) -> crate::Result<()> {
Ok(())
}
#[inline]
async fn create_wtx_tables(&mut self) -> crate::Result<()> {
Ok(())
}
#[inline]
async fn delete_migrations<S>(
&mut self,
_: &mut String,
_: &UserMigrationGroup<S>,
_: Uid,
) -> crate::Result<()>
where
S: Lease<str>,
{
Ok(())
}
#[inline]
async fn insert_migrations<'migration, DBS, I, S>(
&mut self,
_: &mut String,
_: &UserMigrationGroup<S>,
_: I,
) -> crate::Result<()>
where
DBS: Lease<[DatabaseTy]> + 'migration,
I: Clone + Iterator<Item = &'migration UserMigration<DBS, S>>,
S: Lease<str> + 'migration,
{
Ok(())
}
#[inline]
async fn migrations<S>(
&mut self,
_: &mut String,
_: &UserMigrationGroup<S>,
_: &mut Vector<DbMigration>,
) -> crate::Result<()>
where
S: Lease<str>,
{
Ok(())
}
#[inline]
async fn table_names(
&mut self,
_: &mut String,
_: &mut Vector<Identifier>,
_: &str,
) -> crate::Result<()> {
Ok(())
}
}
#[cfg(feature = "postgres")]
mod postgres {
use crate::{
collection::Vector,
database::{
DatabaseTy, Executor as _, Identifier,
client::postgres::{ExecutorBuffer, PostgresExecutor},
schema_manager::{
_WTX_SCHEMA, DbMigration, SchemaManagement, Uid, UserMigration, UserMigrationGroup,
fixed_sql_commands::{
common::{delete_migrations, insert_migrations, migrations_by_mg_uid_query},
postgres::{CREATE_MIGRATION_TABLES, all_elements, clear, table_names},
},
},
},
misc::{Lease, LeaseMut},
stream::Stream,
};
use alloc::string::String;
impl<E, EB, STREAM> SchemaManagement for PostgresExecutor<E, EB, STREAM>
where
E: From<crate::Error>,
EB: LeaseMut<ExecutorBuffer>,
STREAM: Stream,
{
#[inline]
async fn all_elements(
&mut self,
(buffer_cmd, buffer_idents): (&mut String, &mut Vector<Identifier>),
) -> Result<(), E> {
all_elements(
(buffer_cmd, buffer_idents),
self,
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
|_| Ok(()),
)
.await?;
Ok(())
}
#[inline]
async fn clear(&mut self, buffer: (&mut String, &mut Vector<Identifier>)) -> Result<(), E> {
clear(buffer, self).await
}
#[inline]
async fn create_wtx_tables(&mut self) -> Result<(), E> {
self.execute_ignored(CREATE_MIGRATION_TABLES).await?;
Ok(())
}
#[inline]
async fn delete_migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
uid: Uid,
) -> Result<(), E>
where
S: Lease<str>,
{
delete_migrations(buffer_cmd, self, mg, _WTX_SCHEMA, uid).await
}
#[inline]
async fn insert_migrations<'migration, DBS, I, S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
migrations: I,
) -> Result<(), E>
where
DBS: Lease<[DatabaseTy]> + 'migration,
I: Clone + Iterator<Item = &'migration UserMigration<DBS, S>>,
S: Lease<str> + 'migration,
{
insert_migrations(buffer_cmd, self, mg, migrations, _WTX_SCHEMA).await
}
#[inline]
async fn migrations<S>(
&mut self,
buffer_cmd: &mut String,
mg: &UserMigrationGroup<S>,
results: &mut Vector<DbMigration>,
) -> Result<(), E>
where
S: Lease<str>,
{
migrations_by_mg_uid_query(buffer_cmd, self, mg.uid(), results, _WTX_SCHEMA).await
}
#[inline]
async fn table_names(
&mut self,
buffer_cmd: &mut String,
results: &mut Vector<Identifier>,
schema: &str,
) -> Result<(), E> {
table_names(buffer_cmd, self, results, schema).await
}
}
}