101 lines
5.7 KiB
Java
101 lines
5.7 KiB
Java
package scripts.qa;
|
|||
|
|
|
||
|
|
import java.io.File;
|
||
|
|
import java.nio.file.Files;
|
||
|
|
import java.sql.*;
|
||
|
|
|
||
|
|
public class CheckDatabaseIntegrity {
|
||
|
|
public static void main(String[] args) throws Exception {
|
||
|
|
Class.forName("com.kingbase8.Driver");
|
||
|
|
|
||
|
|
File envFile = new File(System.getProperty("user.home"), ".railwaysystem-qa.env");
|
||
|
|
String pass = "";
|
||
|
|
if (envFile.exists()) {
|
||
|
|
for (String line : Files.readAllLines(envFile.toPath())) {
|
||
|
|
line = line.trim();
|
||
|
|
if (line.startsWith("QA_DB_PASSWORD=")) {
|
||
|
|
pass = line.substring("QA_DB_PASSWORD=".length()).trim();
|
||
|
|
if (pass.startsWith("\"") && pass.endsWith("\"")) {
|
||
|
|
pass = pass.substring(1, pass.length() - 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (pass.isEmpty()) {
|
||
|
|
throw new IllegalStateException("QA_DB_PASSWORD is required in ~/.railwaysystem-qa.env");
|
||
|
|
}
|
||
|
|
|
||
|
|
String dbUrl = "jdbc:kingbase8://192.168.139.218:4321/railwaysystem_integrated_qa_20260916?useUnicode=true&characterEncoding=utf8";
|
||
|
|
try (Connection conn = DriverManager.getConnection(dbUrl, "kingbase", pass)) {
|
||
|
|
try (Statement st = conn.createStatement()) {
|
||
|
|
// 1. ORPHAN_COUNT
|
||
|
|
int orphanCount = 0;
|
||
|
|
String[] orphanQueries = new String[]{
|
||
|
|
"SELECT count(*) FROM train_enrollment e WHERE NOT EXISTS (SELECT 1 FROM train_class_plan p WHERE p.plan_id = e.plan_id)",
|
||
|
|
"SELECT count(*) FROM train_lesson l WHERE NOT EXISTS (SELECT 1 FROM train_plan_course pc JOIN train_class_plan p ON p.plan_id = pc.plan_id WHERE pc.plan_course_id = l.plan_course_id)",
|
||
|
|
"SELECT count(*) FROM train_accommodation a WHERE NOT EXISTS (SELECT 1 FROM train_enrollment e WHERE e.enrollment_id = a.enrollment_id)",
|
||
|
|
"SELECT count(*) FROM train_student_checkin c WHERE NOT EXISTS (SELECT 1 FROM train_enrollment e WHERE e.enrollment_id = c.enrollment_id)"
|
||
|
|
};
|
||
|
|
for (String q : orphanQueries) {
|
||
|
|
try (ResultSet rs = st.executeQuery(q)) {
|
||
|
|
if (rs.next()) orphanCount += rs.getInt(1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
System.out.println("ORPHAN_COUNT=" + orphanCount);
|
||
|
|
|
||
|
|
// 2. ACTIVE_ACCOMMODATION_DUPLICATE_COUNT
|
||
|
|
int activeDup = 0;
|
||
|
|
String qActive = "SELECT count(*) FROM (" +
|
||
|
|
" SELECT enrollment_id, count(*) FROM train_accommodation WHERE accommodation_status IN (0, 1) GROUP BY enrollment_id HAVING count(*) > 1" +
|
||
|
|
") t";
|
||
|
|
try (ResultSet rs = st.executeQuery(qActive)) {
|
||
|
|
if (rs.next()) activeDup = rs.getInt(1);
|
||
|
|
}
|
||
|
|
System.out.println("ACTIVE_ACCOMMODATION_DUPLICATE_COUNT=" + activeDup);
|
||
|
|
|
||
|
|
// 3. DMS_OPERATION_IDEMPOTENCY_VIOLATION
|
||
|
|
int dmsIdempotencyViolations = 0;
|
||
|
|
String qDms = "SELECT count(*) FROM (" +
|
||
|
|
" SELECT operation_id, count(*) FROM train_external_operation GROUP BY operation_id HAVING count(*) > 1" +
|
||
|
|
") t";
|
||
|
|
try (ResultSet rs = st.executeQuery(qDms)) {
|
||
|
|
if (rs.next()) dmsIdempotencyViolations = rs.getInt(1);
|
||
|
|
}
|
||
|
|
System.out.println("DMS_OPERATION_IDEMPOTENCY_VIOLATION=" + dmsIdempotencyViolations);
|
||
|
|
|
||
|
|
// 4. BROKEN_USER_IDENTITY_BINDING_COUNT
|
||
|
|
int brokenBindings = 0;
|
||
|
|
String qTeaBind = "SELECT count(*) FROM train_teacher t WHERE t.user_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM public.sys_user WHERE public.sys_user.user_id = t.user_id)";
|
||
|
|
try (ResultSet rs = st.executeQuery(qTeaBind)) {
|
||
|
|
if (rs.next()) brokenBindings += rs.getInt(1);
|
||
|
|
}
|
||
|
|
String qStuBind = "SELECT count(*) FROM train_student s WHERE s.user_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM public.sys_user WHERE public.sys_user.user_id = s.user_id)";
|
||
|
|
try (ResultSet rs = st.executeQuery(qStuBind)) {
|
||
|
|
if (rs.next()) brokenBindings += rs.getInt(1);
|
||
|
|
}
|
||
|
|
System.out.println("BROKEN_USER_IDENTITY_BINDING_COUNT=" + brokenBindings);
|
||
|
|
|
||
|
|
// 5. INVALID_PLAN_COURSE_RELATION_COUNT
|
||
|
|
int invalidPlanCourse = 0;
|
||
|
|
String qPc = "SELECT count(*) FROM train_plan_course pc WHERE " +
|
||
|
|
"NOT EXISTS (SELECT 1 FROM train_class_plan p WHERE p.plan_id = pc.plan_id) OR " +
|
||
|
|
"NOT EXISTS (SELECT 1 FROM train_course c WHERE c.c_id = pc.c_id)";
|
||
|
|
try (ResultSet rs = st.executeQuery(qPc)) {
|
||
|
|
if (rs.next()) invalidPlanCourse = rs.getInt(1);
|
||
|
|
}
|
||
|
|
System.out.println("INVALID_PLAN_COURSE_RELATION_COUNT=" + invalidPlanCourse);
|
||
|
|
|
||
|
|
// 6. INVALID_LESSON_RESOURCE_RELATION_COUNT
|
||
|
|
int invalidLessonRes = 0;
|
||
|
|
String qLr = "SELECT count(*) FROM train_lesson l WHERE " +
|
||
|
|
"(l.venue_type = 1 AND NOT EXISTS (SELECT 1 FROM train_classroom_info cr WHERE cr.class_room_id = l.class_room_id)) OR " +
|
||
|
|
"(l.venue_type = 2 AND NOT EXISTS (SELECT 1 FROM train_training_site s WHERE s.site_id = l.site_id)) OR " +
|
||
|
|
"NOT EXISTS (SELECT 1 FROM train_teacher t WHERE t.t_id = l.t_id)";
|
||
|
|
try (ResultSet rs = st.executeQuery(qLr)) {
|
||
|
|
if (rs.next()) invalidLessonRes = rs.getInt(1);
|
||
|
|
}
|
||
|
|
System.out.println("INVALID_LESSON_RESOURCE_RELATION_COUNT=" + invalidLessonRes);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|