From d89e986d557091f60bed6df95422dc885b7c30de Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 22 Aug 2025 05:34:10 +0000 Subject: [PATCH 1/4] feat: set file status 92 when opening old files --- .../libcobj/file/CobolFile.java | 3 ++ .../libcobj/file/CobolIndexedFile.java | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java index 56e9a6b2..443810c2 100755 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java @@ -285,6 +285,9 @@ public class CobolFile { /** TODO: 準備中 */ protected static final int COB_STATUS_91_NOT_AVAILABLE = 91; + /** TODO: 準備中 */ + protected static final int COB_STATUS_92_VERSION_INCOMPATIBLE = 92; + // ============================================== // The following constants must not be equal // to any of the above constants `COB_STATUS_*` diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java index 8f355cef..0d58fa09 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java @@ -227,6 +227,13 @@ public int open_(String filename, int mode, int sharing) { return getConnectionStatus; } + if(mode != COB_OPEN_OUTPUT && fileExists) { + int code = this.checkVersionOld(); + if(code != COB_STATUS_00_SUCCESS) { + return code; + } + } + try { // Acquire a file lock boolean succeedToFileLock = this.acquireFileLock(filename, mode, fileExists); @@ -292,6 +299,40 @@ private int getConnection(String filename) { return COB_STATUS_00_SUCCESS; } + private int checkVersionOld() { + IndexedFile p = this.filei; + try (Statement st = p.connection.createStatement()) { + String fileLockTableExistsSql = + "select exists(select 1 from sqlite_master where type = 'table' and name = 'file_lock')"; + ResultSet fileLockTableExistsResultSet = st.executeQuery(fileLockTableExistsSql); + if(!fileLockTableExistsResultSet.next()) { + return COB_STATUS_92_VERSION_INCOMPATIBLE; + } + + boolean lockedByColumnExists = false; + boolean processIdColumnExists = false; + boolean lockedAtColumnExists = false; + try (ResultSet rs = st.executeQuery("PRAGMA table_info('table0')")) { + while (rs.next()) { + String columnName = rs.getString("name"); + if ("locked_by".equals(columnName)) { + lockedByColumnExists = true; + } else if ("process_id".equals(columnName)) { + processIdColumnExists = true; + } else if ("locked_at".equals(columnName)) { + lockedAtColumnExists = true; + } + if (lockedByColumnExists && processIdColumnExists && lockedAtColumnExists) { + return COB_STATUS_00_SUCCESS; // All required columns exist + } + } + } + } catch (SQLException e) { + return COB_STATUS_30_PERMANENT_ERROR; + } + return COB_STATUS_92_VERSION_INCOMPATIBLE; + } + private String getOpenModeString(int mode) { switch (mode) { case COB_OPEN_INPUT: From 57a53b4b7c621b9c8fe2713f960a52b5c411ff27 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 22 Aug 2025 06:56:19 +0000 Subject: [PATCH 2/4] fix: set file status 92 correctly --- .../opensourcecobol/libcobj/file/CobolFile.java | 6 ++++++ .../libcobj/file/CobolIndexedFile.java | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java index 443810c2..85c25c6b 100755 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java @@ -1106,6 +1106,9 @@ public void open(int mode, int sharing, AbstractCobolField fnstatus) { case COB_STATUS_91_NOT_AVAILABLE: saveStatus(COB_STATUS_91_NOT_AVAILABLE, fnstatus); return; + case COB_STATUS_92_VERSION_INCOMPATIBLE: + saveStatus(COB_STATUS_92_VERSION_INCOMPATIBLE, fnstatus); + return; case COB_LINAGE_INVALID: saveStatus(COB_STATUS_57_I_O_LINAGE, fnstatus); return; @@ -2069,6 +2072,9 @@ public void cob_delete_file(AbstractCobolField fnstatus) { case COB_STATUS_91_NOT_AVAILABLE: saveStatus(COB_STATUS_91_NOT_AVAILABLE, fnstatus); return; + case COB_STATUS_92_VERSION_INCOMPATIBLE: + saveStatus(COB_STATUS_92_VERSION_INCOMPATIBLE, fnstatus); + return; case COB_LINAGE_INVALID: saveStatus(COB_STATUS_57_I_O_LINAGE, fnstatus); return; diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java index 0d58fa09..f82588c8 100644 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolIndexedFile.java @@ -227,7 +227,7 @@ public int open_(String filename, int mode, int sharing) { return getConnectionStatus; } - if(mode != COB_OPEN_OUTPUT && fileExists) { + if(fileExists) { int code = this.checkVersionOld(); if(code != COB_STATUS_00_SUCCESS) { return code; @@ -305,8 +305,13 @@ private int checkVersionOld() { String fileLockTableExistsSql = "select exists(select 1 from sqlite_master where type = 'table' and name = 'file_lock')"; ResultSet fileLockTableExistsResultSet = st.executeQuery(fileLockTableExistsSql); - if(!fileLockTableExistsResultSet.next()) { - return COB_STATUS_92_VERSION_INCOMPATIBLE; + if (fileLockTableExistsResultSet.next()) { + boolean fileLockTableExists = fileLockTableExistsResultSet.getInt(1) == 1; + if(!fileLockTableExists) { + return COB_STATUS_92_VERSION_INCOMPATIBLE; + } + } else { + return COB_STATUS_92_VERSION_INCOMPATIBLE; // file_lock table does not exist } boolean lockedByColumnExists = false; From cf611d29cab707d632607b41360cf6c6681b665e Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 22 Aug 2025 08:03:21 +0000 Subject: [PATCH 3/4] tests: add tests for opening old indexed files --- tests/Makefile.am | 1 + tests/Makefile.in | 1 + tests/indexed-lock.at | 1 + .../indexed-file/old_indexed_file.dat | Bin 0 -> 40960 bytes tests/indexed-lock.src/old-file.at | 53 ++++++++++++++++++ 5 files changed, 56 insertions(+) create mode 100644 tests/indexed-lock.src/indexed-file/old_indexed_file.dat create mode 100644 tests/indexed-lock.src/old-file.at diff --git a/tests/Makefile.am b/tests/Makefile.am index 5efa5da9..7be45806 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -217,6 +217,7 @@ indexed_lock_DEPENDENCIES = \ indexed-lock.src/release-lock.at \ indexed-lock.src/open-input.at \ indexed-lock.src/lock-mode-clause.at \ + indexed-lock.src/old-file.at \ indexed-lock.src/lock-mode-automatic.at misc_DEPENDENCIES = \ diff --git a/tests/Makefile.in b/tests/Makefile.in index fe002ccd..3e02765c 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -756,6 +756,7 @@ indexed_lock_DEPENDENCIES = \ indexed-lock.src/release-lock.at \ indexed-lock.src/open-input.at \ indexed-lock.src/lock-mode-clause.at \ + indexed-lock.src/old-file.at \ indexed-lock.src/lock-mode-automatic.at misc_DEPENDENCIES = \ diff --git a/tests/indexed-lock.at b/tests/indexed-lock.at index 509cdc66..79c9b197 100644 --- a/tests/indexed-lock.at +++ b/tests/indexed-lock.at @@ -10,3 +10,4 @@ m4_include([release-lock.at]) m4_include([open-input.at]) m4_include([lock-mode-clause.at]) m4_include([lock-mode-automatic.at]) +m4_include([old-file.at]) diff --git a/tests/indexed-lock.src/indexed-file/old_indexed_file.dat b/tests/indexed-lock.src/indexed-file/old_indexed_file.dat new file mode 100644 index 0000000000000000000000000000000000000000..b9ce57294704732c8d6809d867dacfc91aa04050 GIT binary patch literal 40960 zcmeI*O-~a+7{KuvO5eb;CMIn-7$-pzs>F1IClaH8J(v&@l!L}Yv!w%WEW5bfnqs_^ zqu<8Q;Ro>uoaE^2j+7QkI2Zqu?lL>GFVFmD(_}i6@NRq4kG0whqXREiE8@P8QoK@1 z2$3<{jM*+y-ejgP4$NOUl)ovP5zl@+C^_e%c<;M#J~_Xf<+p=^Ocnq*?%z_W+#sPV83A=KZxnFs4zb0%M;X+2~WkkXM!FZ_*bvpy&hn- zUdUBGtVrPpE#2#UX`9ho!|TRjdfXTjNy8meSX|BJD)aMlJH0I3xoPX%{J+58Y`w0( zH$LVmt_lNXYm=a>>)Bl8(Y*YaR(870;mdO)mk%n3?vS>t+IOe(NdU(d)!yCivmHHSvLqY%n1Q0*~0R#|0009ILKmdWs7O2Qf`N^6| zZn|4H$=xu?O(yuI^GBEu2>}EUKmY**5I_I{1Q0*~0R--rKp|5uroRL*{=ZutOKT87 z009ILKmY**5I_I{1P~Y!7>xhz`u|hmoDS8JMF0T=5I_I{1Q0*~0R#|00D*}Xn3L1x zav@#+&;0*H_awn1fB*srAb Date: Fri, 22 Aug 2025 17:32:12 +0900 Subject: [PATCH 4/4] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../jp/osscons/opensourcecobol/libcobj/file/CobolFile.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java index 85c25c6b..348c8697 100755 --- a/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java +++ b/libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java @@ -285,7 +285,10 @@ public class CobolFile { /** TODO: 準備中 */ protected static final int COB_STATUS_91_NOT_AVAILABLE = 91; - /** TODO: 準備中 */ + /** + * File status 92: Version incompatibility. + * Indicates that the file operation failed due to a version mismatch between the file and the program. + */ protected static final int COB_STATUS_92_VERSION_INCOMPATIBLE = 92; // ==============================================