digital-guard / preserv

Digital Preservation Project
http://git.digital-guard.org/preserv
Apache License 2.0
0 stars 0 forks source link

Implementar codec conforme issue BR #31

Closed ppKrauss closed 2 years ago

ppKrauss commented 2 years ago

Ver https://github.com/digital-guard/preserv-BR/issues/20 mas garantindo que seja de uso geral, para outros além do Brasil, e corrigindo (refaturando) dados antigos que ainda não usavam codec

ppKrauss commented 2 years ago

@0e1 , usar preserv/data/codec_type.csv.

  1. ingestão periódica no make

  2. o CSV deve ser lido como FDW do tipo CSV e depois ingerido como tabela contendo campo JSONB. Tabela com UNIQUE(extension, variant) e codec_descriptor JOSONb carregado o primeiro item da array como objeto mime (ex. mime:"application/gzip"), e os demais com respectivos nomes (ex. content:"application/geo+json",charset:"UTF-8"). O mime e content precisam ser consistentes com a extension.

ppKrauss commented 2 years ago

O descritor de Codec é formato URL-encode, mas no JSON precisa estar já em decode:

CREATE or replace FUNCTION str_urldecode(p text) RETURNS text AS $f$
 SELECT convert_from(CAST(E'\\x' || string_agg(
    CASE WHEN length(r.m[1]) = 1 THEN encode(convert_to(r.m[1], 'SQL_ASCII'), 'hex')
    ELSE substring(r.m[1] from 2 for 2)
 END, '') AS bytea), 'UTF8')
FROM regexp_matches($1, '%[0-9a-f][0-9a-f]|.', 'gi') AS r(m);
  -- adapted from https://stackoverflow.com/a/8494602/287948
$f$ LANGUAGE SQL IMMUTABLE;

Conformem

0e1 commented 2 years ago

O descritor de Codec é formato URL-encode, mas no JSON precisa estar já em decode:

Apliquei str_urldecode apenas no delimiter, depois da string codec_descritor virar um jsonb. Se aplicar antes de tratar, ponto e vírgula é decodificado e impacta no split de codec_descritor.

@0e1 , usar preserv/data/codec_type.csv.

1. ingestão periódica no make

Criei um target em https://github.com/digital-guard/preserv/commit/6a37eeaf1a6eb2d4a37bf5a8cf22b364881daf63

2. o CSV deve ser lido como [FDW](https://www.postgresql.org/docs/current/ddl-foreign-data.html) do tipo CSV e depois ingerido como tabela contendo campo JSONB.   Tabela com  UNIQUE(extension, variant)  e codec_descriptor JOSONb carregado o primeiro item da array como  objeto `mime` (ex. `mime:"application/gzip"`), e os demais com respectivos nomes (ex. `content:"application/geo+json",charset:"UTF-8"`). O `mime` e `content` precisam ser consistentes com a  extension.

Tabela e função criadas em https://github.com/digital-guard/preserv/commit/170e8f9ee3457cdd264f411a7a5e622ec2f3e245

ppKrauss commented 2 years ago

Conforme nova tabela Codec_type, agora temos também SRID, pois SHP, GeoJSON e até CSV podem conter dados espaciais e demandar sobrescrever SRID fixado pela ferramenta de ingestão — tipicamente shp2pgsql é traumático no descarte que faz dessa informação, nos forçando a passar pela opção -s.

Regras de sintaxe:

Regras de escopo:

  1. Extensão do arquivo gera codec
  2. Codec explícito global sobrescreve elementos implícitos da extensão
  3. Codec explícito no YAML: tem precedencia sobre extensão.
  4. Escopo mais local/específico tem prioridade sobre mais global/genérico.

Regras de default:

  1. extensão sem variante é a default