scirs2_io/database/
bulk.rs1use crate::database::{DatabaseConnection, QueryBuilder};
4use crate::error::Result;
5use scirs2_core::ndarray::ArrayView2;
6
7#[derive(Debug, Clone)]
9pub struct BulkInsertConfig {
10 pub batch_size: usize,
11 pub commit_interval: Option<usize>,
12 pub on_conflict: ConflictStrategy,
13}
14
15#[derive(Debug, Clone, Copy)]
16pub enum ConflictStrategy {
17 Ignore,
18 Replace,
19 Error,
20}
21
22impl Default for BulkInsertConfig {
23 fn default() -> Self {
24 Self {
25 batch_size: 1000,
26 commit_interval: Some(10000),
27 on_conflict: ConflictStrategy::Error,
28 }
29 }
30}
31
32pub fn bulk_insert(
34 conn: &dyn DatabaseConnection,
35 table: &str,
36 data: ArrayView2<f64>,
37 columns: &[&str],
38 config: &BulkInsertConfig,
39) -> Result<usize> {
40 let mut total_inserted = 0;
41 let row_count = data.nrows();
42
43 for chunk_start in (0..row_count).step_by(config.batch_size) {
44 let chunk_end = (chunk_start + config.batch_size).min(row_count);
45 let chunk = data.slice(scirs2_core::ndarray::s![chunk_start..chunk_end, ..]);
46
47 total_inserted += conn.insert_array(table, chunk, columns)?;
48
49 if let Some(interval) = config.commit_interval {
50 if total_inserted % interval == 0 {
51 }
53 }
54 }
55
56 Ok(total_inserted)
57}
58
59pub fn bulk_update(
61 conn: &dyn DatabaseConnection,
62 table: &str,
63 data: ArrayView2<f64>,
64 key_columns: &[&str],
65 value_columns: &[&str],
66) -> Result<usize> {
67 conn.insert_array(table, data, &[key_columns, value_columns].concat())
74}