Closed ppKrauss closed 2 years ago
@0e1 , usar preserv/data/codec_type.csv.
ingestão periódica no make
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.
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
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
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:
O valor de codec do YAML precisa ser um valor precsente na coluna extension de Codec_type. Se for uma variante de extensão precisa ser expresso com ~
separando. Por exemplo CSV~ponto-e-virgula
.
A extensão do arquivo-origem pode ser indicativo de codec quando o mesmo não estiver presente no YAML, neste caso é equiparado à extensão default de mesmo nome, case insensitive. Por exemplo file.csv
é interpretado como extension CSV
com variante default.
No valor codec do YAML é permitida a parametrição, ignorando-se existência de variante em Codec_type. Por exemplo codec: CSV;charset=Windows-1252
é o CSV default com a sobreposição do charset indicado.
Quando o arquivo possui extensão conhecida, a extensão em si representa o CODEC. Tipicamente extensão GeoJSON é suficiente para ceder todos os metadados de CODEC. Outras como SHP e CSV podem ser insuficientes.
Para definir parâmetros de codec globais ou locais que se sobreponham aos codecs ou extenções default, usar globalmente codec:descr_encode: {{definição}}
. Por exemplo: codec:descr_encode: srid=12345
vai sobrescrever os codecs definidos por extensção localmente.. E aí só explicitando, por exemplo codec: GeoJSON; srid=4326
para poder sobrescrever o srid global.
Regras de escopo:
Regras de default:
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