From a84a4ca321477fd804224e7a2ebb1aacb8b124f5 Mon Sep 17 00:00:00 2001 From: "Christian P. MOMON" Date: Fri, 6 Sep 2013 00:39:18 +0200 Subject: [PATCH] Improve column order. Add log on open action. Clean files. --- bin/fr/devinsy/sikevadb/FileSikevaDB.class | Bin 5126 -> 5238 bytes bin/fr/devinsy/sikevadb/SQLSikevaDB.class | Bin 29405 -> 29870 bytes bin/fr/devinsy/sikevadb/SikevaDBFactory.class | Bin 983 -> 1174 bytes build.num | 4 +- {resources/sql => scripts}/create.sql | 22 ++- src/fr/devinsy/sikevadb/SQLSikevaDB.java | 141 ++++++++++-------- 6 files changed, 87 insertions(+), 80 deletions(-) rename {resources/sql => scripts}/create.sql (56%) diff --git a/bin/fr/devinsy/sikevadb/FileSikevaDB.class b/bin/fr/devinsy/sikevadb/FileSikevaDB.class index 16c52f9b6bc16b3dd501b5fd504069c587ee425b..53312c1124ebb8bef8f70ed473fc101b5daa78bb 100644 GIT binary patch literal 5238 zcmb7{J8&CC7{|YrWy@A%JGK)ZCImZxEk6?Fft{E<{0=A)xG=b&;v}!_OU{z#bn@5~ zR8&+{R8&+nFfhXmGbtD<3Wkb`ii(Pgii%-M~>!aDEWe!u75Lv7>(`tg>8Q5R_n)wy8DzLI@{&KL)YV*vaz<3p){lOPn<)i;5pUZ!bbTC zuLK$DVRT6s8^tl|x#w2h-~pqdd`ZT;HA%iZwZ$mCTHEGX>Y{Tw%219`S6J7+nliNmrYJ z?^buEvSHP+^){o7<5%|FL+Ht_A6584;MS`3486c;q?wwNCvfwWA2XWN3=yXb-#zt4 zS%wT&Jns0*p0^wgm{WJ6=19nF1g=+Da{?|!XUlx2=5x`;Y^gDtJ&=TaQ4EvWcaGMa zW2BB18TCstVw|#5M_hNstBLDyrPinh8#_?3?(uzI4G@6&d6bYe+_!X!p3g^cWoWxO z!eIEMd1qjk2d6~b)FgCDy9go(7QmV&NHYs2Oje0`%tiVx=T8kQQ?1re$*l(%v|sh! zl+%iU>lzUTL{1^L9IwGaSkVv+HsZ2|1T)Nh1Qy1^bTPW28ReADlT9KFf!9?{j6s=( za;_-@ZZl}9R10}0Y3xNq>Si>d8FeZ?ETcP`j`4ol(7tFmD9Y~h{hEKg>3)O~8EH09 zCsA#tYX`iFQaNY@*je*utteTw8LrBU(aUG{MQI+2RlsP$%8SOG*kgPc5L;NE`UjN- zSDUqlU*TfU#75n^bzT!28;ukE;IA9+j2pOSs29I|Xx+y(g=_cp50w25|D>oNzgc;6 zoYM3v4WRv;>O_Nd9xZgIAsR-gK#ka-rhuABL|u@mi$J9?6rnG+7^!a#EuoJ!we{ek zu+h|oH%_RF(TfzpMq{u=#C7Rlw%oS=LdIgj3AvBV=kY;hh%3U;(wCTJ>TEa9$LBXP!#WT-_FX9!xf zNTw~kcv>&h7G8XVmuU+xN7i0uEWCWI^)h4OwLtC*$J8_YcBU9K7S zZQE-5%%E+SuEl6epvlz}qkV3zvOw2k+*xqN7L$r`zmQzD$3&|V2LOB;*gO5w;Pe(~ zs;HB*^_7wFM#xCc(KpsPnzK;!y+P3&nH4>=Ry0qyJIMG?25s|nCq_%o+t1c27dond zUkxf3I;w!*tX00*Q3d=ix$PBjx1$R9!{GED4odd*^rw;bz*q}^S!Zj}q89!(C|b0r zg@3FSEm^!X{*|=$Sz9u{Gg!*tWy$=`V7=B}mf@v+<`YjSY(VR38LrwHiDwmd!QgKh z{@Q7YrxrG9?R3R>bYtT!_M$^Kz8q;SCMfAZ%O+dgMF>JQtkXmM3fL%q#ivQqX`Nkd zvDAuChdBXzD?F{Q(%T`d2w)n2?cWjXmV`~Khi4r9Bdqw0Dt7Rp!WI$?M@P>h47X2b YqV+|i_2>-xs1uFr291x!(Su6=1F|xFApigX literal 5126 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 LJP+ZGnwI*%bu|r7 literal 29405 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 diff --git a/build.num b/build.num index c74c55d..02e62d4 100644 --- a/build.num +++ b/build.num @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Sat Aug 24 15:54:52 CEST 2013 -build.number=1 +#Tue Sep 03 00:05:56 CEST 2013 +build.number=2 diff --git a/resources/sql/create.sql b/scripts/create.sql similarity index 56% rename from resources/sql/create.sql rename to scripts/create.sql index 9dde68f..ca10ce9 100644 --- a/resources/sql/create.sql +++ b/scripts/create.sql @@ -1,12 +1,6 @@ SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; --- --- Base de données: `sikevadb-kiwa` --- -CREATE DATABASE IF NOT EXISTS `sikevadb-test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; -USE `sikevadb-kiwa`; - -- -------------------------------------------------------- -- @@ -15,14 +9,16 @@ USE `sikevadb-kiwa`; DROP TABLE IF EXISTS `elements`; CREATE TABLE IF NOT EXISTS `elements` ( + `ID` int(11) NOT NULL AUTO_INCREMENT, `TOPKEY` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `SUBKEY` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `VALUE` longtext COLLATE utf8_unicode_ci, `SIZE` int(11) NOT NULL DEFAULT '0', `DIGEST` varchar(255) COLLATE utf8_unicode_ci NOT NULL, - `CREATION_DATE` date NOT NULL, - `EDITION_DATE` date NOT NULL, - `ARCHIVE_DATE` date DEFAULT NULL, - `VALUE` longtext COLLATE utf8_unicode_ci, - PRIMARY KEY (`TOPKEY`), - KEY `XKEYINDEX` (`TOPKEY`,`SUBKEY`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + `CREATION_DATE` datetime NOT NULL, + `EDITION_DATE` datetime NOT NULL, + `ARCHIVE_DATE` datetime DEFAULT NULL, + PRIMARY KEY (`ID`), + KEY `XKEYINDEX` (`TOPKEY`,`SUBKEY`), + KEY `TOPKEYINDEX` (`TOPKEY`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; diff --git a/src/fr/devinsy/sikevadb/SQLSikevaDB.java b/src/fr/devinsy/sikevadb/SQLSikevaDB.java index 9e4fd35..56d53fb 100644 --- a/src/fr/devinsy/sikevadb/SQLSikevaDB.java +++ b/src/fr/devinsy/sikevadb/SQLSikevaDB.java @@ -29,6 +29,8 @@ import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import fr.devinsy.util.StringList; @@ -38,6 +40,7 @@ import fr.devinsy.util.StringList; * @author Christian P. Momon */ public class SQLSikevaDB implements SikevaDB { + private static final Logger logger = LoggerFactory.getLogger(SQLSikevaDB.class); private String driverClassname; private String url; private String login; @@ -584,7 +587,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE TOPKEY=? ORDER BY ARCHIVE_DATE ASC"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE TOPKEY=? ORDER BY ARCHIVE_DATE ASC"); statement.setString(1, key); resultSet = statement.executeQuery(); @@ -593,12 +596,12 @@ public class SQLSikevaDB implements SikevaDB { Element element = new Element(); element.setKey(resultSet.getString(1)); element.setSubkey(resultSet.getString(2)); - element.setSize(resultSet.getLong(3)); - element.setDigest(resultSet.getString(4)); - element.setCreationDate(dateToDate(resultSet.getDate(5))); - element.setEditionDate(dateToDate(resultSet.getDate(6))); - element.setArchiveDate(dateToDate(resultSet.getDate(7))); - element.setValue(resultSet.getString(8)); + element.setValue(resultSet.getString(3)); + element.setSize(resultSet.getLong(4)); + element.setDigest(resultSet.getString(5)); + element.setCreationDate(dateToDate(resultSet.getDate(6))); + element.setEditionDate(dateToDate(resultSet.getDate(7))); + element.setArchiveDate(dateToDate(resultSet.getDate(8))); // result.add(element); @@ -634,7 +637,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE TOPKEY=? AND SUBKEY=? ORDER BY ARCHIVE_DATE ASC"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE TOPKEY=? AND SUBKEY=? ORDER BY ARCHIVE_DATE ASC"); statement.setString(1, key); statement.setString(2, subkey); resultSet = statement.executeQuery(); @@ -644,12 +647,12 @@ public class SQLSikevaDB implements SikevaDB { Element element = new Element(); element.setKey(resultSet.getString(1)); element.setSubkey(resultSet.getString(2)); - element.setSize(resultSet.getLong(3)); - element.setDigest(resultSet.getString(4)); - element.setCreationDate(dateToDate(resultSet.getDate(5))); - element.setEditionDate(dateToDate(resultSet.getDate(6))); - element.setArchiveDate(dateToDate(resultSet.getDate(7))); - element.setValue(resultSet.getString(8)); + element.setValue(resultSet.getString(3)); + element.setSize(resultSet.getLong(4)); + element.setDigest(resultSet.getString(5)); + element.setCreationDate(dateToDate(resultSet.getDate(6))); + element.setEditionDate(dateToDate(resultSet.getDate(7))); + element.setArchiveDate(dateToDate(resultSet.getDate(8))); // result.add(element); @@ -714,7 +717,7 @@ public class SQLSikevaDB implements SikevaDB { try { connection = getConnection(); connection.setAutoCommit(true); - statement = connection.prepareStatement("SELECT DISTINCT SUBKEY FROM elements WHERE KEY=? ORDER BY CREATION_DATE ASC"); + statement = connection.prepareStatement("SELECT DISTINCT SUBKEY FROM elements WHERE TOPKEY=? ORDER BY CREATION_DATE ASC"); statement.setString(1, key); resultSet = statement.executeQuery(); @@ -924,7 +927,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE ARCHIVE_DATE IS NULL AND TOPKEY=? AND SUBKEY IS NULL"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE ARCHIVE_DATE IS NULL AND TOPKEY=? AND SUBKEY IS NULL"); statement.setString(1, key); resultSet = statement.executeQuery(); @@ -934,12 +937,13 @@ public class SQLSikevaDB implements SikevaDB { result = new Element(); result.setKey(resultSet.getString(1)); result.setSubkey(resultSet.getString(2)); - result.setSize(resultSet.getLong(3)); - result.setDigest(resultSet.getString(4)); - result.setCreationDate(dateToDate(resultSet.getDate(5))); - result.setEditionDate(dateToDate(resultSet.getDate(6))); - result.setArchiveDate(dateToDate(resultSet.getDate(7))); - result.setValue(resultSet.getString(8)); + result.setValue(resultSet.getString(3)); + result.setSize(resultSet.getLong(4)); + result.setDigest(resultSet.getString(5)); + result.setCreationDate(dateToDate(resultSet.getDate(6))); + result.setEditionDate(dateToDate(resultSet.getDate(7))); + result.setArchiveDate(dateToDate(resultSet.getDate(8))); + } else { result = null; } @@ -977,7 +981,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE ARCHIVE_DATE IS NULL AND TOPKEY=? AND SUBKEY=?"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE ARCHIVE_DATE IS NULL AND TOPKEY=? AND SUBKEY=?"); statement.setString(1, key); statement.setString(2, subkey); resultSet = statement.executeQuery(); @@ -988,12 +992,12 @@ public class SQLSikevaDB implements SikevaDB { result = new Element(); result.setKey(resultSet.getString(1)); result.setSubkey(resultSet.getString(2)); - result.setSize(resultSet.getLong(3)); - result.setDigest(resultSet.getString(4)); - result.setCreationDate(dateToDate(resultSet.getDate(5))); - result.setEditionDate(dateToDate(resultSet.getDate(6))); - result.setArchiveDate(dateToDate(resultSet.getDate(7))); - result.setValue(resultSet.getString(8)); + result.setValue(resultSet.getString(3)); + result.setSize(resultSet.getLong(4)); + result.setDigest(resultSet.getString(5)); + result.setCreationDate(dateToDate(resultSet.getDate(6))); + result.setEditionDate(dateToDate(resultSet.getDate(7))); + result.setArchiveDate(dateToDate(resultSet.getDate(8))); } else { result = null; } @@ -1030,7 +1034,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE ARCHIVE_DATE IS NOT NULL AND TOPKEY=? ORDER BY CREATION_DATE ASC"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE ARCHIVE_DATE IS NOT NULL AND TOPKEY=? ORDER BY CREATION_DATE ASC"); statement.setString(1, key); resultSet = statement.executeQuery(); @@ -1039,12 +1043,12 @@ public class SQLSikevaDB implements SikevaDB { Element element = new Element(); element.setKey(resultSet.getString(1)); element.setSubkey(resultSet.getString(2)); - element.setSize(resultSet.getLong(3)); - element.setDigest(resultSet.getString(4)); - element.setCreationDate(dateToDate(resultSet.getDate(5))); - element.setEditionDate(dateToDate(resultSet.getDate(6))); - element.setArchiveDate(dateToDate(resultSet.getDate(7))); - element.setValue(resultSet.getString(8)); + element.setValue(resultSet.getString(3)); + element.setSize(resultSet.getLong(4)); + element.setDigest(resultSet.getString(5)); + element.setCreationDate(dateToDate(resultSet.getDate(6))); + element.setEditionDate(dateToDate(resultSet.getDate(7))); + element.setArchiveDate(dateToDate(resultSet.getDate(8))); // result.add(element); @@ -1080,7 +1084,7 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("SELECT TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE FROM elements WHERE ARCHIVE_DATE IS NOT NULL AND TOPKEY=? AND SUBKEY=? ORDER BY CREATION_DATE ASC"); + .prepareStatement("SELECT TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE FROM elements WHERE ARCHIVE_DATE IS NOT NULL AND TOPKEY=? AND SUBKEY=? ORDER BY CREATION_DATE ASC"); statement.setString(1, key); statement.setString(2, subkey); resultSet = statement.executeQuery(); @@ -1090,12 +1094,12 @@ public class SQLSikevaDB implements SikevaDB { Element element = new Element(); element.setKey(resultSet.getString(1)); element.setSubkey(resultSet.getString(2)); - element.setSize(resultSet.getLong(3)); - element.setDigest(resultSet.getString(4)); - element.setCreationDate(dateToDate(resultSet.getDate(5))); - element.setEditionDate(dateToDate(resultSet.getDate(6))); - element.setArchiveDate(dateToDate(resultSet.getDate(7))); - element.setValue(resultSet.getString(8)); + element.setValue(resultSet.getString(3)); + element.setSize(resultSet.getLong(4)); + element.setDigest(resultSet.getString(5)); + element.setCreationDate(dateToDate(resultSet.getDate(6))); + element.setEditionDate(dateToDate(resultSet.getDate(7))); + element.setArchiveDate(dateToDate(resultSet.getDate(8))); // result.add(element); @@ -1544,11 +1548,18 @@ public class SQLSikevaDB implements SikevaDB { // if (this.url != null) { + // Class.forName(this.driverClassname).newInstance(); this.singleConnection = DriverManager.getConnection(this.url, this.login, this.password); + logger.info("Single connection opened with [{}].", this.url); + } else if (this.contextName != null) { + // Context initialContext = new InitialContext(); - this.dataSource = (DataSource) initialContext.lookup(this.contextName); + Context environmentContext = (Context) initialContext.lookup("java:comp/env"); + this.dataSource = (DataSource) environmentContext.lookup(this.contextName); + logger.info("Database {} opened.", this.contextName); + } else { throw new IllegalArgumentException("Undefined source."); } @@ -1567,16 +1578,16 @@ public class SQLSikevaDB implements SikevaDB { connection = getConnection(); connection.setAutoCommit(true); statement = connection - .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); + .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, element.getKey()); statement.setString(2, element.getSubkey()); - statement.setLong(3, element.getSize()); - statement.setString(4, element.getDigest()); - statement.setDate(5, dateToDate(element.getCreationDate())); - statement.setDate(6, dateToDate(element.getEditionDate())); - statement.setDate(7, dateToDate(element.getArchiveDate())); - statement.setString(8, element.getValue()); + statement.setString(3, element.getValue()); + statement.setLong(4, element.getSize()); + statement.setString(5, element.getDigest()); + statement.setDate(6, dateToDate(element.getCreationDate())); + statement.setDate(7, dateToDate(element.getEditionDate())); + statement.setDate(8, dateToDate(element.getArchiveDate())); statement.executeUpdate(); @@ -1627,16 +1638,16 @@ public class SQLSikevaDB implements SikevaDB { // Insert new version of the element. statement.clearParameters(); statement = connection - .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); + .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, element.getKey()); statement.setString(2, element.getSubkey()); - statement.setLong(3, element.getSize()); - statement.setString(4, element.getDigest()); - statement.setDate(5, dateToDate(element.getCreationDate())); - statement.setDate(6, dateToDate(element.getEditionDate())); - statement.setDate(7, dateToDate(element.getArchiveDate())); - statement.setString(8, element.getValue()); + statement.setString(3, element.getValue()); + statement.setLong(4, element.getSize()); + statement.setString(5, element.getDigest()); + statement.setDate(6, dateToDate(element.getCreationDate())); + statement.setDate(7, dateToDate(element.getEditionDate())); + statement.setDate(8, dateToDate(element.getArchiveDate())); statement.executeUpdate(); @@ -1697,16 +1708,16 @@ public class SQLSikevaDB implements SikevaDB { // Insert new version of the element. statement.clearParameters(); statement = connection - .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE,VALUE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); + .prepareStatement("INSERT INTO elements (TOPKEY,SUBKEY,VALUE,SIZE,DIGEST,CREATION_DATE,EDITION_DATE,ARCHIVE_DATE) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, element.getKey()); statement.setString(2, element.getSubkey()); - statement.setLong(3, element.getSize()); - statement.setString(4, element.getDigest()); - statement.setDate(5, dateToDate(element.getCreationDate())); - statement.setDate(6, dateToDate(element.getEditionDate())); - statement.setDate(7, dateToDate(element.getArchiveDate())); - statement.setString(8, element.getValue()); + statement.setString(3, element.getValue()); + statement.setLong(4, element.getSize()); + statement.setString(5, element.getDigest()); + statement.setDate(6, dateToDate(element.getCreationDate())); + statement.setDate(7, dateToDate(element.getEditionDate())); + statement.setDate(8, dateToDate(element.getArchiveDate())); statement.executeUpdate();