Skip to content

Commit 9c7eccd

Browse files
committed
update
1 parent 34e6bf1 commit 9c7eccd

File tree

9 files changed

+277
-0
lines changed

9 files changed

+277
-0
lines changed

Taskfile.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ includes:
3636
taskfile: crates/rs-sql/rs-sqlcipher
3737
dir: crates/rs-sql/rs-sqlcipher
3838

39+
pkg:
40+
taskfile: crates/rs-pkg
41+
dir: crates/rs-pkg
3942

4043

4144
#

crates/rs-pkg/Cargo.toml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
[package]
2+
name = "rs-pkg"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[workspace]
9+
members = []
10+
11+
12+
[dependencies]
13+
tokio = { version = "1", features = ["full"] }
14+
anyhow = "1"
15+
16+
serde_json = "1"
17+
serde = { version = "1", features = ["derive"] }
18+
19+
# logging
20+
tracing = "0.1"
21+
tracing-subscriber = "0.3"
22+
23+
once_cell = "1"
24+
parking_lot = "0"
25+
26+
# encrypted kv:
27+
microkv = "0"
28+
29+
# kv:
30+
pickledb = "0"
31+
32+
sqlx = { version = "0.6", features = ["runtime-tokio-rustls", "sqlite"] }
33+
sqlx-rt = "0"
34+
#sqlx-macros = "0.6"
35+
#sqlx-macros = { version = "^0.6" }

crates/rs-pkg/Taskfile.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
version: "3"
2+
3+
tasks:
4+
init:
5+
- echo "init"
6+
7+
dev:
8+
cmds:
9+
- echo "dev install"
10+
- cargo install cargo-edit
11+
- cargo install cargo-outdated
12+
- cargo install rust-i18n
13+
- cargo install tauri-cli
14+
15+
install:
16+
cmds:
17+
- task: build
18+
19+
build:
20+
cmds:
21+
- task: update
22+
# - RUST_I18N_DEBUG=1 cargo build
23+
- cargo build
24+
25+
check:
26+
cmds:
27+
- cargo sqlx prepare
28+
- cargo sqlx prepare --check
29+
dir: "src-tauri"
30+
ignore_error: true
31+
32+
kill:
33+
cmds:
34+
- fig run kill-all-processes-at-port --port 7173
35+
36+
test:
37+
cmds:
38+
- echo "test"
39+
# - task: clean:test
40+
- RUST_BACKTRACE=1 RUST_LOG=debug macro_backtrace=1 cargo test -- --nocapture
41+
42+
update:
43+
cmds:
44+
- cargo outdated # RUST_BACKTRACE=1 RUST_LOG=debug
45+
- cargo upgrade # RUST_BACKTRACE=1 RUST_LOG=debug
46+
47+
clean:
48+
cmds:
49+
- cargo clean
50+
51+
clean:test:
52+
cmds:
53+
- rm *.db
54+
dir: "tmp/"
55+
ignore_error: true
56+
57+
58+
release:
59+
cmds:
60+
- echo "release"
61+
- pnpm build
62+
63+
fix:
64+
cmds:
65+
- cargo metadata --verbose --format-version 1 --all-features

crates/rs-pkg/readme.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# rust common utils
2+
3+
- common utils for rust.
4+
- extensions for rust std lib.
5+
- wrappers for rust 3rd party libs.
6+
7+
## Features:
8+
9+
> std lib:
10+
11+
- [ ] xxx
12+
13+
> 3rd party libs:
14+
15+
- [x] sqlx wrapper
16+
17+
## Usage
18+
19+
```toml
20+
21+
# cargo.toml
22+
rs-pkg = { git = "" }
23+
24+
25+
```

crates/rs-pkg/src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
pub mod x;
2+
3+
pub fn add(left: usize, right: usize) -> usize {
4+
left + right
5+
}
6+
7+
#[cfg(test)]
8+
mod tests {
9+
use super::*;
10+
11+
#[test]
12+
fn it_works() {
13+
let result = add(2, 2);
14+
assert_eq!(result, 4);
15+
}
16+
}

crates/rs-pkg/src/x/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub use storage::*;
2+
3+
pub mod storage;

crates/rs-pkg/src/x/storage/kv.rs

Whitespace-only changes.

crates/rs-pkg/src/x/storage/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pub use kv::*;
2+
pub use sql::*;
3+
4+
pub mod kv;
5+
pub mod sql;

crates/rs-pkg/src/x/storage/sql.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
use std::str::FromStr;
2+
3+
use sqlx::{
4+
migrate::Migrator,
5+
sqlite::{SqliteConnectOptions, SqlitePoolOptions},
6+
ConnectOptions, SqlitePool,
7+
};
8+
9+
// db 存储方案: SqlClient
10+
pub struct SqliteClient {
11+
pub cli: SqlitePool,
12+
}
13+
14+
impl Clone for SqliteClient {
15+
fn clone(&self) -> Self {
16+
Self { cli: self.cli.clone() }
17+
}
18+
}
19+
20+
impl SqliteClient {
21+
pub async fn default() -> Self {
22+
Self::new(None, None).await
23+
}
24+
25+
pub async fn new(db_name: Option<&str>, migrations: Option<&str>) -> Self {
26+
// let mut _root_dir = tauri::api::path::document_dir();
27+
28+
// sqlite:tmp/app.db
29+
// let url = env::var("").unwrap_or(util::app_cfg::get_local_sqlite_url(Some(db_name)));
30+
let db_url = util::fmt_local_sqlite_url(db_name);
31+
32+
// todo x: 仅用于创建 db 文件
33+
let _ = SqliteConnectOptions::from_str(&db_url)
34+
.unwrap()
35+
.create_if_missing(true)
36+
.connect()
37+
.await
38+
.expect("connect to sqlite failed");
39+
40+
// connect pool
41+
let cli = SqlitePoolOptions::new().min_connections(2).connect(&db_url).await;
42+
43+
match cli {
44+
Ok(c) => {
45+
let dir = migrations.unwrap_or("./migrations");
46+
47+
// if dir exist, do migrate
48+
if std::path::Path::new(dir).exists() {
49+
// todo x: 自动执行 db migrations
50+
let m =
51+
Migrator::new(std::path::Path::new(dir)).await.expect("migrations failed");
52+
53+
match m.run(&c).await {
54+
Ok(_) => {
55+
println!("migrations run success");
56+
},
57+
Err(e) => {
58+
panic!("migrations run error: {:?}", e);
59+
},
60+
}
61+
}
62+
63+
// // todo x: 初始化表结构
64+
// sqlx::migrate!(migrations.unwrap_or("./migrations"))
65+
// .run(&conn)
66+
// .await
67+
// .expect("migrate failed");
68+
69+
Self { cli: c }
70+
},
71+
Err(e) => {
72+
panic!("connect to sqlite db failed: {}", e);
73+
},
74+
}
75+
}
76+
}
77+
78+
pub mod util {
79+
use std::{env, path::PathBuf};
80+
81+
pub fn local_tmp_dir() -> PathBuf {
82+
let tmp_local = "tmp";
83+
84+
let mut current_dir = env::current_dir().expect("get current directory failed");
85+
let tmp_dir = current_dir.join(tmp_local);
86+
if !tmp_dir.exists() {
87+
std::fs::create_dir(&tmp_dir).expect("create tmp dir failed");
88+
}
89+
tmp_dir
90+
}
91+
92+
pub fn fmt_local_sqlite_url(db_name: Option<&str>) -> String {
93+
let fp = db_name.unwrap_or("app.db");
94+
let prefix = "sqlite:";
95+
format!("{}{}", prefix, local_tmp_dir().join(fp).to_str().unwrap())
96+
}
97+
98+
#[cfg(test)]
99+
mod test {
100+
use super::*;
101+
102+
#[test]
103+
fn test_get_local_sqlite_url() {
104+
let cases = [None, Some("test.db")];
105+
106+
// iter
107+
for case in cases.iter() {
108+
let url = fmt_local_sqlite_url(*case);
109+
println!("url: {}", url);
110+
}
111+
}
112+
}
113+
}
114+
115+
#[cfg(test)]
116+
mod test {
117+
use tokio;
118+
119+
use super::*;
120+
121+
#[tokio::test]
122+
async fn test_new_sqlite_client() {
123+
let db = SqliteClient::default().await;
124+
}
125+
}

0 commit comments

Comments
 (0)