Browse Source

Basic Dao structure and MetadataDao

MetadataDao currently support stub and MariaDB
feature-db-basic
LO Kam Tao Leo 3 years ago
parent
commit
8111c693ce
  1. 1
      .gitignore
  2. 11
      pom.xml
  3. 6
      src/main/java/org/leolo/nrdatad/App.java
  4. 18
      src/main/java/org/leolo/nrdatad/db/BaseDao.java
  5. 3
      src/main/java/org/leolo/nrdatad/db/DatabaseManager.java
  6. 42
      src/main/java/org/leolo/nrdatad/db/MetadataDao.java
  7. 6
      src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java
  8. 116
      src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java
  9. 22
      src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java
  10. 40
      src/test/java/org/leolo/nrdatad/db/test/MetadataDao.java

1
.gitignore vendored

@ -42,3 +42,4 @@ build/
ri_log*
test-*.tmp
.idea/workspace.xml
.idea/

11
pom.xml

@ -50,6 +50,17 @@
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

6
src/main/java/org/leolo/nrdatad/App.java

@ -85,5 +85,11 @@ public class App {
System.exit(1);
return;
}
loadCronJob();
}
private void loadCronJob() {
log.atDebug().log("Start loading cron jobs");
}
}

18
src/main/java/org/leolo/nrdatad/db/BaseDao.java

@ -0,0 +1,18 @@
package org.leolo.nrdatad.db;
import java.sql.Connection;
import java.sql.SQLException;
public abstract class BaseDao {
private DatabaseManager manager;
public BaseDao(DatabaseManager manager){
this.manager = manager;
}
protected Connection getConnection() throws SQLException{
return manager.getConnection();
}
}

3
src/main/java/org/leolo/nrdatad/db/DatabaseManager.java

@ -2,6 +2,7 @@ package org.leolo.nrdatad.db;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.function.BiConsumer;
public interface DatabaseManager {
@ -10,4 +11,6 @@ public interface DatabaseManager {
public boolean checkConnection();
public Connection getConnection() throws SQLException;
public MetadataDao getMetadataDao();
}

42
src/main/java/org/leolo/nrdatad/db/MetadataDao.java

@ -0,0 +1,42 @@
package org.leolo.nrdatad.db;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.leolo.nrdatad.ConfigurationManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Set;
import java.util.function.BiConsumer;
public abstract class MetadataDao extends BaseDao {
Logger log = LogManager.getLogger();
public MetadataDao(DatabaseManager manager){
super(manager);
}
public abstract String getMetadata(String key, String defaultValue) throws SQLException;
public String getMetadata(String key) throws SQLException{
return getMetadata(key, null);
}
public abstract void updateMetadata(String key, @NotNull String value) throws SQLException;
public abstract Set<String> getKeys() throws SQLException;
public abstract void forEach(BiConsumer<String, String> action) throws SQLException;
public boolean containsKey(String key) throws SQLException{
return getKeys().contains(key);
}
public int entryCount() throws SQLException{
return getKeys().size();
}
}

6
src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java

@ -3,6 +3,7 @@ package org.leolo.nrdatad.db.mariadb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.leolo.nrdatad.ConfigurationManager;
import org.leolo.nrdatad.db.MetadataDao;
import org.mariadb.jdbc.MariaDbPoolDataSource;
import java.sql.*;
@ -57,4 +58,9 @@ public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager{
public Connection getConnection() throws SQLException{
return ds.getConnection();
}
@Override
public MetadataDao getMetadataDao() {
return new org.leolo.nrdatad.db.mariadb.MetadataDao(this);
}
}

116
src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java

@ -0,0 +1,116 @@
package org.leolo.nrdatad.db.mariadb;
import org.jetbrains.annotations.NotNull;
import java.sql.*;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.BiConsumer;
public class MetadataDao extends org.leolo.nrdatad.db.MetadataDao {
private static Object SYNC_TOKEN = new Object();
public MetadataDao(DatabaseManager manager){
super(manager);
}
@Override
public String getMetadata(String key, String defaultValue) throws SQLException {
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT value FROM metadata WHERE `key` = ?")
){
pstmt.setString(1, key);
try(ResultSet rs = pstmt.executeQuery()){
if(rs.next()){
return rs.getString(1);
}
}
}
return defaultValue;
}
@Override
public void updateMetadata(@NotNull String key, @NotNull String value) throws SQLException {
synchronized (SYNC_TOKEN) {
if (containsKey(key)) {
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("UPDATE metadata SET value = ? WHERE `key` = ?")
){
pstmt.setString(1, value);
pstmt.setString(2, key);
pstmt.executeUpdate();
}
} else {
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO metadata (`key`, value) VALUES (?,?)")
){
pstmt.setString(1, key);
pstmt.setString(2, value);
pstmt.executeUpdate();
}
}
}
}
@Override
public Set<String> getKeys() throws SQLException {
HashSet<String> set = new HashSet<>();
try(
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT `key` FROM metadata")
){
while(rs.next()){
set.add(rs.getString(1));
}
}
return set;
}
@Override
public void forEach(BiConsumer<String, String> action) throws SQLException {
TreeMap<String, String> map = new TreeMap<>();
try(
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT `key`, value FROM metadata")
){
while(rs.next()){
map.put(rs.getString(1), rs.getString(2));
}
}
map.forEach(action);
}
@Override
public boolean containsKey(String key) throws SQLException {
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM metadata WHERE `key` = ?")
){
pstmt.setString(1, key);
try(ResultSet rs = pstmt.executeQuery()){
return rs.next();
}
}
}
@Override
public int entryCount() throws SQLException {
try(
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM metadata")
){
rs.next();
return rs.getInt(1);
}
}
}

22
src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java

@ -1,8 +1,28 @@
package org.leolo.nrdatad.db.test;
public class DatabaseManager {
import org.leolo.nrdatad.db.MetadataDao;
import java.sql.Connection;
import java.sql.SQLException;
public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager {
public void initPool() {
}
@Override
public boolean checkConnection() {
return true;
}
@Override
public Connection getConnection() throws SQLException {
throw new RuntimeException("Function not supported by stub");
}
@Override
public MetadataDao getMetadataDao() {
return null;
}
}

40
src/test/java/org/leolo/nrdatad/db/test/MetadataDao.java

@ -0,0 +1,40 @@
package org.leolo.nrdatad.db.test;
import org.jetbrains.annotations.NotNull;
import org.leolo.nrdatad.db.DatabaseManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Set;
import java.util.function.BiConsumer;
public class MetadataDao extends org.leolo.nrdatad.db.MetadataDao {
private HashMap<String, String> dataMap = new HashMap<>();
public MetadataDao(DatabaseManager manager) {
super(manager);
}
@Override
public String getMetadata(String key, String defaultValue) throws SQLException {
if(dataMap.containsKey(key))
return dataMap.get(key);
return defaultValue;
}
@Override
public void updateMetadata(String key, @NotNull String value) throws SQLException {
dataMap.put(key, value);
}
@Override
public Set<String> getKeys() throws SQLException {
return dataMap.keySet();
}
@Override
public void forEach(BiConsumer<String, String> action) throws SQLException {
dataMap.forEach(action);
}
}
Loading…
Cancel
Save