Skip to main content

spring_batch_rs/item/rdbc/
mod.rs

1use sqlx::{Database, query_builder::Separated};
2
3/// Common utilities for database item writers.
4mod writer_common;
5
6/// Common utilities for database item readers.
7mod reader_common;
8
9/// Database type enumeration.
10mod database_type;
11
12/// Unified reader builder for all database types.
13mod unified_reader_builder;
14
15/// Unified writer builder for all database types.
16mod unified_writer_builder;
17
18/// PostgreSQL-specific reader implementation.
19pub mod postgres_reader;
20
21/// MySQL-specific reader implementation.
22pub mod mysql_reader;
23
24/// SQLite-specific reader implementation.
25pub mod sqlite_reader;
26
27/// PostgreSQL-specific writer implementation.
28pub mod postgres_writer;
29
30/// MySQL-specific writer implementation.
31pub mod mysql_writer;
32
33/// SQLite-specific writer implementation.
34pub mod sqlite_writer;
35
36/// Trait for binding item data to database query parameters.
37///
38/// This trait is generic over the database type, allowing it to work with
39/// PostgreSQL, MySQL, SQLite, and other databases supported by SQLx.
40/// This provides a unified interface for database-specific item writers.
41///
42/// # Type Parameters
43///
44/// * `O` - The item type to bind
45/// * `DB` - The SQLx database type (e.g., `Postgres`, `MySql`, `Sqlite`)
46///
47/// # Examples
48///
49/// ## PostgreSQL Implementation
50/// ```no_run
51/// use spring_batch_rs::item::rdbc::DatabaseItemBinder;
52/// use sqlx::{query_builder::Separated, Postgres};
53/// use serde::Serialize;
54///
55/// #[derive(Clone, Serialize)]
56/// struct User {
57///     id: i32,
58///     name: String,
59/// }
60///
61/// struct UserBinder;
62/// impl DatabaseItemBinder<User, Postgres> for UserBinder {
63///     fn bind(&self, item: &User, mut query_builder: Separated<Postgres, &str>) {
64///         let _ = (item, query_builder); // Placeholder to avoid unused warnings
65///         // In real usage: query_builder.push_bind(item.id);
66///         // In real usage: query_builder.push_bind(&item.name);
67///     }
68/// }
69/// ```
70///
71/// ## MySQL Implementation
72/// ```no_run
73/// use spring_batch_rs::item::rdbc::DatabaseItemBinder;
74/// use sqlx::{query_builder::Separated, MySql};
75/// use serde::Serialize;
76///
77/// #[derive(Clone, Serialize)]
78/// struct Product {
79///     id: i32,
80///     name: String,
81///     price: f64,
82/// }
83///
84/// struct ProductBinder;
85/// impl DatabaseItemBinder<Product, MySql> for ProductBinder {
86///     fn bind(&self, item: &Product, mut query_builder: Separated<MySql, &str>) {
87///         let _ = (item, query_builder); // Placeholder to avoid unused warnings
88///         // In real usage: query_builder.push_bind(item.id);
89///         // In real usage: query_builder.push_bind(&item.name);
90///         // In real usage: query_builder.push_bind(item.price);
91///     }
92/// }
93/// ```
94///
95/// ## SQLite Implementation
96/// ```no_run
97/// use spring_batch_rs::item::rdbc::DatabaseItemBinder;
98/// use sqlx::{query_builder::Separated, Sqlite};
99/// use serde::Serialize;
100///
101/// #[derive(Clone, Serialize)]
102/// struct Task {
103///     id: i32,
104///     title: String,
105///     completed: bool,
106/// }
107///
108/// struct TaskBinder;
109/// impl DatabaseItemBinder<Task, Sqlite> for TaskBinder {
110///     fn bind(&self, item: &Task, mut query_builder: Separated<Sqlite, &str>) {
111///         let _ = (item, query_builder); // Placeholder to avoid unused warnings
112///         // In real usage: query_builder.push_bind(item.id);
113///         // In real usage: query_builder.push_bind(&item.title);
114///         // In real usage: query_builder.push_bind(item.completed);
115///     }
116/// }
117/// ```
118pub trait DatabaseItemBinder<O, DB: Database> {
119    /// Binds the properties of an item to a separated query builder.
120    ///
121    /// # Arguments
122    ///
123    /// * `item` - The item whose properties should be bound.
124    /// * `query_builder` - The separated query builder to bind parameters to.
125    fn bind(&self, item: &O, query_builder: Separated<DB, &str>);
126}
127
128// Re-export database-specific reader and writer types (for direct usage)
129pub use mysql_reader::MySqlRdbcItemReader;
130pub use mysql_writer::MySqlItemWriter;
131pub use postgres_reader::PostgresRdbcItemReader;
132pub use postgres_writer::PostgresItemWriter;
133pub use sqlite_reader::SqliteRdbcItemReader;
134pub use sqlite_writer::SqliteItemWriter;
135
136// Re-export unified builder types (recommended API)
137pub use database_type::DatabaseType;
138pub use unified_reader_builder::RdbcItemReaderBuilder;
139pub use unified_writer_builder::RdbcItemWriterBuilder;