|
@@ -17,6 +17,7 @@ local transformers = require "pocket_archive.transformers"
|
|
local validator = require "pocket_archive.validator"
|
|
local validator = require "pocket_archive.validator"
|
|
|
|
|
|
local logger = pkar.logger
|
|
local logger = pkar.logger
|
|
|
|
+local dbg = require "debugger"
|
|
|
|
|
|
-- "nil" table - for missing key fallback in chaining.
|
|
-- "nil" table - for missing key fallback in chaining.
|
|
local NT = {}
|
|
local NT = {}
|
|
@@ -211,23 +212,26 @@ M.rsrc_to_graph = function(rsrc)
|
|
-- id is the subject, it won't be an attribute.
|
|
-- id is the subject, it won't be an attribute.
|
|
if k == "id" then goto skip end
|
|
if k == "id" then goto skip end
|
|
|
|
|
|
- logger:debug("Adding attribute:", k, pp.write(v))
|
|
|
|
|
|
+ logger:debug(("Adding attribute: %s = %s"):format(k, pp.write(v)))
|
|
local p = term.new_iriref_ns(k)
|
|
local p = term.new_iriref_ns(k)
|
|
local o
|
|
local o
|
|
- if type(v) == "table" then
|
|
|
|
- for vv in pairs(v) do
|
|
|
|
- if ((rmod.properties or NT)[k] or NT).type == "resource" then
|
|
|
|
- o = term.new_iriref_ns(vv)
|
|
|
|
- else o = term.new_lit(vv) end
|
|
|
|
- table.insert(triples, triple.new(s, p, o))
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
|
|
+ local datatype = ((rmod.properties or NT)[k] or NT).type
|
|
|
|
+ local rdf_type_str = pkar.config.md.datatypes[datatype]
|
|
|
|
+ local rdf_type
|
|
|
|
+ if rdf_type_str then
|
|
|
|
+ rdf_type = term.new_iriref_ns(rdf_type_str).data
|
|
|
|
+ end
|
|
|
|
+ -- Force all fields to be multi-valued.
|
|
|
|
+ if type(v) ~= "table" then v = {[v] = true} end
|
|
|
|
+ for vv in pairs(v) do
|
|
if k == "pas:contentType" then
|
|
if k == "pas:contentType" then
|
|
- v = "pas:" .. v
|
|
|
|
|
|
+ vv = "pas:" .. vv
|
|
end
|
|
end
|
|
- if ((rmod.properties or NT)[k] or NT).type == "resource" then
|
|
|
|
- o = term.new_iriref_ns(v)
|
|
|
|
- else o = term.new_lit(v) end
|
|
|
|
|
|
+ if datatype == "resource" then
|
|
|
|
+ o = term.new_iriref_ns(vv)
|
|
|
|
+ elseif datatype == "ext_resource" then
|
|
|
|
+ o = term.new_iriref(vv)
|
|
|
|
+ else o = term.new_lit(vv, rdf_type) end
|
|
table.insert(triples, triple.new(s, p, o))
|
|
table.insert(triples, triple.new(s, p, o))
|
|
end
|
|
end
|
|
::skip::
|
|
::skip::
|
|
@@ -237,7 +241,7 @@ M.rsrc_to_graph = function(rsrc)
|
|
triples, triple.new(s, pkar.RDF_TYPE, term.new_iriref_ns(m)))
|
|
triples, triple.new(s, pkar.RDF_TYPE, term.new_iriref_ns(m)))
|
|
end
|
|
end
|
|
|
|
|
|
- local gr = graph.new(nil, rsrc.id, true)
|
|
|
|
|
|
+ local gr = graph.new(nil)
|
|
-- This is a full replacement.
|
|
-- This is a full replacement.
|
|
--require "debugger"()
|
|
--require "debugger"()
|
|
logger:info("Removing triples.")
|
|
logger:info("Removing triples.")
|
|
@@ -247,16 +251,15 @@ M.rsrc_to_graph = function(rsrc)
|
|
-- in the previous loop.
|
|
-- in the previous loop.
|
|
gr:add(triples)
|
|
gr:add(triples)
|
|
|
|
|
|
- return gr
|
|
|
|
|
|
+ return gr, s
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
-M.store_updates = function(gr)
|
|
|
|
|
|
+M.store_updates = function(tmp_gr, s)
|
|
-- TODO use a transaction when volksdata_lua supports it.
|
|
-- TODO use a transaction when volksdata_lua supports it.
|
|
- logger:debug("Graph: ", tostring(gr))
|
|
|
|
- for trp in gr:lookup() do logger:debug(tostring(trp)) end
|
|
|
|
|
|
+ logger:debug("Graph: ", tmp_gr:encode("ttl"))
|
|
|
|
|
|
- local val_report = validator.validate(gr)
|
|
|
|
|
|
+ local val_report = validator.validate(tmp_gr, s)
|
|
if val_report.max_level == "ERROR" then error(
|
|
if val_report.max_level == "ERROR" then error(
|
|
"Validation raised errors: " .. pp.write(val_report))
|
|
"Validation raised errors: " .. pp.write(val_report))
|
|
elseif val_report.max_level == "WARN" then logger:warn(
|
|
elseif val_report.max_level == "WARN" then logger:warn(
|
|
@@ -266,7 +269,7 @@ M.store_updates = function(gr)
|
|
|
|
|
|
local stored_gr = graph.new(pkar.store, term.DEFAULT_CTX)
|
|
local stored_gr = graph.new(pkar.store, term.DEFAULT_CTX)
|
|
|
|
|
|
- return gr:copy(stored_gr)
|
|
|
|
|
|
+ return tmp_gr:copy(stored_gr)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
@@ -303,7 +306,8 @@ M.deposit = function(sip)
|
|
fsize = fsize + #chunk
|
|
fsize = fsize + #chunk
|
|
end
|
|
end
|
|
local checksum = hash_it:final(true)
|
|
local checksum = hash_it:final(true)
|
|
- rsrc["premis:hasMessageDigest"] = {["blake2:" .. checksum] = true}
|
|
|
|
|
|
+ rsrc["premis:hasMessageDigest"] = {
|
|
|
|
+ ["urn:blake2:" .. checksum] = true}
|
|
rsrc["dc:extent"] = fsize
|
|
rsrc["dc:extent"] = fsize
|
|
|
|
|
|
ofh:close()
|
|
ofh:close()
|