Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 009831f5db | |||
| 1bcdb1df8c | |||
| 7ae948bb79 | |||
| 29402fc27e | |||
| eca28292d5 | |||
| aef4cdabc3 | |||
| 04114aa0cf | |||
| 575102fbfa |
9
pom.xml
9
pom.xml
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>kangaroo-and-rabbit</groupId>
|
||||
<artifactId>archidata</artifactId>
|
||||
<version>0.6.1</version>
|
||||
<version>0.6.2</version>
|
||||
<properties>
|
||||
<maven.compiler.version>3.1</maven.compiler.version>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
@@ -107,7 +107,12 @@
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.16.0</version>
|
||||
<version>2.16.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||
<artifactId>jackson-dataformat-csv</artifactId>
|
||||
<version>2.16.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
|
||||
@@ -5,6 +5,9 @@ import java.sql.PreparedStatement;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.QueryOption;
|
||||
import org.kar.archidata.dataAccess.QueryOptions;
|
||||
import org.kar.archidata.dataAccess.options.DBInterfaceOption;
|
||||
import org.kar.archidata.db.DBEntry;
|
||||
import org.kar.archidata.model.User;
|
||||
|
||||
@@ -12,21 +15,22 @@ public class UserDB {
|
||||
|
||||
public UserDB() {}
|
||||
|
||||
public static User getUsers(final long userId) throws Exception {
|
||||
return DataAccess.get(User.class, userId);
|
||||
public static User getUsers(final long userId, QueryOption... option) throws Exception {
|
||||
return DataAccess.get(User.class, userId, option);
|
||||
}
|
||||
|
||||
public static User getUserOrCreate(final long userId, final String userLogin) throws Exception {
|
||||
public static User getUserOrCreate(final long userId, final String userLogin, QueryOption... option) throws Exception {
|
||||
final User user = getUsers(userId);
|
||||
if (user != null) {
|
||||
return user;
|
||||
}
|
||||
createUsersInfoFromOAuth(userId, userLogin);
|
||||
createUsersInfoFromOAuth(userId, userLogin, option);
|
||||
return getUsers(userId);
|
||||
}
|
||||
|
||||
private static void createUsersInfoFromOAuth(final long userId, final String login) throws IOException {
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
private static void createUsersInfoFromOAuth(final long userId, final String login, QueryOption... option) throws IOException {
|
||||
QueryOptions options = new QueryOptions(option);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final String query = "INSERT INTO `user` (`id`, `login`, `lastConnection`, `admin`, `blocked`, `removed`) VALUE (?,?,now(3),'0','0','0')";
|
||||
try {
|
||||
final PreparedStatement ps = entry.connection.prepareStatement(query);
|
||||
|
||||
@@ -364,4 +364,17 @@ public class AnnotationTools {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Field getFieldNamed(final Class<?> clazz, final String name) throws Exception {
|
||||
for (final Field field : clazz.getFields()) {
|
||||
// static field is only for internal global declaration ==> remove it ..
|
||||
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
|
||||
continue;
|
||||
}
|
||||
if (AnnotationTools.getFieldName(field).equals(name)) {
|
||||
return field;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.sql.Timestamp;
|
||||
@@ -15,7 +16,6 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.kar.archidata.GlobalConfiguration;
|
||||
import org.kar.archidata.annotation.AnnotationTools;
|
||||
import org.kar.archidata.annotation.CreationTimestamp;
|
||||
import org.kar.archidata.annotation.DataDefault;
|
||||
@@ -26,6 +26,8 @@ import org.kar.archidata.dataAccess.addOn.AddOnManyToOne;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnSQLTableExternalForeinKeyAsList;
|
||||
import org.kar.archidata.dataAccess.options.CheckFunction;
|
||||
import org.kar.archidata.dataAccess.options.Condition;
|
||||
import org.kar.archidata.dataAccess.options.DBInterfaceOption;
|
||||
import org.kar.archidata.dataAccess.options.DBInterfaceRoot;
|
||||
import org.kar.archidata.dataAccess.options.FilterValue;
|
||||
import org.kar.archidata.dataAccess.options.TransmitKey;
|
||||
import org.kar.archidata.db.DBEntry;
|
||||
@@ -41,12 +43,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import jakarta.ws.rs.InternalServerErrorException;
|
||||
|
||||
/* TODO list:
|
||||
- useful code to manage external query: List<T> query<T>(class<T> clazz, String query, List<Object> parameters);
|
||||
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
|
||||
ResultSetMetaData rsmd = rs.getMetaData();
|
||||
String name = rsmd.getColumnName(1);
|
||||
- Manage to group of SQL action to permit to commit only at the end.
|
||||
|
||||
*/
|
||||
|
||||
/** Data access is an abstraction class that permit to access on the DB with a function wrapping that permit to minimize the SQL writing of SQL code. This interface support the SQL and SQLite
|
||||
@@ -73,7 +70,8 @@ public class DataAccess {
|
||||
|
||||
}
|
||||
|
||||
public static boolean isDBExist(final String name) throws InternalServerErrorException {
|
||||
public static boolean isDBExist(final String name, final QueryOption... option) throws InternalServerErrorException {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
if ("sqlite".equals(ConfigBaseVariable.getDBType())) {
|
||||
// no base manage in sqLite ...
|
||||
// TODO: check if the file exist or not ...
|
||||
@@ -81,7 +79,7 @@ public class DataAccess {
|
||||
}
|
||||
DBEntry entry;
|
||||
try {
|
||||
entry = DBEntry.createInterface(GlobalConfiguration.dbConfig, true);
|
||||
entry = DBInterfaceOption.getAutoEntry(options);
|
||||
} catch (final IOException ex) {
|
||||
ex.printStackTrace();
|
||||
LOGGER.error("Can not check if the DB exist!!! {}", ex.getMessage());
|
||||
@@ -124,7 +122,7 @@ public class DataAccess {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
return 1 == DataAccess.executeSimpleQuerry("CREATE DATABASE `" + name + "`;", true);
|
||||
return 1 == DataAccess.executeSimpleQuerry("CREATE DATABASE `" + name + "`;", new DBInterfaceRoot(true));
|
||||
} catch (final SQLException | IOException ex) {
|
||||
ex.printStackTrace();
|
||||
LOGGER.error("Can not check if the DB exist!!! {}", ex.getMessage());
|
||||
@@ -132,7 +130,8 @@ public class DataAccess {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isTableExist(final String name) throws InternalServerErrorException {
|
||||
public static boolean isTableExist(final String name, final QueryOption... option) throws InternalServerErrorException {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
try {
|
||||
String request = "";
|
||||
if ("sqlite".equals(ConfigBaseVariable.getDBType())) {
|
||||
@@ -143,14 +142,14 @@ public class DataAccess {
|
||||
AND name = ?;
|
||||
""";
|
||||
// PreparedStatement ps = entry.connection.prepareStatement("show tables");
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final PreparedStatement ps = entry.connection.prepareStatement(request);
|
||||
ps.setString(1, name);
|
||||
final ResultSet ret = ps.executeQuery();
|
||||
final int count = ret.getInt("total");
|
||||
return count == 1;
|
||||
} else {
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
// TODO : Maybe connect with a temporary not specified connection interface to a db ...
|
||||
final PreparedStatement ps = entry.connection.prepareStatement("show tables");
|
||||
final ResultSet rs = ps.executeQuery();
|
||||
@@ -447,6 +446,196 @@ public class DataAccess {
|
||||
count.inc();
|
||||
}
|
||||
|
||||
// TODO: this function will replace the previous one !!!
|
||||
protected static RetreiveFromDB createSetValueFromDbCallback(final int count, final Field field) throws Exception {
|
||||
Class<?> type = field.getType();
|
||||
if (type == Long.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Long tmp = rs.getLong(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == long.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Long tmp = rs.getLong(count);
|
||||
if (rs.wasNull()) {
|
||||
// field.set(data, null);
|
||||
} else {
|
||||
field.setLong(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Integer.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Integer tmp = rs.getInt(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == int.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Integer tmp = rs.getInt(count);
|
||||
if (rs.wasNull()) {
|
||||
// field.set(obj, null);
|
||||
} else {
|
||||
field.setInt(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Float.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Float tmp = rs.getFloat(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == float.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Float tmp = rs.getFloat(count);
|
||||
if (rs.wasNull()) {
|
||||
// field.set(obj, null);
|
||||
} else {
|
||||
field.setFloat(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Double.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Double tmp = rs.getDouble(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == double.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Double tmp = rs.getDouble(count);
|
||||
if (rs.wasNull()) {
|
||||
// field.set(obj, null);
|
||||
} else {
|
||||
field.setDouble(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Boolean.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Boolean tmp = rs.getBoolean(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == boolean.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Boolean tmp = rs.getBoolean(count);
|
||||
if (rs.wasNull()) {
|
||||
// field.set(obj, null);
|
||||
} else {
|
||||
field.setBoolean(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Timestamp.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final Timestamp tmp = rs.getTimestamp(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == Date.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
try {
|
||||
final Timestamp tmp = rs.getTimestamp(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, Date.from(tmp.toInstant()));
|
||||
}
|
||||
} catch (final SQLException ex) {
|
||||
final String tmp = rs.getString(count);
|
||||
LOGGER.error("Fail to parse the SQL time !!! {}", tmp);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
final Date date = DateTools.parseDate(tmp);
|
||||
LOGGER.error("Fail to parse the SQL time !!! {}", date);
|
||||
field.set(obj, date);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == LocalDate.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final java.sql.Date tmp = rs.getDate(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp.toLocalDate());
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == LocalTime.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final java.sql.Time tmp = rs.getTime(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp.toLocalTime());
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type == String.class) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final String tmp = rs.getString(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
field.set(obj, tmp);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (type.isEnum()) {
|
||||
return (final ResultSet rs, Object obj) -> {
|
||||
final String tmp = rs.getString(count);
|
||||
if (rs.wasNull()) {
|
||||
field.set(obj, null);
|
||||
} else {
|
||||
boolean find = false;
|
||||
final Object[] arr = type.getEnumConstants();
|
||||
for (final Object elem : arr) {
|
||||
if (elem.toString().equals(tmp)) {
|
||||
field.set(obj, elem);
|
||||
find = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!find) {
|
||||
throw new DataAccessException("Enum value does not exist in the Model: '" + tmp + "'");
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
throw new DataAccessException("Unknown Field Type");
|
||||
|
||||
}
|
||||
|
||||
public static boolean isAddOnField(final Field field) {
|
||||
return findAddOnforField(field) != null;
|
||||
}
|
||||
@@ -480,7 +669,7 @@ public class DataAccess {
|
||||
check.getChecker().check("", data, AnnotationTools.getFieldsNames(clazz));
|
||||
}
|
||||
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final List<Field> asyncFieldUpdate = new ArrayList<>();
|
||||
Long uniqueSQLID = null;
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
@@ -622,7 +811,6 @@ public class DataAccess {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
final List<LazyGetter> asyncActions = new ArrayList<>();
|
||||
for (final Field field : asyncFieldUpdate) {
|
||||
@@ -734,9 +922,9 @@ public class DataAccess {
|
||||
}
|
||||
}
|
||||
final List<LazyGetter> asyncActions = new ArrayList<>();
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
// real add in the BDD:
|
||||
try {
|
||||
try (entry) {
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
// boolean createIfNotExist = clazz.getDeclaredAnnotationsByType(SQLIfNotExists.class).length != 0;
|
||||
final StringBuilder query = new StringBuilder();
|
||||
@@ -830,9 +1018,6 @@ public class DataAccess {
|
||||
}
|
||||
} catch (final SQLException ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
for (final LazyGetter action : asyncActions) {
|
||||
action.doRequest();
|
||||
@@ -885,26 +1070,20 @@ public class DataAccess {
|
||||
}
|
||||
}
|
||||
|
||||
public static int executeSimpleQuerry(final String query, final boolean root) throws SQLException, IOException {
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig, root);
|
||||
public static int executeSimpleQuerry(final String query, final QueryOption... option) throws SQLException, IOException {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final Statement stmt = entry.connection.createStatement();
|
||||
return stmt.executeUpdate(query);
|
||||
}
|
||||
|
||||
public static int executeSimpleQuerry(final String query) throws SQLException, IOException {
|
||||
return executeSimpleQuerry(query, false);
|
||||
}
|
||||
|
||||
public static boolean executeQuerry(final String query, final boolean root) throws SQLException, IOException {
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig, root);
|
||||
public static boolean executeQuerry(final String query, final QueryOption... option) throws SQLException, IOException {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final Statement stmt = entry.connection.createStatement();
|
||||
return stmt.execute(query);
|
||||
}
|
||||
|
||||
public static boolean executeQuerry(final String query) throws SQLException, IOException {
|
||||
return executeQuerry(query, false);
|
||||
}
|
||||
|
||||
public static <T> T getWhere(final Class<T> clazz, final QueryOption... option) throws Exception {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
options.add(new Limit(1));
|
||||
@@ -915,8 +1094,6 @@ public class DataAccess {
|
||||
return values.get(0);
|
||||
}
|
||||
|
||||
/* public static <T> List<T> getsWhere(final Class<T> clazz, final QueryItem condition) throws Exception { return getsWhere(clazz, condition, null); } */
|
||||
|
||||
public static void generateSelectField(final StringBuilder querySelect, final StringBuilder query, final Class<?> clazz, final QueryOptions options, final CountInOut count) throws Exception {
|
||||
final boolean readAllfields = QueryOptions.readAllColomn(options);
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
@@ -966,7 +1143,7 @@ public class DataAccess {
|
||||
}
|
||||
final List<LazyGetter> lazyCall = new ArrayList<>();
|
||||
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final List<T> outs = new ArrayList<>();
|
||||
// real add in the BDD:
|
||||
try {
|
||||
@@ -1019,7 +1196,6 @@ public class DataAccess {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
return outs;
|
||||
}
|
||||
@@ -1070,7 +1246,7 @@ public class DataAccess {
|
||||
condition = new Condition();
|
||||
}
|
||||
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
long count = 0;
|
||||
// real add in the BDD:
|
||||
try {
|
||||
@@ -1172,8 +1348,7 @@ public class DataAccess {
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
|
||||
// find the deleted field
|
||||
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final StringBuilder query = new StringBuilder();
|
||||
query.append("DELETE FROM `");
|
||||
query.append(tableName);
|
||||
@@ -1187,7 +1362,6 @@ public class DataAccess {
|
||||
return ps.executeUpdate();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1207,8 +1381,7 @@ public class DataAccess {
|
||||
final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
|
||||
/* String updateFieldName = null; if ("sqlite".equalsIgnoreCase(ConfigBaseVariable.getDBType())) { updateFieldName = AnnotationTools.getUpdatedFieldName(clazz); } */
|
||||
// find the deleted field
|
||||
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final StringBuilder query = new StringBuilder();
|
||||
query.append("UPDATE `");
|
||||
query.append(tableName);
|
||||
@@ -1226,7 +1399,6 @@ public class DataAccess {
|
||||
return ps.executeUpdate();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1251,7 +1423,7 @@ public class DataAccess {
|
||||
if (deletedFieldName == null) {
|
||||
throw new DataAccessException("The class " + clazz.getCanonicalName() + " has no deleted field");
|
||||
}
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final StringBuilder query = new StringBuilder();
|
||||
query.append("UPDATE `");
|
||||
query.append(tableName);
|
||||
@@ -1268,14 +1440,13 @@ public class DataAccess {
|
||||
return ps.executeUpdate();
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void drop(final Class<?> clazz, final QueryOption... option) throws Exception {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final StringBuilder query = new StringBuilder();
|
||||
query.append("DROP TABLE IF EXISTS `");
|
||||
query.append(tableName);
|
||||
@@ -1301,14 +1472,13 @@ public class DataAccess {
|
||||
}
|
||||
} finally {
|
||||
entry.close();
|
||||
entry = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void cleanAll(final Class<?> clazz, final QueryOption... option) throws Exception {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
final String tableName = AnnotationTools.getTableName(clazz, options);
|
||||
DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final StringBuilder query = new StringBuilder();
|
||||
query.append("DELETE FROM `");
|
||||
query.append(tableName);
|
||||
@@ -1338,4 +1508,78 @@ public class DataAccess {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
- useful code to manage external query: List<T> query<T>(class<T> clazz, );
|
||||
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
|
||||
*/
|
||||
public static <TYPE> List<TYPE> query(final Class<TYPE> clazz, String query, List<Object> parameters, final QueryOption... option) throws Exception {
|
||||
final QueryOptions options = new QueryOptions(option);
|
||||
final List<LazyGetter> lazyCall = new ArrayList<>();
|
||||
// TODO ... final String deletedFieldName = AnnotationTools.getDeletedFieldName(clazz);
|
||||
final DBEntry entry = DBInterfaceOption.getAutoEntry(options);
|
||||
final List<TYPE> outs = new ArrayList<>();
|
||||
// real add in the BDD:
|
||||
try {
|
||||
final CountInOut count = new CountInOut();
|
||||
LOGGER.warn("generate the query: '{}'", query.toString());
|
||||
// prepare the request:
|
||||
final PreparedStatement ps = entry.connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
|
||||
final CountInOut iii = new CountInOut(1);
|
||||
if (parameters != null) {
|
||||
for (Object elem : parameters) {
|
||||
DataAccess.addElement(ps, elem, iii);
|
||||
}
|
||||
iii.inc();
|
||||
}
|
||||
// execute the request
|
||||
final ResultSet rs = ps.executeQuery();
|
||||
ResultSetMetaData rsmd = rs.getMetaData();
|
||||
List<RetreiveFromDB> actionToRetreive = new ArrayList<>();
|
||||
for (int jjj = 0; jjj < rsmd.getColumnCount(); jjj++) {
|
||||
String name = rsmd.getColumnName(jjj + 1);
|
||||
// find field name ...
|
||||
Field field = AnnotationTools.getFieldNamed(clazz, name);
|
||||
if (field == null) {
|
||||
throw new DataAccessException("Querry with unknown field: '" + name + "'");
|
||||
}
|
||||
// create the callback...
|
||||
RetreiveFromDB element = createSetValueFromDbCallback(jjj + 1, field);
|
||||
actionToRetreive.add(element);
|
||||
}
|
||||
|
||||
while (rs.next()) {
|
||||
count.value = 1;
|
||||
final CountInOut countNotNull = new CountInOut(0);
|
||||
Object data = null;
|
||||
for (final Constructor<?> contructor : clazz.getConstructors()) {
|
||||
if (contructor.getParameterCount() == 0) {
|
||||
data = contructor.newInstance();
|
||||
}
|
||||
}
|
||||
if (data == null) {
|
||||
// TODO...
|
||||
} else {
|
||||
for (RetreiveFromDB action : actionToRetreive) {
|
||||
action.doRequest(rs, data);
|
||||
}
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
final TYPE out = (TYPE) data;
|
||||
outs.add(out);
|
||||
}
|
||||
LOGGER.info("Async calls: {}", lazyCall.size());
|
||||
for (final LazyGetter elem : lazyCall) {
|
||||
elem.doRequest();
|
||||
}
|
||||
} catch (final SQLException ex) {
|
||||
ex.printStackTrace();
|
||||
throw ex;
|
||||
} catch (final Exception ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
entry.close();
|
||||
}
|
||||
return outs;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -64,5 +64,4 @@ public class QueryOptions {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
7
src/org/kar/archidata/dataAccess/RetreiveFromDB.java
Normal file
7
src/org/kar/archidata/dataAccess/RetreiveFromDB.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package org.kar.archidata.dataAccess;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
|
||||
public interface RetreiveFromDB {
|
||||
void doRequest(final ResultSet rs, Object obj) throws Exception;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package org.kar.archidata.dataAccess.options;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.kar.archidata.GlobalConfiguration;
|
||||
import org.kar.archidata.dataAccess.QueryOption;
|
||||
import org.kar.archidata.dataAccess.QueryOptions;
|
||||
import org.kar.archidata.db.DBConfig;
|
||||
import org.kar.archidata.db.DBEntry;
|
||||
|
||||
public class DBInterfaceOption extends QueryOption {
|
||||
private DBEntry entry = null;
|
||||
private final DBConfig config;
|
||||
private final boolean root;
|
||||
|
||||
public DBInterfaceOption(final DBConfig config) {
|
||||
this.config = config;
|
||||
this.root = false;
|
||||
}
|
||||
|
||||
public DBInterfaceOption(final DBConfig config, boolean root) {
|
||||
this.config = config;
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public DBEntry getEntry(QueryOptions options) throws IOException {
|
||||
if (this.entry == null) {
|
||||
final DBInterfaceRoot isRoot = options.get(DBInterfaceRoot.class);
|
||||
this.entry = DBEntry.createInterface(this.config, isRoot != null && isRoot.getRoot());
|
||||
}
|
||||
return this.entry;
|
||||
}
|
||||
|
||||
public boolean getRoot() {
|
||||
return this.root;
|
||||
}
|
||||
|
||||
public static DBEntry getAutoEntry(QueryOptions options) throws IOException {
|
||||
final DBInterfaceOption dbOption = options.get(DBInterfaceOption.class);
|
||||
if (dbOption == null) {
|
||||
final DBInterfaceRoot isRoot = options.get(DBInterfaceRoot.class);
|
||||
return DBEntry.createInterface(GlobalConfiguration.dbConfig, isRoot != null && isRoot.getRoot());
|
||||
} else {
|
||||
return dbOption.getEntry(options);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.kar.archidata.dataAccess.options;
|
||||
|
||||
import org.kar.archidata.dataAccess.QueryOption;
|
||||
|
||||
public class DBInterfaceRoot extends QueryOption {
|
||||
private final boolean root;
|
||||
|
||||
public DBInterfaceRoot(boolean root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
public boolean getRoot() {
|
||||
return this.root;
|
||||
}
|
||||
|
||||
}
|
||||
57
src/org/kar/archidata/serializer/CSVMessageBodyWritter.java
Normal file
57
src/org/kar/archidata/serializer/CSVMessageBodyWritter.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package org.kar.archidata.serializer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
|
||||
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
|
||||
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.WebApplicationException;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.ext.MessageBodyWriter;
|
||||
import jakarta.ws.rs.ext.Provider;
|
||||
|
||||
/**
|
||||
* Body writter use in jersey with :
|
||||
* In your main:
|
||||
* ```java
|
||||
* rc.register(new CSVMessageBodyWritter());
|
||||
* ```
|
||||
*
|
||||
* and in the produce element:
|
||||
* ```java
|
||||
* @GET
|
||||
* @Produces("text/csv")
|
||||
* public List<Data> getData() {}
|
||||
* ```
|
||||
*/
|
||||
@Provider
|
||||
@Produces("text/csv")
|
||||
public class CSVMessageBodyWritter implements MessageBodyWriter<List<?>> {
|
||||
|
||||
@Override
|
||||
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
|
||||
return List.class.isAssignableFrom(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSize(List<?> data, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(List<?> data, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
|
||||
throws IOException, WebApplicationException {
|
||||
if (data != null && data.size() > 0) {
|
||||
CsvMapper mapper = new CsvMapper();
|
||||
Object o = data.get(0);
|
||||
CsvSchema schema = mapper.schemaFor(o.getClass()).withHeader();
|
||||
mapper.writer(schema).writeValue(entityStream, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ public class TestJson {
|
||||
final List<String> sqlCommand = DataFactory.createTable(SerializeAsJson.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ public class TestListJson {
|
||||
final List<String> sqlCommand = DataFactory.createTable(SerializeListAsJson.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public class TestManyToMany {
|
||||
sqlCommand.addAll(sqlCommand2);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ public class TestManyToOne {
|
||||
sqlCommand.addAll(sqlCommand2);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ public class TestOneToMany {
|
||||
final List<String> sqlCommand = DataFactory.createTable(TypesTable.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
121
test/src/test/kar/archidata/TestRawQuery.java
Normal file
121
test/src/test/kar/archidata/TestRawQuery.java
Normal file
@@ -0,0 +1,121 @@
|
||||
package test.kar.archidata;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.kar.archidata.GlobalConfiguration;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.DataFactory;
|
||||
import org.kar.archidata.db.DBEntry;
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import test.kar.archidata.model.TypesTable;
|
||||
|
||||
@ExtendWith(StepwiseExtension.class)
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class TestRawQuery {
|
||||
final static private Logger LOGGER = LoggerFactory.getLogger(TestTypes.class);
|
||||
|
||||
@BeforeAll
|
||||
public static void configureWebServer() throws Exception {
|
||||
if (!"true".equalsIgnoreCase(System.getenv("TEST_E2E_MODE"))) {
|
||||
ConfigBaseVariable.dbType = "sqlite";
|
||||
ConfigBaseVariable.dbHost = "memory";
|
||||
// for test we need to connect all time the DB
|
||||
ConfigBaseVariable.dbKeepConnected = "true";
|
||||
}
|
||||
// Connect the dataBase...
|
||||
final DBEntry entry = DBEntry.createInterface(GlobalConfiguration.dbConfig);
|
||||
entry.connect();
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void removeDataBase() throws IOException {
|
||||
LOGGER.info("Remove the test db");
|
||||
DBEntry.closeAllForceMode();
|
||||
ConfigBaseVariable.clearAllValue();
|
||||
}
|
||||
|
||||
@Order(1)
|
||||
@Test
|
||||
public void testCreateTable() throws Exception {
|
||||
final List<String> sqlCommand = DataFactory.createTable(TypesTable.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
@Order(2)
|
||||
@Test
|
||||
public void testGet() throws Exception {
|
||||
|
||||
final TypesTable test = new TypesTable();
|
||||
test.intData = 95;
|
||||
test.floatData = 1.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 96;
|
||||
test.floatData = 2.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 97;
|
||||
test.floatData = 3.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 98;
|
||||
test.floatData = 4.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 99;
|
||||
test.floatData = 5.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 99;
|
||||
test.floatData = 6.0F;
|
||||
DataAccess.insert(test);
|
||||
test.intData = 99;
|
||||
test.floatData = 7.0F;
|
||||
DataAccess.insert(test);
|
||||
{
|
||||
String querry = """
|
||||
SELECT *
|
||||
FROM TypesTable
|
||||
WHERE `intData` = ?
|
||||
ORDER BY id DESC
|
||||
""";
|
||||
List<Object> parameters = List.of(Integer.valueOf(99));
|
||||
// Try to retrieve all the data:
|
||||
final List<TypesTable> retrieve = DataAccess.query(TypesTable.class, querry, parameters);
|
||||
|
||||
Assertions.assertNotNull(retrieve);
|
||||
Assertions.assertEquals(3, retrieve.size());
|
||||
Assertions.assertEquals(99, retrieve.get(0).intData);
|
||||
Assertions.assertEquals(7.0F, retrieve.get(0).floatData);
|
||||
Assertions.assertEquals(6.0F, retrieve.get(1).floatData);
|
||||
Assertions.assertEquals(5.0F, retrieve.get(2).floatData);
|
||||
}
|
||||
{
|
||||
|
||||
String querry = """
|
||||
SELECT DISTINCT intData
|
||||
FROM TypesTable
|
||||
WHERE `intData` = ?
|
||||
ORDER BY id DESC
|
||||
""";
|
||||
List<Object> parameters = List.of(Integer.valueOf(99));
|
||||
// Try to retrieve all the data:
|
||||
final List<TypesTable> retrieve = DataAccess.query(TypesTable.class, querry, parameters);
|
||||
|
||||
Assertions.assertNotNull(retrieve);
|
||||
Assertions.assertEquals(1, retrieve.size());
|
||||
Assertions.assertEquals(99, retrieve.get(0).intData);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -65,7 +65,7 @@ public class TestSimpleTable {
|
||||
final List<String> sqlCommand = DataFactory.createTable(SimpleTable.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
final SimpleTable test = new SimpleTable();
|
||||
test.data = TestSimpleTable.DATA_INJECTED;
|
||||
|
||||
@@ -65,7 +65,7 @@ public class TestSimpleTableSoftDelete {
|
||||
final List<String> sqlCommand = DataFactory.createTable(SimpleTableSoftDelete.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
final SimpleTableSoftDelete test = new SimpleTableSoftDelete();
|
||||
test.data = TestSimpleTableSoftDelete.DATA_INJECTED;
|
||||
|
||||
@@ -53,7 +53,7 @@ public class TestTypeEnum1 {
|
||||
final List<String> sqlCommand = DataFactory.createTable(TypesEnum1.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ public class TestTypeEnum2 {
|
||||
final List<String> sqlCommand = DataFactory.createTable(TypesEnum2.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public class TestTypes {
|
||||
final List<String> sqlCommand = DataFactory.createTable(TypesTable.class);
|
||||
for (final String elem : sqlCommand) {
|
||||
LOGGER.debug("request: '{}'", elem);
|
||||
DataAccess.executeSimpleQuerry(elem, false);
|
||||
DataAccess.executeSimpleQuerry(elem);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.6.1
|
||||
0.6.2
|
||||
|
||||
Reference in New Issue
Block a user