1+ use itertools:: Itertools ;
12use crate :: codegen:: common:: { generate_conditional_bind, insertion_binding, OrmliteCodegen } ;
23use crate :: MetadataCache ;
34use ormlite_attr:: ColumnMeta ;
@@ -38,6 +39,7 @@ pub fn impl_Model__insert(db: &dyn OrmliteCodegen, attr: &ModelMeta, metadata_ca
3839 } ) ;
3940
4041 quote ! {
42+ #[ allow( unused_mut) ]
4143 fn insert<' a, A >( mut self , conn: A ) -> :: ormlite:: __private:: Insertion <' a, A , Self , #db>
4244 where
4345 A : ' a + Send + :: ormlite:: Acquire <' a, Database =#db>
@@ -132,11 +134,12 @@ pub fn impl_Insert(db: &dyn OrmliteCodegen, meta: &TableMeta, model: &Ident, ret
132134 let query_bindings = meta. database_columns ( ) . filter ( |& c| !c. has_database_default ) . map ( |c| {
133135 if let Some ( rust_default) = & c. rust_default {
134136 let default: syn:: Expr = syn:: parse_str ( & rust_default) . expect ( "Failed to parse default_value" ) ;
135- return quote ! {
137+ quote ! {
136138 q = q. bind( #default ) ;
137- } ;
139+ }
140+ } else {
141+ insertion_binding ( c)
138142 }
139- insertion_binding ( c)
140143 } ) ;
141144
142145 let insert_join = meta. many_to_one_joins ( ) . map ( |c| insert_join ( c) ) ;
@@ -152,6 +155,7 @@ pub fn impl_Insert(db: &dyn OrmliteCodegen, meta: &TableMeta, model: &Ident, ret
152155 impl :: ormlite:: model:: Insert <#db> for #model {
153156 type Model = #returns;
154157
158+ #[ allow( unused_mut) ]
155159 fn insert<' a, A >( self , db: A ) -> #box_future<' a, :: ormlite:: Result <Self :: Model >>
156160 where
157161 A : ' a + Send + :: ormlite:: Acquire <' a, Database = #db>,
@@ -214,3 +218,54 @@ pub fn insert_join(c: &ColumnMeta) -> TokenStream {
214218 } ;
215219 }
216220}
221+
222+ pub fn impl_Model__insert_many ( db : & dyn OrmliteCodegen , meta : & ModelMeta , _mc : & MetadataCache ) -> TokenStream {
223+ let box_future = crate :: util:: box_fut_ts ( ) ;
224+ let placeholder = db. placeholder_ts ( ) ;
225+ let dialect = db. dialect_ts ( ) ;
226+ let db = db. database_ts ( ) ;
227+
228+ let query_bindings = meta. database_columns ( ) . map ( |c| {
229+ if let Some ( rust_default) = & c. rust_default {
230+ let default: syn:: Expr = syn:: parse_str ( & rust_default) . expect ( "Failed to parse default_value" ) ;
231+ quote ! {
232+ q = q. bind( #default ) ;
233+ }
234+ } else if c. is_join ( ) {
235+ let name = & c. ident ;
236+ quote ! {
237+ q = q. bind( model. #name. _id( ) ) ;
238+ }
239+ } else {
240+ insertion_binding ( c)
241+ }
242+ } ) . collect_vec ( ) ;
243+
244+ quote ! {
245+ fn insert_many<' e, E >( values: Vec <Self >, db: E ) -> #box_future<' e, :: ormlite:: Result <Vec <Self >>>
246+ where
247+ E : ' e + :: ormlite:: Executor <' e, Database = #db>,
248+ {
249+ Box :: pin( async move {
250+ let table = <Self as :: ormlite:: TableMeta >:: table_name( ) ;
251+ let columns = <Self as :: ormlite:: TableMeta >:: table_columns( ) ;
252+ let mut sql_values = :: ormlite:: __private:: Values :: Values ( Vec :: new( ) ) ;
253+ for _ in 0 ..values. len( ) {
254+ let mut value = :: ormlite:: __private:: Value :: new( ) ;
255+ value = value. placeholders( columns. len( ) , #dialect) ;
256+ sql_values = sql_values. value( value) ;
257+ }
258+ let sql = :: ormlite:: __private:: Insert :: new( table)
259+ . columns( columns)
260+ . values( sql_values)
261+ . returning( columns) ;
262+ let sql = :: ormlite:: __private:: ToSql :: to_sql( & sql, #dialect) ;
263+ let mut q = :: ormlite:: query_as:: <#db, Self >( & sql) ;
264+ for model in values {
265+ #( #query_bindings) *
266+ }
267+ q. fetch_all( db) . await . map_err( Into :: into)
268+ } )
269+ }
270+ }
271+ }
0 commit comments