-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdb2parquet.rs
30 lines (23 loc) · 1.03 KB
/
db2parquet.rs
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
//! Database to Parquet file
//!
//! SqlReader + ParquetWriter
use std::io::Cursor;
use actix_web::{http::header::ContentType, web, HttpResponse, Result};
use fabrix::{sql_adt, DatabaseSqlite, FromSource, ParquetWriter, SqlReadOptions, SqlReader};
use crate::{AppError, DB_CONN};
pub async fn db_to_parquet(select: web::Json<sql_adt::Select>) -> Result<HttpResponse> {
let mut reader = SqlReader::<DatabaseSqlite>::new_from_str(DB_CONN)
.await
.map_err(AppError::Fabrix)?;
let table_name = select.0.get_table();
let select = SqlReadOptions::from_sql_select(&select.0);
let fx = reader.async_read(&select).await.map_err(AppError::Fabrix)?;
let mut bytes = Vec::new();
let mut writer = ParquetWriter::new(Cursor::new(&mut bytes));
writer.finish(fx).map_err(AppError::Fabrix)?;
let cd = format!("attachment; filename={table_name}.parquet");
Ok(HttpResponse::Ok()
.append_header(("content-disposition", cd.as_str()))
.append_header(ContentType::octet_stream())
.body(bytes))
}