From d89e986d557091f60bed6df95422dc885b7c30de Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Fri, 22 Aug 2025 05:34:10 +0000 Subject: [PATCH 01/12] 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 02/12] 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 03/12] 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: Mon, 25 Aug 2025 02:51:31 +0000 Subject: [PATCH 04/12] test: fix flaky tests --- tests/indexed-lock.src/access-different-record.at | 6 +++--- tests/indexed-lock.src/access-same-record.at | 4 ++-- tests/indexed-lock.src/file-lock.at | 6 +++--- tests/indexed-lock.src/input-mode.at | 4 ++-- tests/indexed-lock.src/lock-mode-automatic.at | 4 ++-- tests/indexed-lock.src/lock-mode-clause.at | 4 ++-- tests/indexed-lock.src/old-file.at | 2 +- tests/indexed-lock.src/open-input.at | 4 ++-- tests/indexed-lock.src/open-start-write-rewrite.at | 4 ++-- tests/indexed-lock.src/release-lock.at | 4 ++-- tests/indexed-lock.src/same-process.at | 2 +- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/indexed-lock.src/access-different-record.at b/tests/indexed-lock.src/access-different-record.at index 61038b92..00d8e40b 100644 --- a/tests/indexed-lock.src/access-different-record.at +++ b/tests/indexed-lock.src/access-different-record.at @@ -134,12 +134,12 @@ function run_test() { rm -f playground-record-lock-* if test "$OPERATION2" == "$OPERATION_WRITE"; then - java ${PROGRAM_ID_TABLE1_FOR_WRITE@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1_FOR_WRITE@<:@$OPERATION1@:>@} > prog1.log & else - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & fi PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/access-same-record.at b/tests/indexed-lock.src/access-same-record.at index 47c5e19f..b3d942cc 100644 --- a/tests/indexed-lock.src/access-same-record.at +++ b/tests/indexed-lock.src/access-same-record.at @@ -112,9 +112,9 @@ function run_test() { rm -f playground-record-lock-* - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/file-lock.at b/tests/indexed-lock.src/file-lock.at index a2af932f..68032cf1 100644 --- a/tests/indexed-lock.src/file-lock.at +++ b/tests/indexed-lock.src/file-lock.at @@ -189,12 +189,12 @@ function run_test() { cobj ${PROGRAM_NAME_1}.cbl ${PROGRAM_NAME_2}.cbl make_indexed_file${TEST_ID}.cbl - java make_indexed_file${TEST_ID} + java -Xlog:perf+memops=off make_indexed_file${TEST_ID} - java $PROGRAM_NAME_1 & + java -Xlog:perf+memops=off $PROGRAM_NAME_1 & PID1=$! - java $PROGRAM_NAME_2 > ${TEST_ID}.log & + java -Xlog:perf+memops=off $PROGRAM_NAME_2 > ${TEST_ID}.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/input-mode.at b/tests/indexed-lock.src/input-mode.at index f2d1b6c4..16df00d9 100644 --- a/tests/indexed-lock.src/input-mode.at +++ b/tests/indexed-lock.src/input-mode.at @@ -106,9 +106,9 @@ function run_test() { rm -f playground-record-lock-* - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/lock-mode-automatic.at b/tests/indexed-lock.src/lock-mode-automatic.at index 543a6930..bb671510 100644 --- a/tests/indexed-lock.src/lock-mode-automatic.at +++ b/tests/indexed-lock.src/lock-mode-automatic.at @@ -119,9 +119,9 @@ function run_test() { rm -f playground-record-lock-* f.dat pro1.log prog2.log - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/lock-mode-clause.at b/tests/indexed-lock.src/lock-mode-clause.at index e1856c2d..e622ac34 100644 --- a/tests/indexed-lock.src/lock-mode-clause.at +++ b/tests/indexed-lock.src/lock-mode-clause.at @@ -120,9 +120,9 @@ function run_test() { rm -f playground-record-lock-* f.dat pro1.log prog2.log - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/old-file.at b/tests/indexed-lock.src/old-file.at index a7c9ce44..680c52a5 100644 --- a/tests/indexed-lock.src/old-file.at +++ b/tests/indexed-lock.src/old-file.at @@ -44,7 +44,7 @@ AT_DATA([open_file_status.at], [ AT_CHECK([${COBJ} open_file_status.at]) AT_CHECK([cp ../../indexed-lock.src/indexed-file/old_indexed_file.dat indexed_file.dat]) -AT_CHECK([java open_file_status], [0], +AT_CHECK([java -Xlog:perf+memops=off open_file_status], [0], [92 92 92 diff --git a/tests/indexed-lock.src/open-input.at b/tests/indexed-lock.src/open-input.at index 6fb5328c..f6c1b631 100644 --- a/tests/indexed-lock.src/open-input.at +++ b/tests/indexed-lock.src/open-input.at @@ -115,9 +115,9 @@ function run_test() { rm -f playground-record-lock-* f.dat pro1.log prog2.log - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/open-start-write-rewrite.at b/tests/indexed-lock.src/open-start-write-rewrite.at index 8b8dad47..7022b91e 100644 --- a/tests/indexed-lock.src/open-start-write-rewrite.at +++ b/tests/indexed-lock.src/open-start-write-rewrite.at @@ -124,9 +124,9 @@ function run_test() { rm -f playground-record-lock-* f.dat pro1.log prog2.log - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/release-lock.at b/tests/indexed-lock.src/release-lock.at index affe4a33..743a4dc9 100644 --- a/tests/indexed-lock.src/release-lock.at +++ b/tests/indexed-lock.src/release-lock.at @@ -133,9 +133,9 @@ function run_test() { rm -f playground-record-lock-* f.dat pro1.log prog2.log - java ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE1@<:@$OPERATION1@:>@} > prog1.log & PID1=$! - java ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & + java -Xlog:perf+memops=off ${PROGRAM_ID_TABLE2@<:@$OPERATION2@:>@} > prog2.log & PID2=$! wait $PID1 $PID2 diff --git a/tests/indexed-lock.src/same-process.at b/tests/indexed-lock.src/same-process.at index dce1f297..807df9d5 100644 --- a/tests/indexed-lock.src/same-process.at +++ b/tests/indexed-lock.src/same-process.at @@ -120,5 +120,5 @@ AT_DATA([prog.cbl], [ ]) AT_CHECK([cobj prog.cbl]) -AT_CHECK([java prog]) +AT_CHECK([java -Xlog:perf+memops=off prog]) AT_CLEANUP From cd50d8d114f61d290f26e3b31102628d1d2ed381 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Mon, 25 Aug 2025 06:54:04 +0000 Subject: [PATCH 05/12] fix: unlock records locked not by other processes --- .../libcobj/file/CobolIndexedFile.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 f82588c8..cbd63579 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,9 +227,9 @@ public int open_(String filename, int mode, int sharing) { return getConnectionStatus; } - if(fileExists) { + if (fileExists) { int code = this.checkVersionOld(); - if(code != COB_STATUS_00_SUCCESS) { + if (code != COB_STATUS_00_SUCCESS) { return code; } } @@ -303,11 +303,12 @@ 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')"; + "select exists(select 1 from sqlite_master where type = 'table' and name =" + + " 'file_lock')"; ResultSet fileLockTableExistsResultSet = st.executeQuery(fileLockTableExistsSql); if (fileLockTableExistsResultSet.next()) { boolean fileLockTableExists = fileLockTableExistsResultSet.getInt(1) == 1; - if(!fileLockTableExists) { + if (!fileLockTableExists) { return COB_STATUS_92_VERSION_INCOMPATIBLE; } } else { @@ -700,10 +701,11 @@ private void unlockPreviousRecord() throws SQLException { String updateSql = String.format( "update %s set locked_by = null, process_id = null, locked_at = null where" - + " key = ?", + + " key = ? and locked_by = ?", getTableName(0)); try (PreparedStatement updateStatement = p.connection.prepareStatement(updateSql)) { updateStatement.setBytes(1, previousLockedRecordKey); + updateStatement.setString(2, this.getProcessUuid()); updateStatement.executeUpdate(); } previousLockedRecordKey = null; @@ -718,10 +720,11 @@ private void unlockPreviousRecord(byte[] key) throws SQLException { String updateSql = String.format( "update %s set locked_by = null, process_id = null, locked_at = null where" - + " key = ?", + + " key = ? and locked_by = ?", getTableName(0)); try (PreparedStatement updateStatement = p.connection.prepareStatement(updateSql)) { updateStatement.setBytes(1, previousLockedRecordKey); + updateStatement.setString(2, this.getProcessUuid()); updateStatement.executeUpdate(); } previousLockedRecordKey = key; From e7a2e62d63494767a12848a9030052787a346616 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Mon, 25 Aug 2025 07:59:41 +0000 Subject: [PATCH 06/12] fix: unlock previous records when failing to lock a record --- .../libcobj/file/CobolIndexedFile.java | 8 + tests/indexed-lock.src/release-lock.at | 146 ++++++++++++++++++ 2 files changed, 154 insertions(+) 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 cbd63579..9df4918b 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 @@ -759,10 +759,14 @@ public int read_(AbstractCobolField key, int readOpts) { try { if (checkOtherProcessLockedRecord(primaryKey)) { p.connection.rollback(); + unlockPreviousRecord(); + p.connection.commit(); return COB_STATUS_51_RECORD_LOCKED; } if (!lockRecord(primaryKey)) { p.connection.rollback(); + unlockPreviousRecord(); + p.connection.commit(); return COB_STATUS_30_PERMANENT_ERROR; } unlockPreviousRecord(primaryKey); @@ -897,10 +901,14 @@ public int readNext(int readOpts) { try { if (checkOtherProcessLockedRecord(primaryKey)) { p.connection.rollback(); + unlockPreviousRecord(); + p.connection.commit(); return COB_STATUS_51_RECORD_LOCKED; } if (!lockRecord(primaryKey)) { p.connection.rollback(); + unlockPreviousRecord(); + p.connection.commit(); return COB_STATUS_30_PERMANENT_ERROR; } unlockPreviousRecord(primaryKey); diff --git a/tests/indexed-lock.src/release-lock.at b/tests/indexed-lock.src/release-lock.at index 743a4dc9..55e40d12 100644 --- a/tests/indexed-lock.src/release-lock.at +++ b/tests/indexed-lock.src/release-lock.at @@ -315,3 +315,149 @@ AT_DATA([prog2.template.cbl], [ AT_CHECK([bash a.sh]) AT_CLEANUP + +AT_SETUP([unlock (READ)]) +AT_DATA([p1.cbl], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. p1. + + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT F ASSIGN TO "f.dat" + ORGANIZATION IS INDEXED + ACCESS MODE IS DYNAMIC + RECORD KEY IS REC-KEY + * LOCK MODE IS AUTOMATIC + ALTERNATE RECORD KEY IS REC-KEY2 WITH DUPLICATES + FILE STATUS IS FILE-STATUS. + + DATA DIVISION. + FILE SECTION. + FD f. + 01 REC. + 05 REC-KEY PIC X(5). + 05 REC-KEY2 PIC X(5). + 05 REC-DATA PIC X(5). + + WORKING-STORAGE SECTION. + 01 FILE-STATUS PIC XX. + 01 DUMMY PIC X(10) VALUE "DUMMY DATA". + PROCEDURE DIVISION. + MAIN-PROCEDURE. + OPEN OUTPUT f. + MOVE "AAAA1" TO REC-KEY. + MOVE "BBBB1" TO REC-KEY2. + MOVE "CCCC1" TO REC-DATA. + WRITE REC. + MOVE "AAAA2" TO REC-KEY. + MOVE "BBBB2" TO REC-KEY2. + MOVE "CCCC2" TO REC-DATA. + WRITE REC. + CLOSE f. + + OPEN I-O f. + + MOVE "AAAA1" TO REC-KEY. + READ F WITH LOCK. + DISPLAY FILE-STATUS. + + + CALL "setValue" USING + "playground-record-lock-01" + "AAAA1 record is locked". + CALL "wait" USING + "playground-record-lock-02" + "AAAA2 record is released". + + MOVE "AAAA2" TO REC-KEY. + REWRITE REC. + DISPLAY FILE-STATUS. + CLOSE f. + CALL "setValue" USING + "playground-record-lock-03" + "end of p1". +]) + +AT_DATA([p2.cbl], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. p2. + + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT F ASSIGN TO "f.dat" + ORGANIZATION IS INDEXED + ACCESS MODE IS DYNAMIC + RECORD KEY IS REC-KEY + ALTERNATE RECORD KEY IS REC-KEY2 WITH DUPLICATES + FILE STATUS IS FILE-STATUS. + + DATA DIVISION. + FILE SECTION. + FD f. + 01 REC. + 05 REC-KEY PIC X(5). + 05 REC-KEY2 PIC X(5). + 05 REC-DATA PIC X(5). + + WORKING-STORAGE SECTION. + 01 FILE-STATUS PIC XX. + 01 REC-EMPTY PIC X(15) VALUE "AAAA1 ". + 01 REC-BACKUP PIC X(15). + 01 DUMMY PIC X(15). + PROCEDURE DIVISION. + MAIN-PROCEDURE. + CALL "wait" USING + "playground-record-lock-01" + "AAAA1 record is locked". + + OPEN I-O f. + DISPLAY FILE-STATUS. + + INITIALIZE REC. + MOVE "AAAA2" TO REC. + READ F WITH LOCK. + + MOVE "AAAA1" TO REC-KEY. + READ F WITH LOCK. + DISPLAY FILE-STATUS. + + CALL "setValue" USING + "playground-record-lock-02" + "AAAA2 record is released". + + CALL "wait" USING + "playground-record-lock-03" + "end of p1". + + CLOSE f. +]) + +AT_DATA([run.sh], [ + java -Xlog:perf+memops=off p1 > p1.log & + PID1=$! + java -Xlog:perf+memops=off p2 > p2.log & + PID2=$! + wait $PID1 $PID2 +]) + +AT_CHECK([cp ../../indexed-lock.src/module-sync/wait.java .]) +AT_CHECK([cp ../../indexed-lock.src/module-sync/setValue.java .]) +AT_CHECK([cobj p1.cbl p2.cbl]) +AT_CHECK([javac wait.java setValue.java]) + +# run a test +AT_CHECK([bash run.sh] +) +AT_CHECK([cat p1.log], [0], +[00 +00 +]) + +AT_CHECK([cat p2.log], [0], +[00 +51 +]) + +AT_CLEANUP \ No newline at end of file From 4200d4e13374b68748b6b0f7297fb76d7615ec30 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Mon, 25 Aug 2025 08:23:39 +0000 Subject: [PATCH 07/12] chore: unlock the previous record (write) --- .../opensourcecobol/libcobj/file/CobolIndexedFile.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 9df4918b..7ccd3bc5 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 @@ -1080,6 +1080,12 @@ public int write_(int opt) { } else if (this.access_mode == COB_ACCESS_SEQUENTIAL) { byte[] keyBytes = p.key; if (p.last_key.memcmp(keyBytes, keyBytes.length) > 0) { + try { + unlockPreviousRecord(); + p.connection.commit(); + } catch (SQLException e) { + return COB_STATUS_30_PERMANENT_ERROR; + } return COB_STATUS_21_KEY_INVALID; } } From 7ab13d78d4ef96d3866aba00ac4b8a320cbd49c1 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Tue, 26 Aug 2025 01:49:24 +0000 Subject: [PATCH 08/12] fix: unlock the previous record (rewrite) --- .../libcobj/file/CobolIndexedFile.java | 6 + tests/indexed-lock.src/release-lock.at | 133 ++++++++++++++++++ 2 files changed, 139 insertions(+) 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 7ccd3bc5..d077d65c 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 @@ -1162,6 +1162,12 @@ public int rewrite_(int opt) { if (this.access_mode == COB_ACCESS_SEQUENTIAL && !IndexedCursor.matchKeyHead(p.key, DBT_SET(this.keys[0].getField()))) { + try { + unlockPreviousRecord(); + p.connection.commit(); + } catch (SQLException e) { + return COB_STATUS_30_PERMANENT_ERROR; + } return COB_STATUS_21_KEY_INVALID; } diff --git a/tests/indexed-lock.src/release-lock.at b/tests/indexed-lock.src/release-lock.at index 55e40d12..6e477e2e 100644 --- a/tests/indexed-lock.src/release-lock.at +++ b/tests/indexed-lock.src/release-lock.at @@ -460,4 +460,137 @@ AT_CHECK([cat p2.log], [0], 51 ]) +AT_CLEANUP + +AT_SETUP([unlock (REWRITE)]) +AT_DATA([p1.cbl], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. p1. + + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT F ASSIGN TO "f.dat" + ORGANIZATION IS INDEXED + ACCESS MODE IS SEQUENTIAL + RECORD KEY IS REC-KEY + * LOCK MODE IS AUTOMATIC + ALTERNATE RECORD KEY IS REC-KEY2 WITH DUPLICATES + FILE STATUS IS FILE-STATUS. + + DATA DIVISION. + FILE SECTION. + FD f. + 01 REC. + 05 REC-KEY PIC X(5). + 05 REC-KEY2 PIC X(5). + 05 REC-DATA PIC X(5). + + WORKING-STORAGE SECTION. + 01 FILE-STATUS PIC XX. + 01 DUMMY PIC X(10) VALUE "DUMMY DATA". + PROCEDURE DIVISION. + MAIN-PROCEDURE. + OPEN OUTPUT f. + MOVE "AAAA1" TO REC-KEY. + MOVE "BBBB1" TO REC-KEY2. + MOVE "CCCC1" TO REC-DATA. + WRITE REC. + MOVE "AAAA2" TO REC-KEY. + MOVE "BBBB2" TO REC-KEY2. + MOVE "CCCC2" TO REC-DATA. + WRITE REC. + CLOSE f. + + OPEN I-O f. + MOVE "AAAA1" TO REC-KEY. + START f KEY IS = REC-KEY. + READ F WITH LOCK. + MOVE "AAAA2" TO REC-KEY. + REWRITE REC. + DISPLAY FILE-STATUS. + + + CALL "setValue" USING + "playground-record-lock-01" + "AAAA1 record is released". + CALL "wait" USING + "playground-record-lock-02" + "end of p2". + + CLOSE f. +]) + +AT_DATA([p2.cbl], [ + IDENTIFICATION DIVISION. + PROGRAM-ID. p2. + + ENVIRONMENT DIVISION. + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT F ASSIGN TO "f.dat" + ORGANIZATION IS INDEXED + ACCESS MODE IS DYNAMIC + RECORD KEY IS REC-KEY + ALTERNATE RECORD KEY IS REC-KEY2 WITH DUPLICATES + FILE STATUS IS FILE-STATUS. + + DATA DIVISION. + FILE SECTION. + FD f. + 01 REC. + 05 REC-KEY PIC X(5). + 05 REC-KEY2 PIC X(5). + 05 REC-DATA PIC X(5). + + WORKING-STORAGE SECTION. + 01 FILE-STATUS PIC XX. + 01 REC-EMPTY PIC X(15) VALUE "AAAA1 ". + 01 REC-BACKUP PIC X(15). + 01 DUMMY PIC X(15). + PROCEDURE DIVISION. + MAIN-PROCEDURE. + CALL "wait" USING + "playground-record-lock-01" + "AAAA1 record is released". + + OPEN I-O f. + + INITIALIZE REC. + + MOVE "AAAA1" TO REC-KEY. + READ F WITH LOCK. + DISPLAY FILE-STATUS. + + CALL "setValue" USING + "playground-record-lock-02" + "end of p2". + + CLOSE f. +]) + +AT_DATA([run.sh], [ + java -Xlog:perf+memops=off p1 > p1.log & + PID1=$! + java -Xlog:perf+memops=off p2 > p2.log & + PID2=$! + wait $PID1 $PID2 +]) + +AT_CHECK([cp ../../indexed-lock.src/module-sync/wait.java .]) +AT_CHECK([cp ../../indexed-lock.src/module-sync/setValue.java .]) +AT_CHECK([cobj p1.cbl p2.cbl]) +AT_CHECK([javac wait.java setValue.java]) + +# run a test +AT_CHECK([bash run.sh]) + +AT_CHECK([cat p1.log], [0], +[21 +]) + +AT_CHECK([cat p2.log], [0], +[00 +]) + AT_CLEANUP \ No newline at end of file From bc70285d005149033b17c810e38e1999fc3d4f15 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Tue, 26 Aug 2025 02:09:55 +0000 Subject: [PATCH 09/12] fix: unlock previous records --- .../libcobj/file/CobolFile.java | 33 +++++++++++++++++++ .../libcobj/file/CobolIndexedFile.java | 10 ++++++ 2 files changed, 43 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 85c25c6b..965cf735 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 @@ -904,6 +904,25 @@ private static String concatString(String... strs) { return sb.toString(); } + /** + * Post-process the file after operations are complete. + * This method are mainly for unlocking the indexed files. + * + * @return true if post-processing is successful, false otherwise. + */ + protected boolean postProcess() { + return true; + } + + private void runPostProcess(AbstractCobolField fnstatus) { + postProcess(); + // TODO: Implement error handling + //boolean postProcessSucceeded = postProcess(); + //if(!postProcessSucceeded) { + // this.saveStatus(COB_STATUS_30_PERMANENT_ERROR, fnstatus); + //} + } + /** * TODO: 準備中 * @@ -1405,10 +1424,12 @@ public void read(AbstractCobolField key, AbstractCobolField fnstatus, int readOp if (this.flag_nonexistent) { if (this.flag_first_read == 0) { saveStatus(COB_STATUS_23_KEY_NOT_EXISTS, fnstatus); + runPostProcess(fnstatus); return; } this.flag_first_read = 0; saveStatus(COB_STATUS_10_END_OF_FILE, fnstatus); + runPostProcess(fnstatus); return; } @@ -1416,10 +1437,12 @@ public void read(AbstractCobolField key, AbstractCobolField fnstatus, int readOp if (key == null) { if (this.flag_end_of_file && (readOpts & COB_READ_PREVIOUS) == 0) { saveStatus(COB_STATUS_46_READ_ERROR, fnstatus); + runPostProcess(fnstatus); return; } if (this.flag_begin_of_file && (readOpts & COB_READ_PREVIOUS) != 0) { saveStatus(COB_STATUS_46_READ_ERROR, fnstatus); + runPostProcess(fnstatus); return; } } @@ -1428,6 +1451,7 @@ public void read(AbstractCobolField key, AbstractCobolField fnstatus, int readOp || this.open_mode == COB_OPEN_OUTPUT || this.open_mode == COB_OPEN_EXTEND) { saveStatus(COB_STATUS_47_INPUT_DENIED, fnstatus); + runPostProcess(fnstatus); return; } @@ -1555,6 +1579,7 @@ public void write(AbstractCobolField rec, int opt, AbstractCobolField fnstatus) || this.open_mode == COB_OPEN_INPUT || this.open_mode == COB_OPEN_I_O) { saveStatus(COB_STATUS_48_OUTPUT_DENIED, fnstatus); + runPostProcess(fnstatus); return; } } else { @@ -1562,6 +1587,7 @@ public void write(AbstractCobolField rec, int opt, AbstractCobolField fnstatus) || this.open_mode == COB_OPEN_INPUT || this.open_mode == COB_OPEN_EXTEND) { saveStatus(COB_STATUS_48_OUTPUT_DENIED, fnstatus); + runPostProcess(fnstatus); return; } } @@ -1575,6 +1601,7 @@ public void write(AbstractCobolField rec, int opt, AbstractCobolField fnstatus) if (this.record.getSize() < this.record_min || this.record_max < this.record.getSize()) { saveStatus(COB_STATUS_44_RECORD_OVERFLOW, fnstatus); + runPostProcess(fnstatus); return; } @@ -1654,20 +1681,24 @@ public void rewrite(AbstractCobolField rec, int opt, AbstractCobolField fnstatus if (this.open_mode == COB_OPEN_CLOSED || this.open_mode != COB_OPEN_I_O) { saveStatus(COB_STATUS_49_I_O_DENIED, fnstatus); + runPostProcess(fnstatus); return; } if (this.access_mode == COB_ACCESS_SEQUENTIAL && !readDone) { saveStatus(COB_STATUS_43_READ_NOT_DONE, fnstatus); + runPostProcess(fnstatus); return; } if (this.organization == COB_ORG_SEQUENTIAL) { if (this.record.getSize() != rec.getSize()) { saveStatus(COB_STATUS_44_RECORD_OVERFLOW, fnstatus); + runPostProcess(fnstatus); return; } if (this.record_size != null) { if (this.record.getSize() != this.record_size.getInt()) { saveStatus(COB_STATUS_44_RECORD_OVERFLOW, fnstatus); + runPostProcess(fnstatus); return; } } @@ -1718,11 +1749,13 @@ public void delete(AbstractCobolField fnstatus) { if (this.open_mode == COB_OPEN_CLOSED || this.open_mode != COB_OPEN_I_O) { saveStatus(COB_STATUS_49_I_O_DENIED, fnstatus); + runPostProcess(fnstatus); return; } if (this.access_mode == COB_ACCESS_SEQUENTIAL && !readDone) { saveStatus(COB_STATUS_43_READ_NOT_DONE, fnstatus); + runPostProcess(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 d077d65c..368dc37f 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 @@ -711,6 +711,16 @@ private void unlockPreviousRecord() throws SQLException { previousLockedRecordKey = null; } + @Override + protected boolean postProcess() { + try { + unlockPreviousRecord(); + } catch (SQLException e) { + return false; + } + return true; + } + private void unlockPreviousRecord(byte[] key) throws SQLException { if (previousLockedRecordKey == null) { previousLockedRecordKey = key; From df8b8baa819b25cdb6a63719fed189922102da2e Mon Sep 17 00:00:00 2001 From: yutaro-sakamoto <80912876+yutaro-sakamoto@users.noreply.github.com> Date: Wed, 27 Aug 2025 14:59:41 +0900 Subject: [PATCH 10/12] Update libcobj/app/src/main/java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../jp/osscons/opensourcecobol/libcobj/file/CobolFile.java | 4 +--- 1 file changed, 1 insertion(+), 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 5e6943df..0bb5ce2c 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 @@ -907,9 +907,7 @@ private static String concatString(String... strs) { return sb.toString(); } - /** - * Post-process the file after operations are complete. - * This method are mainly for unlocking the indexed files. + * This method is mainly for unlocking the indexed files. * * @return true if post-processing is successful, false otherwise. */ From ad58f5c9b497d7b486b0c3c19d3d782cecd88c45 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Wed, 27 Aug 2025 06:08:03 +0000 Subject: [PATCH 11/12] fix: an invalid comment --- .../java/jp/osscons/opensourcecobol/libcobj/file/CobolFile.java | 1 + 1 file changed, 1 insertion(+) 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 0bb5ce2c..e87429ba 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 @@ -907,6 +907,7 @@ private static String concatString(String... strs) { return sb.toString(); } + /** * This method is mainly for unlocking the indexed files. * * @return true if post-processing is successful, false otherwise. From d20a38454124dd6e53ad2e0864891c61906b29f5 Mon Sep 17 00:00:00 2001 From: Yutaro Sakamoto Date: Wed, 27 Aug 2025 06:10:15 +0000 Subject: [PATCH 12/12] refactor: format Java files --- .../osscons/opensourcecobol/libcobj/file/CobolFile.java | 8 ++++---- .../opensourcecobol/libcobj/file/CobolIndexedFile.java | 9 +++++---- 2 files changed, 9 insertions(+), 8 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 e87429ba..1b6c65a4 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 @@ -909,7 +909,7 @@ private static String concatString(String... strs) { /** * This method is mainly for unlocking the indexed files. - * + * * @return true if post-processing is successful, false otherwise. */ protected boolean postProcess() { @@ -919,10 +919,10 @@ protected boolean postProcess() { private void runPostProcess(AbstractCobolField fnstatus) { postProcess(); // TODO: Implement error handling - //boolean postProcessSucceeded = postProcess(); - //if(!postProcessSucceeded) { + // boolean postProcessSucceeded = postProcess(); + // if(!postProcessSucceeded) { // this.saveStatus(COB_STATUS_30_PERMANENT_ERROR, fnstatus); - //} + // } } /** 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 035cfda2..368dc37f 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,9 +227,9 @@ public int open_(String filename, int mode, int sharing) { return getConnectionStatus; } - if(fileExists) { + if (fileExists) { int code = this.checkVersionOld(); - if(code != COB_STATUS_00_SUCCESS) { + if (code != COB_STATUS_00_SUCCESS) { return code; } } @@ -303,11 +303,12 @@ 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')"; + "select exists(select 1 from sqlite_master where type = 'table' and name =" + + " 'file_lock')"; ResultSet fileLockTableExistsResultSet = st.executeQuery(fileLockTableExistsSql); if (fileLockTableExistsResultSet.next()) { boolean fileLockTableExists = fileLockTableExistsResultSet.getInt(1) == 1; - if(!fileLockTableExists) { + if (!fileLockTableExists) { return COB_STATUS_92_VERSION_INCOMPATIBLE; } } else {