started adding comments, restructured Database class
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>org.example</groupId>
|
<groupId>org.example</groupId>
|
||||||
<artifactId>Widerhall</artifactId>
|
<artifactId>Widerhall</artifactId>
|
||||||
<version>0.0.3</version>
|
<version>0.0.4</version>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|||||||
@@ -12,72 +12,130 @@ import java.util.*;
|
|||||||
|
|
||||||
import static de.srsoftware.widerhall.Util.t;
|
import static de.srsoftware.widerhall.Util.t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stephan Richter, 2022
|
||||||
|
* This class abstracts away all needed database operations
|
||||||
|
*/
|
||||||
public class Database {
|
public class Database {
|
||||||
public static final String HASHED_PASS = "hashedPassword";
|
|
||||||
public static final String SALT = "salt";
|
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(Database.class);
|
private static final Logger LOG = LoggerFactory.getLogger(Database.class);
|
||||||
private static Database singleton = null;
|
private static Database singleton = null; // we only need one db handle ever. This will be it.
|
||||||
private final Connection conn;
|
private final Connection conn; // the actual db connection handle within the singleton
|
||||||
|
|
||||||
public class Request{
|
public class CompiledRequest{
|
||||||
|
private final String sql;
|
||||||
|
private final List<Object> args;
|
||||||
|
|
||||||
private final StringBuilder sql;
|
public CompiledRequest(String sql, List<Object> args){
|
||||||
private final HashMap<String, List<Object>> where = new HashMap<>();
|
this.sql = sql;
|
||||||
private final HashMap<String,Object> values = new HashMap<>();
|
this.args = args;
|
||||||
private final HashMap<String,Object> setValues = new HashMap<>();
|
|
||||||
|
|
||||||
public Request(String sql) {
|
|
||||||
this(new StringBuilder(sql));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* build the final SQL and execute the actual request (for SELECT statements)
|
||||||
|
* @return the result set produced by the SELECT statement
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public ResultSet exec() throws SQLException {
|
||||||
|
LOG.debug("Executing {}",this);
|
||||||
|
try {
|
||||||
|
var stmt = conn.prepareStatement(sql);
|
||||||
|
for (int i = 0; i < args.size(); i++) stmt.setObject(i+1, args.get(i));
|
||||||
|
return stmt.executeQuery();
|
||||||
|
} catch (SQLException sqle) { // add sql to the exception
|
||||||
|
throw new SQLException(t("Query '{}' failed:",this),sqle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* build the final SQL and execure the actual request (for statements that generate no result)
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public void run() throws SQLException {
|
||||||
|
LOG.debug("Running {}",this);
|
||||||
|
try {
|
||||||
|
var stmt = conn.prepareStatement(sql);
|
||||||
|
for (int i = 0; i < args.size(); i++) stmt.setObject(i+1, args.get(i));
|
||||||
|
stmt.execute();
|
||||||
|
} catch (SQLException sqle) {
|
||||||
|
throw new SQLException(t("Query '{}' failed:",this),sqle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
var filled = sql;
|
||||||
|
int pos = filled.indexOf('?');
|
||||||
|
int idx = 0;
|
||||||
|
while (pos>0){
|
||||||
|
var fill = args.get(idx++);
|
||||||
|
var s = fill == null ? "NULL" : (fill instanceof Number ? ""+fill : "'"+fill+"'");
|
||||||
|
filled = filled.substring(0,pos)+s+filled.substring(pos+1);
|
||||||
|
pos = filled.indexOf('?',pos+s.length());
|
||||||
|
}
|
||||||
|
return filled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* helper class to allow daisy-chaining request modifiers
|
||||||
|
*/
|
||||||
|
public class Request{
|
||||||
|
|
||||||
|
private final StringBuilder sql; // buffer the sql to be built
|
||||||
|
private final HashMap<String, List<Object>> where = new HashMap<>(); // buffer condition statements for select
|
||||||
|
private final HashMap<String,Object> values = new HashMap<>(); // buffer values for insert/update statements
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start to create a new request with the initial SQL
|
||||||
|
* @param sql initial sql for the request
|
||||||
|
*/
|
||||||
public Request(StringBuilder sql) {
|
public Request(StringBuilder sql) {
|
||||||
this.sql = sql;
|
this.sql = sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultSet exec() throws SQLException {
|
/**
|
||||||
LOG.debug("Executing {}",this);
|
* conditions are assembled in the following form:
|
||||||
var args = new ArrayList<>();
|
* SELECT … FROM … WHERE <key> in (<values>)
|
||||||
|
* <values> are build as list of question marks, whose arguments are applied later
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
private void applyConditions(ArrayList<Object> args){
|
||||||
if (!where.isEmpty()){
|
if (!where.isEmpty()){
|
||||||
var clauses = new ArrayList<String>();
|
var clauses = new ArrayList<String>();
|
||||||
sql.append(" WHERE ");
|
sql.append(" WHERE ");
|
||||||
|
|
||||||
for (var entry : where.entrySet()){
|
for (var entry : where.entrySet()){
|
||||||
var arr = new String[entry.getValue().size()];
|
{ // build the list of question marks
|
||||||
Arrays.fill(arr,"?");
|
var arr = new String[entry.getValue().size()];
|
||||||
var marks = String.join(", ",arr);
|
Arrays.fill(arr, "?");
|
||||||
clauses.add("("+entry.getKey()+" IN ("+marks+"))");
|
var marks = String.join(", ", arr);
|
||||||
args.addAll(entry.getValue());
|
clauses.add("(" + entry.getKey() + " IN (" + marks + "))");
|
||||||
|
}
|
||||||
|
args.addAll(entry.getValue()); // will be applied to the prepared statement later
|
||||||
}
|
}
|
||||||
sql.append(String.join(" AND ",clauses));
|
sql.append(String.join(" AND ",clauses));
|
||||||
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
var stmt = Database.this.conn.prepareStatement(sql());
|
|
||||||
if (!args.isEmpty()) {
|
|
||||||
for (int i = 0; i < args.size(); i++) stmt.setObject(i+1, args.get(i));
|
|
||||||
}
|
|
||||||
return stmt.executeQuery();
|
|
||||||
} catch (SQLException sqle) {
|
|
||||||
throw new SQLException(t("Query '{}' failed:",sql),sqle);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() throws SQLException {
|
@Override
|
||||||
LOG.debug("Running {}",this);
|
protected Request clone() {
|
||||||
|
Request clone = new Request(sql);
|
||||||
|
clone.where.putAll(where);
|
||||||
|
clone.values.putAll(values);
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompiledRequest compile(){
|
||||||
var args = new ArrayList<>();
|
var args = new ArrayList<>();
|
||||||
|
applyValues(args);
|
||||||
|
applyConditions(args);
|
||||||
|
return new CompiledRequest(sql.toString(),args);
|
||||||
|
}
|
||||||
|
|
||||||
if (!setValues.isEmpty()){
|
private void applyValues(ArrayList<Object> args){
|
||||||
var keys = new ArrayList<String>();
|
if (values.isEmpty()) return;
|
||||||
var expressions = new ArrayList<String>();
|
var currentSql = sql();
|
||||||
for (var entry : setValues.entrySet()) {
|
if (currentSql.startsWith("INSERT")){
|
||||||
expressions.add(entry.getKey()+" = ?");
|
|
||||||
args.add(entry.getValue());
|
|
||||||
}
|
|
||||||
sql.append(" SET ").append(String.join(", ",expressions));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!values.isEmpty()){
|
|
||||||
var keys = new ArrayList<String>();
|
var keys = new ArrayList<String>();
|
||||||
for (var entry : values.entrySet()) {
|
for (var entry : values.entrySet()) {
|
||||||
keys.add(entry.getKey());
|
keys.add(entry.getKey());
|
||||||
@@ -92,34 +150,18 @@ public class Database {
|
|||||||
var marks = String.join(", ",arr);
|
var marks = String.join(", ",arr);
|
||||||
sql.append("(").append(marks).append(")");
|
sql.append("(").append(marks).append(")");
|
||||||
}
|
}
|
||||||
|
if (currentSql.startsWith("UPDATE")){
|
||||||
if (!where.isEmpty()){
|
var expressions = new ArrayList<String>();
|
||||||
var clauses = new ArrayList<String>();
|
for (var entry : values.entrySet()) {
|
||||||
sql.append(" WHERE ");
|
expressions.add(entry.getKey()+" = ?");
|
||||||
|
args.add(entry.getValue());
|
||||||
for (var entry : where.entrySet()){
|
|
||||||
var arr = new String[entry.getValue().size()];
|
|
||||||
Arrays.fill(arr,"?");
|
|
||||||
var marks = String.join(", ",arr);
|
|
||||||
clauses.add("("+entry.getKey()+" IN ("+marks+"))");
|
|
||||||
args.addAll(entry.getValue());
|
|
||||||
}
|
}
|
||||||
sql.append(String.join(" AND ",clauses));
|
sql.append(" SET ").append(String.join(", ",expressions));
|
||||||
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
var stmt = conn.prepareStatement(sql());
|
|
||||||
if (!args.isEmpty()) {
|
|
||||||
for (int i = 0; i < args.size(); i++) stmt.setObject(i+1, args.get(i));
|
|
||||||
}
|
|
||||||
stmt.execute();
|
|
||||||
} catch (SQLException sqle) {
|
|
||||||
throw new SQLException(t("Query '{}' failed:",sql),sqle);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request set(String key, Object value) {
|
public Request set(String key, Object value) {
|
||||||
setValues.put(key,value);
|
values.put(key,value);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,40 +171,7 @@ public class Database {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuffer sql = new StringBuffer(this.sql);
|
return "Request("+clone().compile()+')';
|
||||||
|
|
||||||
if (!setValues.isEmpty()){
|
|
||||||
var keys = new ArrayList<String>();
|
|
||||||
var expressions = new ArrayList<String>();
|
|
||||||
for (var entry : setValues.entrySet()) expressions.add(entry.getKey()+" = "+entry.getValue());
|
|
||||||
sql.append(" SET ").append(String.join(", ",expressions));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!values.isEmpty()){
|
|
||||||
var keys = new ArrayList<String>();
|
|
||||||
var vals = new ArrayList<String>();
|
|
||||||
for (var entry : values.entrySet()) {
|
|
||||||
keys.add(entry.getKey());
|
|
||||||
vals.add(entry.getValue().toString());
|
|
||||||
}
|
|
||||||
sql.append("(")
|
|
||||||
.append(String.join(", ",keys))
|
|
||||||
.append(")")
|
|
||||||
.append(" VALUES ")
|
|
||||||
.append("(")
|
|
||||||
.append(String.join(",",vals))
|
|
||||||
.append(")");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!where.isEmpty()){
|
|
||||||
var clauses = new ArrayList<String>();
|
|
||||||
sql.append(" WHERE ");
|
|
||||||
|
|
||||||
for (var entry : where.entrySet()) clauses.add("("+entry.getKey()+" IN ("+String.join(", ",entry.getValue().stream().map(Object::toString).toList())+"))");
|
|
||||||
sql.append(String.join(" AND ",clauses));
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Request{" + "sql=" + sql + '}';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request values(Map<String,Object> newValues) {
|
public Request values(Map<String,Object> newValues) {
|
||||||
@@ -170,11 +179,6 @@ public class Database {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request values(String key, Object value) {
|
|
||||||
values.put(key,value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Request where(String key, Object ... values) {
|
public Request where(String key, Object ... values) {
|
||||||
for (var val : values) where(key,val);
|
for (var val : values) where(key,val);
|
||||||
return this;
|
return this;
|
||||||
@@ -254,7 +258,7 @@ public class Database {
|
|||||||
var sql = new StringBuilder("SELECT EXISTS (SELECT name FROM sqlite_schema WHERE type='table' AND name='")
|
var sql = new StringBuilder("SELECT EXISTS (SELECT name FROM sqlite_schema WHERE type='table' AND name='")
|
||||||
.append(tbName)
|
.append(tbName)
|
||||||
.append("')");
|
.append("')");
|
||||||
ResultSet rs = query( sql).exec();
|
ResultSet rs = query(sql).compile().exec();
|
||||||
int val = 0;
|
int val = 0;
|
||||||
if (rs.next()) val = rs.getInt(1);
|
if (rs.next()) val = rs.getInt(1);
|
||||||
rs.close();
|
rs.close();
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class ListMember {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static User confirm(String token) throws SQLException {
|
public static User confirm(String token) throws SQLException {
|
||||||
var rs = Database.open().select(TABLE_NAME).where(TOKEN,token).exec();
|
var rs = Database.open().select(TABLE_NAME).where(TOKEN,token).compile().exec();
|
||||||
if (rs.next()){
|
if (rs.next()){
|
||||||
var lm = new ListMember(rs.getString(LIST_EMAIL),rs.getString(USER_EMAIL),rs.getInt(STATE),rs.getString(TOKEN));
|
var lm = new ListMember(rs.getString(LIST_EMAIL),rs.getString(USER_EMAIL),rs.getInt(STATE),rs.getString(TOKEN));
|
||||||
rs.close();
|
rs.close();
|
||||||
@@ -45,6 +45,7 @@ public class ListMember {
|
|||||||
.set(STATE, newState) //drop confirmation state, set subscriber state
|
.set(STATE, newState) //drop confirmation state, set subscriber state
|
||||||
.where(LIST_EMAIL,lm.listEmail)
|
.where(LIST_EMAIL,lm.listEmail)
|
||||||
.where(USER_EMAIL,lm.userEmail)
|
.where(USER_EMAIL,lm.userEmail)
|
||||||
|
.compile()
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
return user;
|
return user;
|
||||||
@@ -70,7 +71,7 @@ public class ListMember {
|
|||||||
.append(STATE).append(" ").append(INT).append(", ")
|
.append(STATE).append(" ").append(INT).append(", ")
|
||||||
.append(TOKEN).append(" ").append(VARCHAR).append(", ")
|
.append(TOKEN).append(" ").append(VARCHAR).append(", ")
|
||||||
.append("PRIMARY KEY (").append(LIST_EMAIL).append(", ").append(USER_EMAIL).append("));");
|
.append("PRIMARY KEY (").append(LIST_EMAIL).append(", ").append(USER_EMAIL).append("));");
|
||||||
Database.open().query(sql).run();
|
Database.open().query(sql).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasState(int testState) {
|
public boolean hasState(int testState) {
|
||||||
@@ -83,7 +84,7 @@ public class ListMember {
|
|||||||
try {
|
try {
|
||||||
var request = Database.open().select(TABLE_NAME, LIST_EMAIL, STATE+" & "+STATE_OWNER+" as "+STATE);
|
var request = Database.open().select(TABLE_NAME, LIST_EMAIL, STATE+" & "+STATE_OWNER+" as "+STATE);
|
||||||
if (!user.hashPermission(User.PERMISSION_ADMIN)) request = request.where(USER_EMAIL, user.email()).where(STATE, STATE_OWNER);
|
if (!user.hashPermission(User.PERMISSION_ADMIN)) request = request.where(USER_EMAIL, user.email()).where(STATE, STATE_OWNER);
|
||||||
var rs = request.exec();
|
var rs = request.compile().exec();
|
||||||
while (rs.next()) list.add(rs.getString(LIST_EMAIL));
|
while (rs.next()) list.add(rs.getString(LIST_EMAIL));
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
LOG.warn("Listing memberships lists failed: ",e);
|
LOG.warn("Listing memberships lists failed: ",e);
|
||||||
@@ -97,6 +98,7 @@ public class ListMember {
|
|||||||
.select(TABLE_NAME)
|
.select(TABLE_NAME)
|
||||||
.where(LIST_EMAIL,list.email())
|
.where(LIST_EMAIL,list.email())
|
||||||
.where(USER_EMAIL,user.email())
|
.where(USER_EMAIL,user.email())
|
||||||
|
.compile()
|
||||||
.exec();
|
.exec();
|
||||||
try {
|
try {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
@@ -115,6 +117,7 @@ public class ListMember {
|
|||||||
var rs = Database.open()
|
var rs = Database.open()
|
||||||
.select(TABLE_NAME)
|
.select(TABLE_NAME)
|
||||||
.where(LIST_EMAIL,listEmail)
|
.where(LIST_EMAIL,listEmail)
|
||||||
|
.compile()
|
||||||
.exec();
|
.exec();
|
||||||
var temp = new HashMap<String,Integer>();
|
var temp = new HashMap<String,Integer>();
|
||||||
while (rs.next()) temp.put(rs.getString(USER_EMAIL),rs.getInt(STATE));
|
while (rs.next()) temp.put(rs.getString(USER_EMAIL),rs.getInt(STATE));
|
||||||
@@ -139,7 +142,7 @@ public class ListMember {
|
|||||||
vals.put(USER_EMAIL,userEmail);
|
vals.put(USER_EMAIL,userEmail);
|
||||||
vals.put(STATE,state);
|
vals.put(STATE,state);
|
||||||
if (token != null) vals.put(TOKEN,token);
|
if (token != null) vals.put(TOKEN,token);
|
||||||
Database.open().insertInto(TABLE_NAME).values(vals).run();
|
Database.open().insertInto(TABLE_NAME).values(vals).compile().run();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,6 +155,7 @@ public class ListMember {
|
|||||||
var rs = db.select(TABLE_NAME)
|
var rs = db.select(TABLE_NAME)
|
||||||
.where(LIST_EMAIL,list.email())
|
.where(LIST_EMAIL,list.email())
|
||||||
.where(USER_EMAIL,user.email())
|
.where(USER_EMAIL,user.email())
|
||||||
|
.compile()
|
||||||
.exec();
|
.exec();
|
||||||
while (rs.next()){
|
while (rs.next()){
|
||||||
int state = Util.unset(rs.getInt(STATE),STATE_SUBSCRIBER,STATE_AWAITING_CONFIRMATION);
|
int state = Util.unset(rs.getInt(STATE),STATE_SUBSCRIBER,STATE_AWAITING_CONFIRMATION);
|
||||||
@@ -159,12 +163,14 @@ public class ListMember {
|
|||||||
db.deleteFrom(TABLE_NAME)
|
db.deleteFrom(TABLE_NAME)
|
||||||
.where(LIST_EMAIL,list.email())
|
.where(LIST_EMAIL,list.email())
|
||||||
.where(USER_EMAIL,user.email())
|
.where(USER_EMAIL,user.email())
|
||||||
|
.compile()
|
||||||
.run();
|
.run();
|
||||||
} else { // update entry: whitdraw subscription
|
} else { // update entry: whitdraw subscription
|
||||||
db.update(TABLE_NAME)
|
db.update(TABLE_NAME)
|
||||||
.set(STATE,state)
|
.set(STATE,state)
|
||||||
.where(LIST_EMAIL,list.email())
|
.where(LIST_EMAIL,list.email())
|
||||||
.where(USER_EMAIL,user.email())
|
.where(USER_EMAIL,user.email())
|
||||||
|
.compile()
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class MailingList {
|
|||||||
.append(SMTP_PASS).append(" ").append(VARCHAR).append(", ")
|
.append(SMTP_PASS).append(" ").append(VARCHAR).append(", ")
|
||||||
.append(STATE).append(" ").append(INT)
|
.append(STATE).append(" ").append(INT)
|
||||||
.append(");");
|
.append(");");
|
||||||
Database.open().query(sql).run();
|
Database.open().query(sql).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String email() {
|
public String email() {
|
||||||
@@ -79,12 +79,12 @@ public class MailingList {
|
|||||||
|
|
||||||
public void enable(boolean enable) throws SQLException {
|
public void enable(boolean enable) throws SQLException {
|
||||||
state = enable ? state | STATE_ENABLED : state ^ (state & STATE_ENABLED);
|
state = enable ? state | STATE_ENABLED : state ^ (state & STATE_ENABLED);
|
||||||
Database.open().update(TABLE_NAME).set(STATE,state).where(EMAIL, email()).run();
|
Database.open().update(TABLE_NAME).set(STATE,state).where(EMAIL, email()).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hide(boolean hide) throws SQLException {
|
public void hide(boolean hide) throws SQLException {
|
||||||
state = hide ? state ^ (state & STATE_PUBLIC) : state | STATE_PUBLIC;
|
state = hide ? state ^ (state & STATE_PUBLIC) : state | STATE_PUBLIC;
|
||||||
Database.open().update(TABLE_NAME).set(STATE,state).where(EMAIL, email()).run();
|
Database.open().update(TABLE_NAME).set(STATE,state).where(EMAIL, email()).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOpenFor(User user) {
|
public boolean isOpenFor(User user) {
|
||||||
@@ -129,7 +129,7 @@ public class MailingList {
|
|||||||
var rs = Database.open()
|
var rs = Database.open()
|
||||||
.select(TABLE_NAME)
|
.select(TABLE_NAME)
|
||||||
.where(EMAIL,listEmail)
|
.where(EMAIL,listEmail)
|
||||||
.exec();
|
.compile().exec();
|
||||||
if (rs.next()) lists.put(listEmail,ml = MailingList.from(rs));
|
if (rs.next()) lists.put(listEmail,ml = MailingList.from(rs));
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
LOG.debug("Failed to load MailingList: ",e);
|
LOG.debug("Failed to load MailingList: ",e);
|
||||||
@@ -156,7 +156,7 @@ public class MailingList {
|
|||||||
var rs = Database.open()
|
var rs = Database.open()
|
||||||
.select(TABLE_NAME,EMAIL, "(" + STATE + " & " + STATE_PUBLIC + ") as test")
|
.select(TABLE_NAME,EMAIL, "(" + STATE + " & " + STATE_PUBLIC + ") as test")
|
||||||
.where("test", STATE_PUBLIC)
|
.where("test", STATE_PUBLIC)
|
||||||
.exec();
|
.compile().exec();
|
||||||
var emails = new ArrayList<String>();
|
var emails = new ArrayList<String>();
|
||||||
while (rs.next()) emails.add(rs.getString(EMAIL));
|
while (rs.next()) emails.add(rs.getString(EMAIL));
|
||||||
rs.close();
|
rs.close();
|
||||||
@@ -182,7 +182,8 @@ public class MailingList {
|
|||||||
|
|
||||||
|
|
||||||
private MailingList save() throws SQLException {
|
private MailingList save() throws SQLException {
|
||||||
Database.open().insertInto(TABLE_NAME)
|
Database.open()
|
||||||
|
.insertInto(TABLE_NAME)
|
||||||
.values(Map.ofEntries(
|
.values(Map.ofEntries(
|
||||||
Map.entry(EMAIL, email),
|
Map.entry(EMAIL, email),
|
||||||
Map.entry(NAME, name),
|
Map.entry(NAME, name),
|
||||||
@@ -195,6 +196,7 @@ public class MailingList {
|
|||||||
Map.entry(SMTP_USER, smtp.username()),
|
Map.entry(SMTP_USER, smtp.username()),
|
||||||
Map.entry(SMTP_PASS, smtp.password()),
|
Map.entry(SMTP_PASS, smtp.password()),
|
||||||
Map.entry(STATE, state)))
|
Map.entry(STATE, state)))
|
||||||
|
.compile()
|
||||||
.run();
|
.run();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -222,14 +224,14 @@ public class MailingList {
|
|||||||
try {
|
try {
|
||||||
if (user == null) return openLists();
|
if (user == null) return openLists();
|
||||||
if (user.hashPermission(PERMISSION_ADMIN)) {
|
if (user.hashPermission(PERMISSION_ADMIN)) {
|
||||||
var rs = Database.open().select(TABLE_NAME).exec();
|
var rs = Database.open().select(TABLE_NAME).compile().exec();
|
||||||
var result = new HashSet<MailingList>();
|
var result = new HashSet<MailingList>();
|
||||||
while (rs.next()) result.add(MailingList.from(rs));
|
while (rs.next()) result.add(MailingList.from(rs));
|
||||||
rs.close();
|
rs.close();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
var listEmails = ListMember.listsOwnedBy(user);
|
var listEmails = ListMember.listsOwnedBy(user);
|
||||||
var rs = Database.open().select(TABLE_NAME).where(EMAIL, listEmails).exec();
|
var rs = Database.open().select(TABLE_NAME).where(EMAIL, listEmails).compile().exec();
|
||||||
var result = openLists();
|
var result = openLists();
|
||||||
while (rs.next()) result.add(MailingList.from(rs));
|
while (rs.next()) result.add(MailingList.from(rs));
|
||||||
rs.close();
|
rs.close();
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ public class User {
|
|||||||
private static final HashMap<String,User> users = new HashMap<>();
|
private static final HashMap<String,User> users = new HashMap<>();
|
||||||
public static final int PERMISSION_ADMIN = 1;
|
public static final int PERMISSION_ADMIN = 1;
|
||||||
public static final int PERMISSION_CREATE_LISTS = 2;
|
public static final int PERMISSION_CREATE_LISTS = 2;
|
||||||
|
public static final String SALT = "salt";
|
||||||
|
public static final String HASHED_PASS = "hashedPassword";
|
||||||
|
|
||||||
private String email, salt, hashedPass, name;
|
private String email, salt, hashedPass, name;
|
||||||
private int permissions;
|
private int permissions;
|
||||||
@@ -56,7 +58,12 @@ public class User {
|
|||||||
|
|
||||||
public void addPermission(int newPermission) throws SQLException {
|
public void addPermission(int newPermission) throws SQLException {
|
||||||
permissions |= newPermission;
|
permissions |= newPermission;
|
||||||
Database.open().update(TABLE_NAME).set(PERMISSIONS,permissions).where(EMAIL,email()).run();
|
Database.open()
|
||||||
|
.update(TABLE_NAME)
|
||||||
|
.set(PERMISSIONS,permissions)
|
||||||
|
.where(EMAIL,email())
|
||||||
|
.compile()
|
||||||
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -81,12 +88,12 @@ public class User {
|
|||||||
.append(HASHED_PASS).append(" ").append(VARCHAR)
|
.append(HASHED_PASS).append(" ").append(VARCHAR)
|
||||||
|
|
||||||
.append(");");
|
.append(");");
|
||||||
Database.open().query(sql).run();
|
Database.open().query(sql).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dropPermission(int newPermission) throws SQLException {
|
public void dropPermission(int newPermission) throws SQLException {
|
||||||
permissions ^= (permissions & newPermission);
|
permissions ^= (permissions & newPermission);
|
||||||
Database.open().update(TABLE_NAME).set(PERMISSIONS,permissions).run();
|
Database.open().update(TABLE_NAME).set(PERMISSIONS,permissions).compile().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hashPermission(int permission){
|
public boolean hashPermission(int permission){
|
||||||
@@ -102,7 +109,7 @@ public class User {
|
|||||||
var userList = new ArrayList<User>();
|
var userList = new ArrayList<User>();
|
||||||
var query = Database.open().select(TABLE_NAME);
|
var query = Database.open().select(TABLE_NAME);
|
||||||
if (emails != null && !emails.isEmpty()) query.where(EMAIL,emails);
|
if (emails != null && !emails.isEmpty()) query.where(EMAIL,emails);
|
||||||
var rs = query.exec();
|
var rs = query.compile().exec();
|
||||||
while (rs.next()) userList.add(User.from(rs));
|
while (rs.next()) userList.add(User.from(rs));
|
||||||
return userList;
|
return userList;
|
||||||
}
|
}
|
||||||
@@ -124,6 +131,7 @@ public class User {
|
|||||||
ResultSet rs = Database.open()
|
ResultSet rs = Database.open()
|
||||||
.select(TABLE_NAME)
|
.select(TABLE_NAME)
|
||||||
.where(EMAIL,email)
|
.where(EMAIL,email)
|
||||||
|
.compile()
|
||||||
.exec();
|
.exec();
|
||||||
try {
|
try {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
@@ -145,7 +153,7 @@ public class User {
|
|||||||
|
|
||||||
|
|
||||||
public static boolean noUsers() throws SQLException {
|
public static boolean noUsers() throws SQLException {
|
||||||
var rs = Database.open().select(TABLE_NAME,"count(*)").exec();
|
var rs = Database.open().select(TABLE_NAME,"count(*)").compile().exec();
|
||||||
try {
|
try {
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
return rs.getInt(1) < 1;
|
return rs.getInt(1) < 1;
|
||||||
@@ -175,6 +183,7 @@ public class User {
|
|||||||
if (hashedPass != null) values.put(HASHED_PASS,hashedPass);
|
if (hashedPass != null) values.put(HASHED_PASS,hashedPass);
|
||||||
Database.open().insertInto(TABLE_NAME)
|
Database.open().insertInto(TABLE_NAME)
|
||||||
.values(values)
|
.values(values)
|
||||||
|
.compile()
|
||||||
.run();
|
.run();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user