This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/master by this push:
new aece78e EMPIREDB-362 final changes
aece78e is described below
commit aece78e63035716a37f52001d0236539486c5c79
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Mar 8 11:11:53 2022 +0100
EMPIREDB-362 final changes
---
.../apache/empire/db/codegen/CodeGenConfig.java | 17 ++++++++-
.../apache/empire/db/codegen/CodeGenWriter.java | 2 +
.../src/main/resources/templates/BaseRecord.vm | 23 +++++++++---
.../src/main/resources/templates/BaseTable.vm | 2 +-
.../src/main/resources/templates/BaseView.vm | 2 +-
.../src/main/resources/templates/Database.vm | 3 +-
.../src/main/resources/templates/Record.vm | 8 ++--
.../src/main/resources/templates/Table.vm | 2 +-
.../src/main/resources/templates/View.vm | 2 +-
.../empire/samples/db/advanced/SampleAdvApp.java | 11 ++++++
.../empire/samples/db/advanced/db/CarSalesDB.java | 2 -
.../samples/db/advanced/records/BrandRecord.java | 19 +++++++++-
.../samples/db/advanced/records/DealerRecord.java | 43 +++++++++++++++++++++-
.../samples/db/advanced/records/ModelRecord.java | 38 ++++++++++++++++++-
.../org/apache/empire/samples/db/SampleApp.java | 3 +-
.../empire/samples/springboot/SampleApp.java | 5 ++-
.../java/org/apache/empire/data/ColumnExpr.java | 1 -
.../main/java/org/apache/empire/db/DBDatabase.java | 34 +++++++++++------
.../main/java/org/apache/empire/db/DBRowSet.java | 14 +++++--
.../java/org/apache/empire/db/generic/TRecord.java | 26 +++++++++----
.../apache/empire/dbms/hsql/DBMSHandlerHSql.java | 2 +
21 files changed, 211 insertions(+), 48 deletions(-)
diff --git
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
index 94e0198..a1c8fd7 100644
---
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
+++
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenConfig.java
@@ -138,6 +138,11 @@ public class CodeGenConfig extends XMLConfiguration {
* <br/>
*/
private String recordBaseName = "BaseRecord";
+
+ /**
+ * Name of the Context class
+ */
+ private String contextClassName = "DBContext";
/**
* Prefix used for table member declarations
@@ -473,7 +478,17 @@ public class CodeGenConfig extends XMLConfiguration {
this.recordBaseName = recordBaseName;
}
- public String getTableNamePrefix() {
+ public String getContextClassName()
+ {
+ return contextClassName;
+ }
+
+ public void setContextClassName(String contextClassName)
+ {
+ this.contextClassName = contextClassName;
+ }
+
+ public String getTableNamePrefix() {
return tableNamePrefix;
}
diff --git
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
index 5e4de8d..8e8df1b 100644
---
a/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
+++
b/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenWriter.java
@@ -287,6 +287,7 @@ public class CodeGenWriter {
context.put("basePackageName", config.getPackageName());
context.put("tablePackageName", config.getTablePackageName());
context.put("recordPackageName", config.getRecordPackageName());
+ context.put("contextClassName", config.getContextClassName());
context.put("baseTableClassName", config.getTableBaseName());
writeFile(file, BASE_RECORD_TEMPLATE, context);
return file;
@@ -304,6 +305,7 @@ public class CodeGenWriter {
context.put("tablePackageName",
config.getTablePackageName());
context.put("recordPackageName", config.getRecordPackageName());
context.put("baseRecordClassName", config.getRecordBaseName());
+ context.put("contextClassName", config.getContextClassName());
context.put("dbClassName", config.getDbClassName());
context
.put("createRecordProperties", config
diff --git a/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
b/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
index 913f559..2a1c2a8 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseRecord.vm
@@ -26,21 +26,34 @@ import org.apache.empire.db.DBTable;
import ${tablePackageName}.${baseTableClassName};
#end
-public abstract class ${baseRecordClassName}<T extends ${baseTableClassName}>
extends DBRecord {
+public abstract class ${baseRecordClassName}<CTX extends $contextClassName, T
extends ${baseTableClassName}> extends DBRecord {
private static final long serialVersionUID = 1L;
+ public final CTX CTX; // provide access to the context
+
public final T T; // provide access to RowSet via T
- public ${baseRecordClassName}(DBContext context, T rowset) {
+ public ${baseRecordClassName}(CTX context, T rowset) {
super(context, rowset);
- // set the RowSet for quick access
+ // set context and RowSet for quick access
+ this.CTX = context;
this.T = rowset;
}
/**
- * Returns the RowSet this record is based upon.
- * @return The RowSet this record is based upon.
+ * Returns the Context
+ * @return The Context
+ */
+ @Override
+ public CTX getContext()
+ {
+ return this.CTX;
+ }
+
+ /**
+ * Returns the RowSet for this record
+ * @return The RowSet for this record
*/
@Override
public T getRowSet()
diff --git a/empire-db-codegen/src/main/resources/templates/BaseTable.vm
b/empire-db-codegen/src/main/resources/templates/BaseTable.vm
index c92f9bf..bbef8e6 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseTable.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseTable.vm
@@ -23,7 +23,7 @@ import ${basePackageName}.${dbClassName};
public class ${baseTableClassName} extends DBTable {
- private static final long serialVersionUID = 1L;
+ // private static final long serialVersionUID = 1L;
public final ${dbClassName} DB;
diff --git a/empire-db-codegen/src/main/resources/templates/BaseView.vm
b/empire-db-codegen/src/main/resources/templates/BaseView.vm
index 53bf5e3..ae81712 100644
--- a/empire-db-codegen/src/main/resources/templates/BaseView.vm
+++ b/empire-db-codegen/src/main/resources/templates/BaseView.vm
@@ -23,7 +23,7 @@ import ${basePackageName}.${dbClassName};
public abstract class ${baseViewClassName} extends DBView {
- private static final long serialVersionUID = 1L;
+ // private static final long serialVersionUID = 1L;
public final ${dbClassName} DB;
diff --git a/empire-db-codegen/src/main/resources/templates/Database.vm
b/empire-db-codegen/src/main/resources/templates/Database.vm
index bfb7184..7e8be2c 100644
--- a/empire-db-codegen/src/main/resources/templates/Database.vm
+++ b/empire-db-codegen/src/main/resources/templates/Database.vm
@@ -50,8 +50,9 @@ import $viewPackageName.*;
public class $dbClassName extends DBDatabase {
+ // private static final long serialVersionUID = 1L;
+
private static $dbClassName instance;
- private static final long serialVersionUID = 1L;
#foreach($table in $database.tables)
#set($tblClass=$parser.getTableClassName($table.name))
diff --git a/empire-db-codegen/src/main/resources/templates/Record.vm
b/empire-db-codegen/src/main/resources/templates/Record.vm
index 2bf6bd6..bcab354 100644
--- a/empire-db-codegen/src/main/resources/templates/Record.vm
+++ b/empire-db-codegen/src/main/resources/templates/Record.vm
@@ -42,7 +42,7 @@ import
${tablePackageName}.$parser.getTableClassName($table.name);
* This class provides protected method that subclasses should use to provide
* access to related records.
*/
-public class $parser.getRecordClassName($table.name) extends
${baseRecordClassName}<$parser.getTableClassName($table.name)> {
+public class $parser.getRecordClassName($table.name) extends
${baseRecordClassName}<$contextClassName,
$parser.getTableClassName($table.name)> {
private static final long serialVersionUID = 1L;
@@ -54,10 +54,10 @@ public class $parser.getRecordClassName($table.name)
extends ${baseRecordClassNa
// Access methods for all columns
#foreach($col in $table.columns)
- public $parser.getJavaType($col).getCanonicalName()
$parser.getAccessorName($col)() {
- return
($parser.getJavaType($col).getCanonicalName())super.get(T.${parser.getColumnName($col)});
+ public $parser.getJavaType($col).getSimpleName()
$parser.getAccessorName($col)() {
+ return
($parser.getJavaType($col).getSimpleName())super.get(T.${parser.getColumnName($col)});
}
- public void
$parser.getMutatorName($col)($parser.getJavaType($col).getCanonicalName() val) {
+ public void
$parser.getMutatorName($col)($parser.getJavaType($col).getSimpleName() val) {
super.set(T.${parser.getColumnName($col)}, val);
}
#end
diff --git a/empire-db-codegen/src/main/resources/templates/Table.vm
b/empire-db-codegen/src/main/resources/templates/Table.vm
index e72cc68..f511ac1 100644
--- a/empire-db-codegen/src/main/resources/templates/Table.vm
+++ b/empire-db-codegen/src/main/resources/templates/Table.vm
@@ -33,7 +33,7 @@ import $basePackageName.${dbClassName};
public class $parser.getTableClassName($table.name) extends
${baseTableClassName} {
#end
- private static final long serialVersionUID = 1L;
+ // private static final long serialVersionUID = 1L;
// define columns
#foreach ($col in $table.columns)
diff --git a/empire-db-codegen/src/main/resources/templates/View.vm
b/empire-db-codegen/src/main/resources/templates/View.vm
index 9400c34..1f97ca4 100644
--- a/empire-db-codegen/src/main/resources/templates/View.vm
+++ b/empire-db-codegen/src/main/resources/templates/View.vm
@@ -36,7 +36,7 @@ import $basePackageName.${dbClassName};
public class $parser.getViewClassName($view.name) extends ${baseViewClassName}
{
#end
- private static final long serialVersionUID = 1L;
+ // private static final long serialVersionUID = 1L;
// define columns
#foreach ($col in $view.columns)
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index 6aed30f..489a282 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -118,6 +118,12 @@ public class SampleAdvApp
context.setPreparedStatementsEnabled(true);
context.setRollbackHandlingEnabled(false);
+ /*
+ // optional: Disable PreparedStatements for DBRecord operations (not
recommended)
+ if (!context.isPreparedStatementsEnabled())
+ carSales.setPreparedStatementsEnabled(false);
+ */
+
// STEP 3: Open Database (and create if not existing)
System.out.println("*** Step 3: openDatabase() ***");
// db.open(context);
@@ -548,6 +554,11 @@ public class SampleAdvApp
log.info("Dealer \"{}\" rating changed from {} to {}",
dealer.getString(DEALER.COMPANY_NAME), oldRating, newRating);
dealer.set(DEALER.RATING, newRating);
dealer.update();
+ // Show brands
+ String brands = dealer.getBrands();
+ log.info("Dealer \"{}\" distributes the brands {}",
dealer.getString(DEALER.COMPANY_NAME), brands);
+ // alternatively use
+ // List<BrandRecord> brandList = dealer.getBrandList();
}
context.commit();
}
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
index 1eeb99b..9041f10 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/db/CarSalesDB.java
@@ -321,8 +321,6 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
@Override
public void open(DBContext context)
{
- // Enable prepared statements
- setPreparedStatementsEnabled(true);
// Check exists
if (checkExists(context))
{ // attach to driver
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
index ba546a3..3efd4ba 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/BrandRecord.java
@@ -18,11 +18,12 @@
*/
package org.apache.empire.samples.db.advanced.records;
+import org.apache.empire.db.DBRecord;
import org.apache.empire.db.generic.TRecord;
import org.apache.empire.samples.db.advanced.SampleContext;
import org.apache.empire.samples.db.advanced.db.CarSalesDB;
-public class BrandRecord extends TRecord<CarSalesDB.Brand>
+public class BrandRecord extends TRecord<SampleContext, CarSalesDB.Brand>
{
private static final long serialVersionUID = 1L;
@@ -31,6 +32,13 @@ public class BrandRecord extends TRecord<CarSalesDB.Brand>
super(context, context.getDatabase().BRAND);
}
+ /**
+ * Insert a new brand
+ * @param wmi
+ * @param name
+ * @param country
+ * @return the BrandRecord itself (returned to allow instruction chaining)
+ */
public BrandRecord insert(String wmi, String name, String country)
{
// T = RowSet (Table/View)
@@ -42,4 +50,13 @@ public class BrandRecord extends TRecord<CarSalesDB.Brand>
return this;
}
+ /**
+ * Overloaded read for convenience
+ * @param wmi
+ */
+ public void read(String wmi)
+ {
+ super.read(DBRecord.key(wmi));
+ }
+
}
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
index b138204..329ce79 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/DealerRecord.java
@@ -1,18 +1,30 @@
package org.apache.empire.samples.db.advanced.records;
+import java.util.List;
+
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.generic.TRecord;
import org.apache.empire.samples.db.advanced.SampleContext;
import org.apache.empire.samples.db.advanced.db.CarSalesDB;
-public class DealerRecord extends TRecord<CarSalesDB.Dealer>
+public class DealerRecord extends TRecord<SampleContext, CarSalesDB.Dealer>
{
private static final long serialVersionUID = 1L;
+
+ private List<BrandRecord> brandList = null; // Lazy initialization
public DealerRecord(SampleContext context)
{
super(context, context.getDatabase().DEALER);
}
+ /**
+ * Create a new Dealer
+ * @param companyName
+ * @param city
+ * @param country
+ * @return the DealerRecord itself (returned to allow instruction chaining)
+ */
public DealerRecord insert(String companyName, String city, String country)
{
// T = RowSet (Table/View)
@@ -23,4 +35,33 @@ public class DealerRecord extends TRecord<CarSalesDB.Dealer>
update();
return this;
}
+
+ /**
+ * Get the Brand names as a comma separated String
+ * @return the brand names
+ */
+ public String getBrands()
+ {
+ DBCommand cmd = T.DB.createCommand()
+ .select(T.DB.BRAND.NAME.stringAgg(", "))
+ .join(T.DB.DEALER_BRANDS.WMI, T.DB.BRAND.WMI)
+ .where(T.DB.DEALER_BRANDS.DEALER_ID.is(getIdentity()));
+ return CTX.getUtils().querySingleString(cmd);
+ }
+
+ /**
+ * Get the dealers Brands as a list of BrandRecords
+ * @return the BrandRecords
+ */
+ public List<BrandRecord> getBrandList()
+ {
+ if (brandList == null)
+ { // init brand list
+ DBCommand cmd = T.DB.createCommand()
+ .join(T.DB.DEALER_BRANDS.WMI, T.DB.BRAND.WMI)
+ .where(T.DB.DEALER_BRANDS.DEALER_ID.is(getIdentity()));
+ brandList = CTX.getUtils().queryRecordList(cmd, T.DB.BRAND,
BrandRecord.class);
+ }
+ return brandList;
+ }
}
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
index 31bc745..bc4c610 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/records/ModelRecord.java
@@ -15,17 +15,30 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
-public class ModelRecord extends TRecord<CarSalesDB.Model>
+public class ModelRecord extends TRecord<SampleContext, CarSalesDB.Model>
{
private static final Logger log =
LoggerFactory.getLogger(ModelRecord.class);
private static final long serialVersionUID = 1L;
+
+ private BrandRecord brand = null; // Lazy initialization
public ModelRecord(SampleContext context)
{
super(context, context.getDatabase().MODEL);
}
+ /**
+ * Insert a new Model
+ * @param brand
+ * @param modelName
+ * @param configName
+ * @param trim
+ * @param engineType
+ * @param enginePower
+ * @param basePrice
+ * @param firstSale
+ */
public void insert(BrandRecord brand, String modelName, String configName,
String trim
, EngineType engineType, int enginePower, double
basePrice, LocalDate firstSale)
{
@@ -41,6 +54,19 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
set(T.FIRST_SALE , firstSale);
update();
}
+
+ /**
+ * Returns the Model's brand
+ * @return
+ */
+ public BrandRecord getBrand()
+ {
+ if (brand==null) {
+ brand = new BrandRecord(CTX);
+ brand.read(getString(T.WMI));
+ }
+ return brand;
+ }
@Override
public void update()
@@ -57,6 +83,11 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
super.update();
}
+ /**
+ * Generates the Model-XML when Record is modified
+ * Only used to demonstrate the use of the CLOB-DataType
+ * @return the XML String
+ */
private String getModelXml()
{
Document modelDoc = this.getXmlDocument();
@@ -66,6 +97,11 @@ public class ModelRecord extends TRecord<CarSalesDB.Model>
return writer.toString();
}
+ /**
+ * Serializes the Model-fields when Record is modified
+ * Only used to demonstrate the use of the BLOB-DataType
+ * @return the binary fields info
+ */
private byte[] getModelBinary()
{
try
diff --git
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index 8354216..c7e6d88 100644
---
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -38,7 +38,6 @@ import org.apache.empire.db.DBRecord;
import org.apache.empire.db.DBRecordBean;
import org.apache.empire.db.DBRowSet.PartialMode;
import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.generic.TRecord;
import org.apache.empire.dbms.DBMSHandler;
import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
import org.apache.empire.samples.db.SampleDB.Gender;
@@ -284,7 +283,7 @@ public class SampleApp
{
SampleDB.Departments DEP = db.DEPARTMENTS;
// Insert a Department
- TRecord<SampleDB.Departments> rec = new
TRecord<SampleDB.Departments>(context, DEP);
+ DBRecord rec = new DBRecord(context, DEP);
rec.create()
.set(DEP.NAME, departmentName)
.set(DEP.BUSINESS_UNIT, businessUnit)
diff --git
a/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
b/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
index 58d0994..6c6ccb1 100644
---
a/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
+++
b/empire-db-examples/empire-db-example-spring-boot/src/main/java/org/apache/empire/samples/springboot/SampleApp.java
@@ -26,7 +26,9 @@ import java.sql.SQLException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
+
import javax.sql.DataSource;
+
import org.apache.commons.beanutils.BeanUtils;
import org.apache.empire.commons.ObjectUtils;
import org.apache.empire.commons.StringUtils;
@@ -42,7 +44,6 @@ import org.apache.empire.db.DBRecord;
import org.apache.empire.db.DBRecordBean;
import org.apache.empire.db.DBRowSet;
import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.generic.TRecord;
import org.apache.empire.dbms.DBMSHandler;
import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
import org.apache.empire.exceptions.InvalidArgumentException;
@@ -180,7 +181,7 @@ public class SampleApp implements ApplicationRunner {
private long insertDepartment(String departmentName, String businessUnit) {
SampleDB.Departments DEP = db.DEPARTMENTS;
// Insert a Department
- TRecord<SampleDB.Departments> rec = new
TRecord<SampleDB.Departments>(context, DEP);
+ DBRecord rec = new DBRecord(context, DEP);
rec.create()
.set(DEP.NAME, departmentName)
.set(DEP.BUSINESS_UNIT, businessUnit)
diff --git a/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
b/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
index 2b8feb2..5714365 100644
--- a/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/data/ColumnExpr.java
@@ -19,7 +19,6 @@
package org.apache.empire.data;
import org.apache.empire.commons.Options;
-import org.apache.empire.commons.Unwrappable;
/**
* The column interface provides methods for accessing metadata that is
relevant for managing
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index 4daacaf..ac27663 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -150,14 +150,18 @@ public abstract class DBDatabase extends DBObject
protected DBMSHandler dbms = null;
- protected boolean legacyDate = true; // When true not using Java8
Local???? Types
-
/**
- * Property that indicates whether to always use usePreparedStatements
(Default is false!)
- * Note: This will only apply for update and insert commands as well as
for read operations on a DBRecord.
- * For custom SQL commands parameters must be explicitly declared using
cmd.addCmdParam();
+ * Property that indicates whether to use Prepared Statements for the read
and update operations in DBRecord (Default is true!).
+ * Note: This will not affect statements generated via
DBContext.createCommand()
+ * However statement parameters can always be manually declared using
cmd.addCmdParam();
+ */
+ private boolean autoPrepareStmt = true;
+
+ /**
+ * Flag indicating whether Bean getters / setters use java.util.Date or
Java types (LocalDate, LocalDateTime)
+ * True (default) when java.util.Date is used
*/
- private boolean autoPrepareStmt = false;
+ protected boolean legacyDate = true;
/**
* Constructs a new DBDatabase object and sets the specified schema object.
@@ -301,9 +305,10 @@ public abstract class DBDatabase extends DBObject
}
/**
- * return whether prepared statements are preferred over normal statements
(Default is false)
- * Note: This will only apply for update and insert commands as well as
for read operations on a DBRecord.
- * For custom SQL commands parameters must be explicitly declared using
cmd.addCmdParam();
+ * Returns whether Prepared Statements are enabled for the read and update
operations in DBRecord.
+ * Note: This will not affect statements generated via
DBContext.createCommand()
+ * However statement parameters can always be manually declared using
cmd.addCmdParam();
+ *
* @return true if prepared Statements are enabled or false if not
*/
public boolean isPreparedStatementsEnabled()
@@ -312,8 +317,10 @@ public abstract class DBDatabase extends DBObject
}
/**
- * enables or disables the use of prepared statements for update and
insert commands as well as for read operations on a DBRecord.
- * Note: For custom SQL commands parameters must be explicitly declared
using cmd.addCmdParam();
+ * Enables or Disables the use of Prepared Statements only for the read
and update operations in DBRecord.
+ * For general use of Prepared Statements please use
DBContext.createCommand()
+ * However statement parameters can always be manually declared using
cmd.addCmdParam();
+ *
* @param preparedStatementsEnabled
*/
public void setPreparedStatementsEnabled(boolean autoPrepareStmt)
@@ -924,11 +931,14 @@ public abstract class DBDatabase extends DBObject
* Creates a new Command object for this database
*
* @return the command object.
+ *
+ * @Deprecated use context.createCommand();
*/
public final DBCommand createCommand()
{
checkOpen();
- return dbms.createCommand(isPreparedStatementsEnabled());
+ // For compatiblity with 2.x dont use isPreparedStatementsEnabled()
+ return dbms.createCommand(false);
}
/**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index 88359d7..6f58608 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -37,6 +37,7 @@ import org.apache.empire.data.EntityType;
import org.apache.empire.data.Record;
import org.apache.empire.db.DBRelation.DBCascadeAction;
import org.apache.empire.db.DBRelation.DBReference;
+import org.apache.empire.db.context.DBContextBase;
import org.apache.empire.db.exceptions.FieldNotNullException;
import org.apache.empire.db.exceptions.FieldReadOnlyException;
import org.apache.empire.db.exceptions.InvalidKeyException;
@@ -1200,10 +1201,15 @@ public abstract class DBRowSet extends DBExpr
implements EntityType
*/
protected DBCommand createRecordCommand(DBContext context)
{
- /**
- * alternative is:
- * return context.getDbms().createCommand(true);
- */
+ // Special behaviour for DBRecord operations
+ if ((context instanceof DBContextBase) &&
!((DBContextBase)context).isPreparedStatementsEnabled())
+ { // Check PreparedStatementsEnabled in DBDatabase
+ if (getDatabase().isPreparedStatementsEnabled())
+ { // Use PreparedStatement even though disabled in context
+ return context.getDbms().createCommand(true);
+ }
+ }
+ // just use the context
return context.createCommand();
}
diff --git a/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
b/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
index 6a80227..e214bbc 100644
--- a/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/generic/TRecord.java
@@ -22,42 +22,54 @@ import org.apache.empire.db.DBContext;
import org.apache.empire.db.DBRecord;
import org.apache.empire.db.DBRowSet;
-public class TRecord<T extends DBRowSet> extends DBRecord
+public class TRecord<CTX extends DBContext, T extends DBRowSet> extends
DBRecord
{
private static final long serialVersionUID = 1L;
public final T T; // provide access to RowSet via T
+
+ public final CTX CTX; // provide access to Context via CTX
/**
- * Internal constructor for DBRecord
+ * Internal constructor for TRecord
* May be used by derived classes to provide special behaviour
*/
- protected TRecord(DBContext context, T rowset, boolean
enableRollbackHandling)
+ protected TRecord(CTX context, T rowset, boolean enableRollbackHandling)
{
super(context, rowset, enableRollbackHandling);
// set the rowset for quick access
this.T = rowset;
+ this.CTX = context;
}
/**
- * Constructs a new DBRecord.<BR>
+ * Constructs a new TRecord.<BR>
* @param context the DBContext for this record
* @param rowset the corresponding RowSet(Table, View, Query, etc.)
*/
- public TRecord(DBContext context, T rowset)
+ public TRecord(CTX context, T rowset)
{
super(context, rowset);
// set the rowset for quick access
this.T = rowset;
+ this.CTX = context;
+ }
+
+ /**
+ * finally we know the Context class
+ */
+ @Override
+ public CTX getContext()
+ {
+ return this.CTX;
}
/**
- * finally we know the rowset
+ * finally we know the RowSet class
*/
@Override
public T getRowSet()
{
return this.T;
}
-
}
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index 4c5819a..0acbef4 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -158,6 +158,8 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
case SQL_FUNC_MAX: return "max(?)";
case SQL_FUNC_MIN: return "min(?)";
case SQL_FUNC_AVG: return "avg(?)";
+ case SQL_FUNC_STRAGG: return "GROUP_CONCAT(DISTINCT ? ORDER
BY {1} SEPARATOR {0})";
+
// Others
case SQL_FUNC_DECODE: return "case ?{0} end";
case SQL_FUNC_DECODE_SEP: return " ";