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