From 47d0f971fcf64d1bb036f0081d2ff209ec5007ee Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Thu, 17 Feb 2022 05:31:06 +0900 Subject: initial commit --- scripts/boostrap-steam-db.bash | 22 ++++++++ scripts/jq/transform-creators.jq | 1 + scripts/jq/transform-product-creators.jq | 6 ++ scripts/jq/transform-products.jq | 11 ++++ scripts/update-schema-models.bash | 95 ++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+) create mode 100644 scripts/boostrap-steam-db.bash create mode 100644 scripts/jq/transform-creators.jq create mode 100644 scripts/jq/transform-product-creators.jq create mode 100644 scripts/jq/transform-products.jq create mode 100644 scripts/update-schema-models.bash (limited to 'scripts') diff --git a/scripts/boostrap-steam-db.bash b/scripts/boostrap-steam-db.bash new file mode 100644 index 0000000..ca06dd2 --- /dev/null +++ b/scripts/boostrap-steam-db.bash @@ -0,0 +1,22 @@ +#!/bin/bash +set -euo pipefail +tmp="$(mktemp -d)" +trap 'rm -rf -- "$tmp"' EXIT + +# deps +hash sqlite3 rq + +# first generate clean db +bash update-schema-models.bash + +for db in kanta; do + rm -f "$db".sqlite{,-shm,-wal} + sqlite3 "$db".sqlite < db/"$db".sql + sqlite3 "$db".sqlite <<'EOF' +insert into engines (id, name) values (0, "generic"); +insert into roles (id, name) values (0, "developer"); +EOF + jq -r -f scripts/jq/transform-creators.jq steam-dataset-messy/steam.json | sqlite3 "$db".sqlite + jq -r -f scripts/jq/transform-products.jq steam-dataset-messy/steam.json | sqlite3 "$db".sqlite + jq -r -f scripts/jq/transform-product-creators.jq steam-dataset-messy/steam.json | sqlite3 "$db".sqlite +done diff --git a/scripts/jq/transform-creators.jq b/scripts/jq/transform-creators.jq new file mode 100644 index 0000000..90b47d2 --- /dev/null +++ b/scripts/jq/transform-creators.jq @@ -0,0 +1 @@ +[.[].developers] | flatten | unique | .[] | "insert into creators (name) values ('\(. | gsub("'"; "''"))');" diff --git a/scripts/jq/transform-product-creators.jq b/scripts/jq/transform-product-creators.jq new file mode 100644 index 0000000..1a1bef7 --- /dev/null +++ b/scripts/jq/transform-product-creators.jq @@ -0,0 +1,6 @@ +.[] | select(has("steam_appid") and .type=="game") | + "insert into product_creators (creator, product, role) values ( + (select id from creators where name = '\(.developers[0]? // "" | gsub("'"; "''"))'), + \(.steam_appid), + 0 + );" diff --git a/scripts/jq/transform-products.jq b/scripts/jq/transform-products.jq new file mode 100644 index 0000000..48f51e7 --- /dev/null +++ b/scripts/jq/transform-products.jq @@ -0,0 +1,11 @@ +.[] | select(has("steam_appid") and .type=="game") | + "insert into products (id, engine, platforms, price, title, body, short, header) values ( + \(.steam_appid), + 0, + 0, + \(.price_overview.final? // 0), + '\(.name? // "no-name" | gsub("'"; "''"))', + '\(.detailed_description? // "no-desc" | gsub("'"; "''"))', + '\(.short_description? // "no-short-desc" | gsub("'"; "''"))', + '\(.header_image? // "https://waifu.cloudef.pw/loading.png" | gsub("'"; "''"))' + );" diff --git a/scripts/update-schema-models.bash b/scripts/update-schema-models.bash new file mode 100644 index 0000000..f91f043 --- /dev/null +++ b/scripts/update-schema-models.bash @@ -0,0 +1,95 @@ +#!/bin/bash +set -euo pipefail +tmp="$(mktemp -d)" +trap 'rm -rf -- "$tmp"' EXIT + +# deps +hash sqlite3 diesel diesel_ext rustfmt + +gen_route() { + local upper="$1" + local lower="$(sed 's/[[:upper:]]/_&/g;s/^_//' <<<"$upper" | tr '[:upper:]' '[:lower:]')" +cat <) -> Result>> { + let data = input.clone(); + db.run(move |conn| { + diesel::insert_into(${lower}s::table) + .values(&data) + .execute(conn) + }) + .await?; + Ok(Created::new("/").body(input)) +} + +#[get("/$lower/")] +async fn get_$lower(db: Db, id: i64) -> Option> { + db.run(move |conn| ${lower}s::table.filter(${lower}s::id.eq(id)).first(conn)) + .await + .map(InOut) + .ok() +} +EOF +} + +gen_routes() { + local db="$1" +cat <> = std::result::Result; +EOF + + grep 'pub struct' "$tmp"/model.rs | grep -v 'User' | while read -r _ _ name _; do + gen_route "$name" + done + +cat <, path: &str) -> Rocket { + rocket.attach(Db::fairing()).mount(path, routes![ +EOF + + grep 'pub struct' "$tmp"/model.rs | grep -v 'User' | while read -r _ _ name _; do + local lower="$(sed 's/[[:upper:]]/_&/g;s/^_//' <<<"$name" | tr '[:upper:]' '[:lower:]')" + printf ' %s,\n' "put_$lower" + printf ' %s,\n' "get_$lower" + done + +cat < Timestamp/created_at -> Nullable/g' |\ + sed 's/id -> BigInt/id -> Nullable/g' |\ + sed 's/meta -> Text/meta -> Nullable/g' \ + > "$tmp"/schema.rs + diesel_ext -s "$tmp"/schema.rs -m \ + -d 'Serialize, Deserialize, Queryable, Insertable, Clone, Debug' \ + -I 'rocket::serde::{Serialize, Deserialize}' |\ + awk '/#\[derive/{print;print "#[serde(crate = \"rocket::serde\")]";next}1' \ + > "$tmp"/model.rs + gen_routes "$db" | cat "$tmp"/schema.rs "$tmp"/model.rs - |\ + grep -v '^// Generated by diesel_ext' |\ + grep -v '^#!' > src/"$db".rs + rustfmt --edition 2021 src/"$db".rs +done -- cgit v1.2.3-70-g09d2