10 changed files with 259 additions and 1 deletions
@ -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(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -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(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -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); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -1,8 +1,28 @@ |
|||||||
package org.leolo.nrdatad.db.test; |
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() { |
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; |
||||||
|
} |
||||||
} |
} |
||||||
|
|||||||
@ -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…
Reference in new issue