feature:support auto sync project document by cron task (#3)

* feat: auto sync project document by cron task

* feat:update README
This commit is contained in:
vran
2022-01-25 23:48:34 +08:00
committed by GitHub
parent 1c909cbeda
commit 604cb4ab47
20 changed files with 492 additions and 44 deletions

View File

@@ -2,13 +2,17 @@ package com.databasir.dao.impl;
import com.databasir.dao.tables.pojos.DatabaseDocumentHistoryPojo;
import com.databasir.dao.tables.records.DatabaseDocumentHistoryRecord;
import com.databasir.dao.value.DatabaseDocumentVersionPojo;
import lombok.Getter;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
import static com.databasir.dao.Tables.DATABASE_DOCUMENT_HISTORY;
@@ -31,8 +35,24 @@ public class DatabaseDocumentHistoryDao extends BaseDao<DatabaseDocumentHistoryR
.fetchOptionalInto(DatabaseDocumentHistoryPojo.class);
}
public Page<DatabaseDocumentHistoryPojo> selectPageByDatabaseDocumentId(Pageable request, Integer schemaDocumentId) {
return super.selectByPage(request, DATABASE_DOCUMENT_HISTORY.DATABASE_DOCUMENT_ID.eq(schemaDocumentId));
public Page<DatabaseDocumentVersionPojo> selectVersionPageByDatabaseDocumentId(Pageable request, Integer schemaDocumentId) {
Condition condition = DATABASE_DOCUMENT_HISTORY.DATABASE_DOCUMENT_ID.eq(schemaDocumentId);
Integer count = getDslContext()
.selectCount().from(DATABASE_DOCUMENT_HISTORY).where(condition)
.fetchOne(0, int.class);
int total = count == null ? 0 : count;
List<DatabaseDocumentVersionPojo> data = getDslContext()
.select(
DATABASE_DOCUMENT_HISTORY.VERSION,
DATABASE_DOCUMENT_HISTORY.DATABASE_DOCUMENT_ID,
DATABASE_DOCUMENT_HISTORY.CREATE_AT
)
.from(DATABASE_DOCUMENT_HISTORY)
.where(condition)
.orderBy(getSortFields(request.getSort()))
.offset(request.getOffset())
.limit(request.getPageSize())
.fetchInto(DatabaseDocumentVersionPojo.class);
return new PageImpl<>(data, request, total);
}
}

View File

@@ -9,6 +9,8 @@ import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import static com.databasir.dao.Tables.PROJECT_SYNC_RULE;
@@ -46,4 +48,51 @@ public class ProjectSyncRuleDao extends BaseDao<ProjectSyncRuleRecord, ProjectSy
.update(table).set(record).where(table.PROJECT_ID.eq(rule.getProjectId()))
.execute();
}
public void deleteByProjectId(Integer projectId) {
getDslContext()
.deleteFrom(PROJECT_SYNC_RULE).where(PROJECT_SYNC_RULE.PROJECT_ID.eq(projectId))
.execute();
}
public List<ProjectSyncRulePojo> selectInProjectIds(List<Integer> projectIds) {
if (projectIds == null || projectIds.isEmpty()) {
return Collections.emptyList();
}
return getDslContext()
.selectFrom(PROJECT_SYNC_RULE).where(PROJECT_SYNC_RULE.PROJECT_ID.in(projectIds))
.fetchInto(ProjectSyncRulePojo.class);
}
public List<ProjectSyncRulePojo> selectByIsAutoSyncAndProjectIds(boolean isAutoSync, List<Integer> projectIds) {
if (projectIds == null || projectIds.isEmpty()) {
return Collections.emptyList();
}
return getDslContext()
.selectFrom(PROJECT_SYNC_RULE).where(
PROJECT_SYNC_RULE.IS_AUTO_SYNC.eq(isAutoSync)
.and(PROJECT_SYNC_RULE.PROJECT_ID.in(projectIds))
)
.fetchInto(ProjectSyncRulePojo.class);
}
public List<ProjectSyncRulePojo> selectByIsAutoSyncAndNotInProjectIds(boolean isAutoSync, List<Integer> projectIds) {
if (projectIds == null || projectIds.isEmpty()) {
return getDslContext()
.selectFrom(PROJECT_SYNC_RULE)
.where(PROJECT_SYNC_RULE.IS_AUTO_SYNC.eq(isAutoSync)
.and(PROJECT_SYNC_RULE.PROJECT_ID.notIn(projectIds)))
.fetchInto(ProjectSyncRulePojo.class);
} else {
return getDslContext()
.selectFrom(PROJECT_SYNC_RULE).where(PROJECT_SYNC_RULE.IS_AUTO_SYNC.eq(isAutoSync))
.fetchInto(ProjectSyncRulePojo.class);
}
}
public boolean existsByProjectIdAndCron(int projectId, String cron) {
return dslContext.fetchExists(PROJECT_SYNC_RULE,
PROJECT_SYNC_RULE.PROJECT_ID.eq(projectId)
.and(PROJECT_SYNC_RULE.AUTO_SYNC_CRON.eq(cron)));
}
}

View File

@@ -0,0 +1,15 @@
package com.databasir.dao.value;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class DatabaseDocumentVersionPojo {
private Integer databaseDocumentId;
private Long version;
private LocalDateTime createAt;
}

View File

@@ -78,11 +78,13 @@ CREATE TABLE `project`
CREATE TABLE `project_sync_rule`
(
id INT PRIMARY KEY AUTO_INCREMENT,
project_id INT NOT NULL,
ignore_table_name_regex_array JSON NOT NULL,
ignore_column_name_regex_array JSON NOT NULL,
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
project_id INT NOT NULL,
ignore_table_name_regex_array JSON NOT NULL,
ignore_column_name_regex_array JSON NOT NULL,
is_auto_sync BOOLEAN NOT NULL DEFAULT FALSE,
auto_sync_cron VARCHAR(128) NOT NULL DEFAULT '',
update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT UNIQUE uk_project_id (project_id)
) CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci;