diff --git a/default.nix b/default.nix
index 01ecf46..6f306ac 100644
--- a/default.nix
+++ b/default.nix
@@ -88,7 +88,7 @@ lib.makeScope pkgs.newScope (
datasette-settings = self.callPackage (
{ formats }:
(formats.json { }).generate "datasette-settings.json" {
- sql_time_limit_ms = 8000;
+ sql_time_limit_ms = 16000;
}
) { };
datasette-metadata = self.callPackage (
@@ -122,38 +122,18 @@ lib.makeScope pkgs.newScope (
CudaArtifact
s (identified by sha256
)
claiming the same (pname, version, platform)
triple
'';
- sql = ''
- SELECT
- COUNT(DISTINCT sha256) AS conflicts,
- pname.str AS pname,
- ver.str AS ver,
- plat.str AS plat,
- GROUP_CONCAT(name.str, char(10)) AS name,
- GROUP_CONCAT(tag.str, char(10)) AS tag,
- GROUP_CONCAT(h.hash, char(10)) AS sha256
- FROM
- (
- CudaArtifact AS cc,
- Str AS name,
- Str AS pname,
- Str as ver,
- Str as plat,
- Hash as h
- ON cc.name=name.id
- AND cc.pname=pname.id
- AND cc.version = ver.id
- AND cc.platform = plat.id
- AND cc.sha256 = h.id
- )
- LEFT JOIN Str AS tag
- ON
- cc.compat_tag=tag.id
- GROUP BY
- cc.pname, cc.version, cc.platform
- HAVING
- conflicts >= CAST(:min_conflicts AS INTEGER)
- ORDER BY conflicts DESC
+ sql = builtins.readFile ./src/q/summary-cuda-conflicts.sql;
+ };
+ queries.cuda_pnames = {
+ title = "Known CUDA Artifacts";
+ description_html = ''
+ Overview of known CUDA artifacts sorted by pname
'';
+ sql = builtins.readFile ./src/q/summary-cuda-pnames.sql;
+ };
+ queries.cuda_platforms = {
+ title = "CUDA: Supported Platforms ";
+ sql = builtins.readFile ./src/q/summary-cuda-platforms.sql;
};
};
};
diff --git a/src/main.rs b/src/main.rs
index ec3a3e5..0036224 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -186,7 +186,7 @@ async fn open_context(
}
let con = rusqlite::Connection::open(&db_path).expect("Failed to construct Database object");
- con.pragma_update(None, "jorunal_mode", "wal").unwrap();
+ con.pragma_update(None, "journal_mode", "wal").unwrap();
con.pragma_update(None, "synchronous", "normal").unwrap();
con.pragma_update(None, "temp_store", "memory").unwrap();
con.pragma_update(None, "foreign_keys", "on").unwrap();
@@ -238,6 +238,86 @@ where
}
}
+trait ConnectionLike {
+ #[allow(dead_code)]
+ fn execute(&self, sql: &str, params: P) -> rusqlite::Result;
+ fn prepare_cached(&self, sql: &str) -> rusqlite::Result>;
+}
+
+impl ConnectionLike for rusqlite::Connection {
+ fn execute(&self, sql: &str, params: P) -> rusqlite::Result {
+ ::execute(self, sql, params)
+ }
+
+ fn prepare_cached(&self, sql: &str) -> rusqlite::Result> {
+ ::prepare_cached(self, sql)
+ }
+}
+
+impl<'a> ConnectionLike for rusqlite::Transaction<'a> {
+ fn execute(&self, sql: &str, params: P) -> rusqlite::Result {
+ ::execute(self, sql, params)
+ }
+
+ fn prepare_cached(&self, sql: &str) -> rusqlite::Result> {
+ ::prepare_cached(self, sql)
+ }
+}
+
+impl<'a> ConnectionLike for rusqlite::Savepoint<'a> {
+ fn execute(&self, sql: &str, params: P) -> rusqlite::Result {
+ ::execute(self, sql, params)
+ }
+
+ fn prepare_cached(&self, sql: &str) -> rusqlite::Result> {
+ ::prepare_cached(self, sql)
+ }
+}
+
+fn db_add_sample(
+ tx: &mut rusqlite::Transaction<'_>,
+ uri: &str,
+ hash: &Option,
+ http_code: &Option,
+ content_type: &Option,
+) -> Result<(u32, u32), Error> {
+ let mut sp = tx.savepoint().context("db_add_sample")?;
+ sp.set_drop_behavior(rusqlite::DropBehavior::Commit);
+ {
+ if let Some(h) = hash {
+ db_add_blob(&mut sp, &h.clone(), None)?;
+ };
+ let mut add_sample = sp
+ .prepare_cached(include_str!("q/add-sample.sql"))
+ .context("Failed to prepare add-sample.sql")?;
+ return Ok(add_sample.query_row(
+ named_params! {
+ ":uri": uri,
+ ":hash": hash,
+ ":http_code": http_code,
+ ":content_type": content_type
+ },
+ |row| <(u32, u32)>::try_from(row),
+ )?);
+ }
+}
+fn db_add_blob(
+ con: &mut Con,
+ hash: &str,
+ n_bytes: Option,
+) -> Result {
+ let mut add_blob = con
+ .prepare_cached(include_str!("q/upsert-blob.sql"))
+ .context("Failed to prepare upsert-blob.sql")?;
+ Ok(add_blob.execute(params![hash, n_bytes,])?)
+}
+fn db_add_uri(con: &mut Con, uri: &str) -> Result {
+ let mut add_uri = con
+ .prepare_cached(include_str!("q/upsert-uri.sql"))
+ .context("Failed to prepare upsert-uri.sql")?;
+ Ok(add_uri.execute(params![uri])?)
+}
+
impl SidxContext {
async fn latest_sample(&self, uri: &str) -> Result