<?xml version="1.0" encoding="UTF-8"?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<mapper namespace="jnpf.dmsMapper.DmsPdfGenerationTaskMapper">
|
<resultMap id="Task" type="jnpf.dmsEntity.storage.pdf.DmsPdfGenerationTask">
|
<id column="file_version_id" property="fileVersionId" typeHandler="jnpf.dmsDatabase.DmsUuidTypeHandler"/>
|
<result column="tenant_id" property="tenantId"/>
|
<result column="source_checksum_sha256" property="sourceChecksumSha256"/>
|
<result column="status" property="status"/>
|
<result column="attempts" property="attempts"/>
|
<result column="next_attempt_at" property="nextAttemptAt"/>
|
<result column="lease_token" property="leaseToken"/>
|
<result column="lease_until" property="leaseUntil"/>
|
<result column="last_error" property="lastError"/>
|
<result column="created_at" property="createdAt"/>
|
<result column="started_at" property="startedAt"/>
|
<result column="completed_at" property="completedAt"/>
|
<result column="updated_at" property="updatedAt"/>
|
</resultMap>
|
|
<insert id="enqueue">
|
INSERT INTO public.dms_pdf_generation_tasks
|
(tenant_id, file_version_id, source_checksum_sha256)
|
VALUES (#{tenantId}, #{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler},
|
#{sourceChecksum})
|
ON CONFLICT (tenant_id, file_version_id) DO UPDATE
|
SET source_checksum_sha256=EXCLUDED.source_checksum_sha256, status='PENDING', attempts=0,
|
next_attempt_at=statement_timestamp(), lease_token=NULL, lease_until=NULL,
|
last_error=NULL, completed_at=NULL, updated_at=statement_timestamp()
|
WHERE dms_pdf_generation_tasks.source_checksum_sha256 <> EXCLUDED.source_checksum_sha256
|
</insert>
|
|
<insert id="requeue">
|
INSERT INTO public.dms_pdf_generation_tasks
|
(tenant_id, file_version_id, source_checksum_sha256)
|
VALUES (#{tenantId}, #{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler},
|
#{sourceChecksum})
|
ON CONFLICT (tenant_id, file_version_id) DO UPDATE
|
SET source_checksum_sha256=EXCLUDED.source_checksum_sha256, status='PENDING', attempts=0,
|
next_attempt_at=statement_timestamp(), lease_token=NULL, lease_until=NULL,
|
last_error=NULL, started_at=NULL, completed_at=NULL, updated_at=statement_timestamp()
|
WHERE dms_pdf_generation_tasks.source_checksum_sha256 <> EXCLUDED.source_checksum_sha256
|
OR dms_pdf_generation_tasks.status IN ('SUCCEEDED','FAILED')
|
</insert>
|
|
<update id="clearInvalidPdf">
|
UPDATE public.dms_file_objects o
|
SET pdf_object_key=NULL, pdf_size_bytes=NULL, pdf_checksum_sha256=NULL,
|
pdf_source_checksum_sha256=NULL, pdf_generated_at=NULL
|
FROM public.dms_file_versions v
|
WHERE o.tenant_id=#{tenantId}
|
AND o.file_version_id=#{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
|
AND o.pdf_object_key=#{objectKey}
|
AND lower(o.pdf_source_checksum_sha256)=#{sourceChecksum}
|
AND v.tenant_id=o.tenant_id AND v.id=o.file_version_id
|
AND lower(v.checksum_sha256)=#{sourceChecksum}
|
</update>
|
|
<insert id="discover">
|
INSERT INTO public.dms_pdf_generation_tasks
|
(tenant_id, file_version_id, source_checksum_sha256)
|
SELECT v.tenant_id, v.id, lower(v.checksum_sha256)
|
FROM public.dms_file_versions v
|
JOIN public.dms_file_objects o ON o.tenant_id=v.tenant_id AND o.file_version_id=v.id
|
WHERE lower(v.file_name) ~ '\.(doc|docx)$'
|
AND (o.pdf_object_key IS NULL OR o.pdf_source_checksum_sha256 IS DISTINCT FROM lower(v.checksum_sha256))
|
ORDER BY o.created_at, o.id
|
LIMIT #{limit}
|
ON CONFLICT (tenant_id, file_version_id) DO UPDATE
|
SET source_checksum_sha256=EXCLUDED.source_checksum_sha256, status='PENDING', attempts=0,
|
next_attempt_at=statement_timestamp(), lease_token=NULL, lease_until=NULL,
|
last_error=NULL, completed_at=NULL, updated_at=statement_timestamp()
|
WHERE dms_pdf_generation_tasks.source_checksum_sha256 <> EXCLUDED.source_checksum_sha256
|
</insert>
|
|
<select id="candidates" resultMap="Task">
|
SELECT tenant_id, file_version_id, source_checksum_sha256, status, attempts,
|
next_attempt_at, lease_token, lease_until, last_error, created_at,
|
started_at, completed_at, updated_at
|
FROM public.dms_pdf_generation_tasks
|
WHERE status IN ('PENDING','RUNNING') AND attempts < #{maxAttempts}
|
AND next_attempt_at <= statement_timestamp()
|
AND (lease_until IS NULL OR lease_until <= statement_timestamp())
|
ORDER BY next_attempt_at, created_at, file_version_id
|
LIMIT #{limit}
|
</select>
|
|
<update id="claim">
|
UPDATE public.dms_pdf_generation_tasks
|
SET status='RUNNING', lease_token=#{token},
|
lease_until=statement_timestamp() + (#{leaseSeconds} * INTERVAL '1 second'),
|
attempts=attempts+1, started_at=COALESCE(started_at, statement_timestamp()),
|
updated_at=statement_timestamp()
|
WHERE tenant_id=#{tenantId}
|
AND file_version_id=#{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
|
AND status IN ('PENDING','RUNNING') AND attempts < #{maxAttempts}
|
AND next_attempt_at <= statement_timestamp()
|
AND (lease_until IS NULL OR lease_until <= statement_timestamp())
|
</update>
|
|
<update id="writePdf">
|
UPDATE public.dms_file_objects o
|
SET pdf_object_key=#{pdf.objectKey}, pdf_size_bytes=#{pdf.sizeBytes},
|
pdf_checksum_sha256=#{pdf.checksumSha256},
|
pdf_source_checksum_sha256=#{pdf.sourceChecksumSha256},
|
pdf_generated_at=statement_timestamp()
|
FROM public.dms_file_versions v
|
WHERE o.tenant_id=#{tenantId}
|
AND o.file_version_id=#{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
|
AND v.tenant_id=o.tenant_id AND v.id=o.file_version_id
|
AND lower(v.checksum_sha256)=#{sourceChecksum}
|
AND #{pdf.sourceChecksumSha256}=#{sourceChecksum}
|
</update>
|
|
<update id="succeed">
|
UPDATE public.dms_pdf_generation_tasks
|
SET status='SUCCEEDED', lease_token=NULL, lease_until=NULL, last_error=NULL,
|
completed_at=statement_timestamp(), updated_at=statement_timestamp()
|
WHERE tenant_id=#{tenantId}
|
AND file_version_id=#{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
|
AND lease_token=#{token}
|
</update>
|
|
<update id="fail">
|
UPDATE public.dms_pdf_generation_tasks
|
SET status=CASE WHEN #{terminal} THEN 'FAILED' ELSE 'PENDING' END,
|
lease_token=NULL, lease_until=NULL, last_error=#{error},
|
next_attempt_at=statement_timestamp() + (#{delaySeconds} * INTERVAL '1 second'),
|
completed_at=CASE WHEN #{terminal} THEN statement_timestamp() ELSE NULL END,
|
updated_at=statement_timestamp()
|
WHERE tenant_id=#{tenantId}
|
AND file_version_id=#{fileVersionId,jdbcType=OTHER,typeHandler=jnpf.dmsDatabase.DmsUuidTypeHandler}
|
AND lease_token=#{token}
|
</update>
|
</mapper>
|