Skip to content

Load or MD5 check of binary files

Peter edited this page Sep 13, 2021 · 7 revisions

Antes de implementar a solução final, ver essa discussão e principalmente essa sugestão de Read... Mas pendente o teste de peformance com blob.


O uso de SHA256 é necessário apenas no pacote de preservação, o controle de arquivos de carga pode ser feito com MD5 por ser mais leve e um padrão mais amplamente utilizado nesse tipo de aplicação, com universo pequeno (sem risco de colizão no MD5 e impossível se ).

PS: como arquivos binários diversos usar imagens ou PDFs de print-css-rocks.

Adaptando tutorial 10 ways, parte "Large Object storage":

cd /tmp
wget -O lesson-basic-antennahouse.pdf https://github.com/zopyx/print-css-rocks/raw/master/lessons/generated/lesson-basic/antennahouse.pdf
wget -O lesson-basic-prince.pdf  https://github.com/zopyx/print-css-rocks/raw/master/lessons/generated/lesson-basic/prince.pdf
wget -O lesson-basic-weasyprint.pdf  https://github.com/zopyx/print-css-rocks/raw/master/lessons/generated/lesson-basic/weasyprint.pdf
md5sum lesson-basic-*.pdf

que irá produzir alguma coisa como:

6e0f6189c41a3456fe7ee7435498427c  lesson-basic-antennahouse.pdf
aae24ad9d43266ad68a700fc41b56d6a  lesson-basic-prince.pdf
96061a5d8495383c9016c18bb2ade8cd  lesson-basic-weasyprint.pdf

A seguir mostrando que o MD5 funciona em binários, e que não precisamos carregar na base se o objetivo for apenas atestar o MD5. As linhas comentadas são as adaptações do tutorial onde o MD5 substituiu o load:

DROP TABLE IF EXISTS tmp_docs CASCADE;
CREATE TABLE tmp_docs(file_name text PRIMARY KEY);
COPY tmp_docs FROM PROGRAM 'ls /tmp/*.pdf' WITH (format 'csv');
--ALTER TABLE tmp_docs ADD COLUMN doc bytea, ADD COLUMN doc_oid oid;
ALTER TABLE tmp_docs ADD COLUMN md5 text, ADD COLUMN doc_oid oid;
UPDATE tmp_docs SET doc_oid = lo_import(file_name);
-- UPDATE tmp_docs SET doc = lo_get(doc_oid);
UPDATE tmp_docs SET md5 = md5(lo_get(doc_oid));
SELECT lo_unlink(doc_oid)  FROM tmp_docs;

SELECT file_name, md5 FROM tmp_docs;

Que produzirá algo como

               md5                |             file_name              
----------------------------------+------------------------------------
 6e0f6189c41a3456fe7ee7435498427c | /tmp/lesson-basic-antennahouse.pdf
 aae24ad9d43266ad68a700fc41b56d6a | /tmp/lesson-basic-prince.pdf
 96061a5d8495383c9016c18bb2ade8cd | /tmp/lesson-basic-weasyprint.pdf

Clone this wiki locally