feat(db): add a database using rusqlite.

This commit is contained in:
ryan 2025-01-17 18:51:59 +03:00
parent a99b5164d8
commit c8f32d027f
5 changed files with 158 additions and 8 deletions

93
Cargo.lock generated
View file

@ -8,7 +8,7 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a"
dependencies = [
"bitflags",
"bitflags 2.6.0",
"bytes",
"futures-core",
"futures-sink",
@ -29,7 +29,7 @@ dependencies = [
"actix-service",
"actix-utils",
"actix-web",
"bitflags",
"bitflags 2.6.0",
"bytes",
"derive_more",
"futures-core",
@ -52,9 +52,9 @@ dependencies = [
"actix-rt",
"actix-service",
"actix-utils",
"ahash",
"ahash 0.8.11",
"base64",
"bitflags",
"bitflags 2.6.0",
"brotli",
"bytes",
"bytestring",
@ -169,7 +169,7 @@ dependencies = [
"actix-service",
"actix-utils",
"actix-web-codegen",
"ahash",
"ahash 0.8.11",
"bytes",
"bytestring",
"cfg-if",
@ -233,6 +233,17 @@ dependencies = [
"generic-array",
]
[[package]]
name = "ahash"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
dependencies = [
"getrandom",
"once_cell",
"version_check",
]
[[package]]
name = "ahash"
version = "0.8.11"
@ -510,6 +521,12 @@ dependencies = [
"serde",
]
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.6.0"
@ -730,6 +747,7 @@ dependencies = [
"leptos_meta",
"leptos_router",
"nostr-sdk",
"rusqlite",
"secp256k1 0.30.0",
"serde",
"serde_json",
@ -982,6 +1000,18 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "fallible-iterator"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
[[package]]
name = "fallible-streaming-iterator"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
[[package]]
name = "flate2"
version = "1.0.35"
@ -1227,6 +1257,15 @@ dependencies = [
"crunchy",
]
[[package]]
name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash 0.7.8",
]
[[package]]
name = "hashbrown"
version = "0.13.2"
@ -1239,7 +1278,7 @@ version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"ahash 0.8.11",
"allocator-api2",
]
@ -1254,6 +1293,15 @@ dependencies = [
"foldhash",
]
[[package]]
name = "hashlink"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
dependencies = [
"hashbrown 0.11.2",
]
[[package]]
name = "hex-conservative"
version = "0.1.2"
@ -1810,6 +1858,16 @@ version = "0.2.168"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d"
[[package]]
name = "libsqlite3-sys"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14"
dependencies = [
"pkg-config",
"vcpkg",
]
[[package]]
name = "linear-map"
version = "1.2.0"
@ -2380,7 +2438,7 @@ version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
dependencies = [
"bitflags",
"bitflags 2.6.0",
]
[[package]]
@ -2447,6 +2505,21 @@ dependencies = [
"thiserror 1.0.69",
]
[[package]]
name = "rusqlite"
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a"
dependencies = [
"bitflags 1.3.2",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
"libsqlite3-sys",
"memchr",
"smallvec",
]
[[package]]
name = "rustc-demangle"
version = "0.1.24"
@ -3284,6 +3357,12 @@ version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version_check"
version = "0.9.5"

View file

@ -16,6 +16,7 @@ leptos_meta = { version = "0.6" }
leptos_actix = { version = "0.6", optional = true }
leptos_router = { version = "0.6" }
wasm-bindgen = "=0.2.99"
rusqlite = "0.27.0"
serde = { version = "1.0", features = ["derive"] }
uuid = { version = "1.0", features = ["v4"] }
web-sys = { version = "0.3", features = ["Event"] }

69
src/db.rs Normal file
View file

@ -0,0 +1,69 @@
use rusqlite::{Connection, Error};
use serde::{Deserialize, Serialize};
// Define a struct to represent a database connection
#[derive(Debug)]
pub struct Database {
conn: Connection,
}
impl Database {
// Create a new database connection
pub fn new(db_path: &str) -> Result<Self, Error> {
let conn = Connection::open(db_path)?;
Ok(Database { conn })
}
// Create the database schema
pub fn create_schema(&self) -> Result<(), Error> {
self.conn.execute_batch("
CREATE TABLE IF NOT EXISTS items (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
wikidata_id TEXT,
custom_properties TEXT
);
")?;
Ok(())
}
// Insert a new item into the database
pub fn insert_item(&self, item: &DbItem) -> Result<(), Error> {
let wikidata_id = item.wikidata_id.as_ref().map(|s| s.as_str()).unwrap_or("");
self.conn.execute(
"INSERT INTO items (id, name, description, wikidata_id, custom_properties) VALUES (?, ?, ?, ?, ?);",
&[&item.id, &item.name, &item.description, &wikidata_id.to_string(), &item.custom_properties],
)?;
Ok(())
}
// Retrieve all items from the database
pub fn get_items(&self) -> Result<Vec<DbItem>, Error> {
let mut stmt = self.conn.prepare("SELECT * FROM items;")?;
let items = stmt.query_map([], |row| {
Ok(DbItem {
id: row.get(0)?,
name: row.get(1)?,
description: row.get(2)?,
wikidata_id: row.get(3)?,
custom_properties: row.get(4)?,
})
})?;
let mut result = Vec::new();
for item in items {
result.push(item?);
}
Ok(result)
}
}
// Define a struct to represent an item in the database
#[derive(Debug, Deserialize, Serialize)]
pub struct DbItem {
pub id: String,
pub name: String,
pub description: String,
pub wikidata_id: Option<String>,
pub custom_properties: String,
}

View file

@ -2,6 +2,7 @@ pub mod app;
pub mod components;
pub mod models;
pub mod nostr;
pub mod db;
#[cfg(feature = "hydrate")]

View file

@ -7,7 +7,7 @@ pub struct Item {
pub id: String,
pub name: String,
pub description: String,
pub reviews: Vec<ReviewWithRating>,
// pub reviews: Vec<ReviewWithRating>,
pub wikidata_id: Option<String>,
pub custom_properties: HashMap<String, String>,
}