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); } } } }