Skip to content
Snippets Groups Projects
Commit 0fc940e4 authored by Bruno Burke's avatar Bruno Burke :hamburger:
Browse files

pgstorage: add document_cache, change version to integer

parent c96d6da8
No related branches found
No related tags found
1 merge request!1Draft: Migration
Pipeline #95070 passed
(defproject document-storage "0.2.1"
(defproject document-storage "0.2.2"
:description "FIXME: write description"
:repositories [["internal" {:url "https://leukipp.fh-muenster.de:9082/releases"
:username "anonymous"}]]
......
......@@ -19,7 +19,7 @@ SELECT * FROM :i:repositories-table WHERE id = :repository-name
-- :name get-document-frame :? :1
-- :doc retrieve a document-frame given the uuid.
SELECT * FROM :i:repository-table WHERE id = :id
SELECT * FROM :i:repository-table WHERE id = :id::integer
-- :name get-document-versions :? :*
-- :doc retrieve all document-versions given the document-id.
......@@ -42,8 +42,8 @@ SELECT document_id
-- :name create-document-frame! :! :n
-- :doc creates a new document frame record
INSERT INTO :i:repository-table
(id, document_id, data_type, data_encoding, version, reference, "data")
VALUES (:uuid, :document-id, :type, :encoding, :version, :reference, :data)
(document_id, data_type, data_encoding, version, reference, "data")
VALUES (:document-id, :type, :encoding, :version, :reference, :data)
-- :name get-last-document-frame :? :1
-- :doc retrieve the last document-frame given the document-id.
......
-- :name create-document-cache! :! :n
-- :doc creates a new document cache record
INSERT INTO :i:cache-table
(repository, "document", "version", "data")
VALUES (:repository-name, :document-id, :version, :data)
-- :name get-cached-document :? :1
-- :doc retrieve cached document.
SELECT * FROM :i:cache-table WHERE "repository" = :repository-name
AND "document" = :document-id
AND "version" = :version
......@@ -4,9 +4,9 @@
-- :doc creates a new repository table
CREATE TABLE :i:repository-table (
document_id varchar(64) NOT NULL,
id varchar(32) NOT NULL,
id SERIAL,
data_type :i:ds-type-fqn NOT NULL,
reference varchar(32) NULL,
reference integer NULL,
created_at timestamptz(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"data" bytea NOT NULL,
datasize numeric NULL GENERATED ALWAYS AS (length("data")) STORED,
......@@ -38,3 +38,12 @@ DROP TABLE :i:repository-table;
DELETE FROM :i:repositories-table
WHERE id=:repository-name;
-- :name update-repository!
-- :command :execute
-- :result :raw
-- :doc update repository configuration
UPDATE :i:repositories-table
SET "versioning"=:versioning, caching=:caching
WHERE id=:repository-name;
......@@ -36,3 +36,13 @@ DO $$DECLARE
EXCEPTION
when others then
end $$;
--;;
CREATE TABLE IF NOT EXISTS :i:cache-table (
repository varchar(32) NOT NULL,
"document" varchar(64) NOT NULL,
"version" int8 NOT NULL,
"data" bytea NOT NULL,
datasize numeric NULL GENERATED ALWAYS AS (length("data")) STORED,
created_at timestamptz NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT newtable_pk PRIMARY KEY (repository,"document","version")
);
......@@ -2,7 +2,7 @@
(:require [clojure.tools.logging :as log]
[clojure.java.io :as io]
[clojure.edn :refer [read-string]]
[clojure.set :refer [difference]]
[clojure.set :refer [difference intersection]]
[clojure.string :as str]
[fipp.edn :refer [pprint] :rename {pprint fipp}]
[document-storage.protocol :as protocol]
......@@ -24,6 +24,7 @@
"Base Protocol for document storages"
(get-schema [this] "Return the db-schema name")
(create-repository [this repository] "Create a new repository")
(update-repository [this repository] "Update repository settings")
(delete-repository [this repository] "Delete a repository")
(cached-repository? [this repository] "Checks if the repository will use caching")
(run-query [this query-key params] "Run a Query on a DB-based Storage"))
......@@ -35,11 +36,17 @@
(create-repository [this {:keys [caching versioning] :or {caching false
versioning true}
:as repository}]
(log/info repository)
(.run-query this :create-repository!
{:repository (:name repository)
:caching caching
:versioning versioning}))
(update-repository [this {:keys [caching versioning] :or {caching false
versioning true}
:as repository}]
(.run-query this :update-repository!
{:repository (:name repository)
:caching caching
:versioning versioning}))
(delete-repository [this repository]
(.run-query this :delete-repository! {:repository repository}))
(run-query [this query-key params]
......@@ -54,6 +61,9 @@
:ds-type-fqn (str storage-schema
"."
"ds_type")
:cache-table (str storage-schema
"."
"document_cache")
:repositories-table (str storage-schema
"."
"repositories")
......@@ -80,6 +90,9 @@
existing-repos (set (map :id (.list-repositories this)))]
(log/info "Repositories: " repository-names)
(log/info "Existing Repositories: " existing-repos)
(doseq [r (intersection repository-names existing-repos)]
(log/info "Update Repository: " r)
(.update-repository this (vhelper/get-by repositories :name r)))
(doseq [r (difference repository-names existing-repos)]
(log/info "Create Repository: " r)
(.create-repository this (vhelper/get-by repositories :name r)))))
......
......@@ -29,7 +29,8 @@
connection
"sql/_ds_postgres.sql"
"sql/_ds_postgres_repository.sql"
"sql/_ds_postgres_storage.sql")}))
"sql/_ds_postgres_storage.sql"
"sql/_ds_postgres_cache.sql")}))
(defn disconnect! [connection]
(.close connection)
......
......@@ -26,7 +26,6 @@
(when-let [frame (get-last-document-frame storage document-id repository)]
(:version frame)))
(defn restore-document-version [storage document-id version repository]
(when-let [frames (.run-query storage :select-relevant-document-frames-by-version
{:repository repository
......@@ -49,12 +48,29 @@
:version version
:repository repository}))))))
(defn load-cached-document [storage repository document-id version load-doc-fn]
(if-let [document (.run-query storage :get-cached-document
{:repository repository
:document-id document-id
:version version})]
(encoding/decode-document (:data document))
(let [restored-document (load-doc-fn)]
(.run-query storage :create-document-cache!
{:repository repository
:document-id document-id
:version version
:data (encoding/encode-document restored-document)})
(load-cached-document storage repository document-id version load-doc-fn))))
(defn load-document
([storage document-id repository]
(when-let [last-document-version (get-last-document-version storage document-id repository)]
(load-document storage document-id last-document-version repository)))
([storage document-id version repository]
(restore-document-version storage document-id version repository)))
(let [restore-document-fn #(restore-document-version storage document-id version repository)]
(if (.cached-repository? storage repository)
(load-cached-document storage repository document-id version restore-document-fn)
(restore-document-fn)))))
(defn save-keyframe [storage document-id document last-version repository]
(let [doc (encoding/encode-document document)
......
......@@ -14,7 +14,7 @@
(reset! ds-atom
(dspostgres/make-postgres-ds
{:id :testing
:repositories {:testrepo {}}
:repositories {:testrepo {:caching true}}
:jdbc-url (env :database-url)}))
(f)
(.delete-repository @ds-atom :testrepo))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment