From 1a2339a9f1f96ddca64ab392dd7f9e1621e6c201 Mon Sep 17 00:00:00 2001 From: James Moger Date: Tue, 9 Aug 2011 11:28:48 -0400 Subject: [PATCH] IQTable.primaryKey is now an array. Default values from objects. Also fixed an error with allowing null objects. Noted rapid churn of iciql in documentation. Changed build constants for next release. --- build.xml | 18 +--- docs/00_index.mkd | 2 + docs/01_model_classes.mkd | 19 ++++ docs/05_releases.mkd | 20 ++++- docs/resources/iciql.css | 5 ++ src/com/iciql/Constants.java | 10 +-- src/com/iciql/Db.java | 2 +- src/com/iciql/DbVersion.java | 2 +- src/com/iciql/Iciql.java | 69 ++++++++++----- src/com/iciql/IciqlException.java | 5 ++ src/com/iciql/ModelUtils.java | 45 +++++++++- src/com/iciql/TableDefinition.java | 86 ++++++++++--------- src/com/iciql/TableInspector.java | 48 ++++++----- src/com/iciql/util/Utils.java | 2 +- tests/com/iciql/test/DefaultValuesTest.java | 61 +++++++++++++ .../iciql/test/models/DefaultValuesModel.java | 58 +++++++++++++ 16 files changed, 336 insertions(+), 116 deletions(-) create mode 100644 tests/com/iciql/test/DefaultValuesTest.java create mode 100644 tests/com/iciql/test/models/DefaultValuesModel.java diff --git a/build.xml b/build.xml index 2c94cc4..9e54239 100644 --- a/build.xml +++ b/build.xml @@ -65,21 +65,6 @@ - - - - - - - - - - - - - - - @@ -140,7 +125,8 @@ - + + diff --git a/docs/00_index.mkd b/docs/00_index.mkd index 3371ce2..06bec5b 100644 --- a/docs/00_index.mkd +++ b/docs/00_index.mkd @@ -46,6 +46,8 @@ iciql requires a Java 6 Runtime Environment (JRE) or a Java 6 Development Kit (J ### Current Release +iciql is undergoing rapid development so api and configuration are subject to change from release to release + **%VERSION%** ([zip](http://code.google.com/p/iciql/downloads/detail?name=%ZIP%)|[jar](http://code.google.com/p/iciql/downloads/detail?name=%JAR%))   *released %BUILDDATE%* issues, binaries, & source @ [Google Code][googlecode]
diff --git a/docs/01_model_classes.mkd b/docs/01_model_classes.mkd index 846ef6c..274cb92 100644 --- a/docs/01_model_classes.mkd +++ b/docs/01_model_classes.mkd @@ -143,6 +143,7 @@ The recommended approach to setup a model class is to annotate the class and fie ### advantages - annotated fields may have any scope +- annotated fields may specify default values - annotated models support annotated field inheritance making it possible to design a single base class that defines the fields and then create table subclasses that specify the table mappings. - model runtime dependency is limited to the small, portable `com.iciql.Iciql` class file which contains the annotation definitions @@ -151,6 +152,24 @@ The recommended approach to setup a model class is to annotate the class and fie - more verbose model classes - indexes are defined using "fragile" string column names - compound primary keys are defined using "fragile" string column names + +### default values + +You may specify default values for an @IQColumn by either: + +1. specifying the default value string within your annotation
+%BEGINCODE% +// notice the single ticks! +@IQColumn(defaultValue="'2000-01-01 00:00:00'") +Date myDate; +%ENDCODE% +2. setting a default object on the field
+%BEGINCODE% +@IQColumn +Date myDate = new Date(100, 0, 1); +%ENDCODE% + +If you want to specify a database-specific variable or function as your default value (e.g. CURRENT_TIMESTAMP) you must do that within the annotation. Also note that the IQColumn.defaultValue must be a well-formatted SQL DEFAULT expression whereas object defaults will be automatically converted to an SQL DEFAULT expression. ### Example Annotated Model %BEGINCODE% diff --git a/docs/05_releases.mkd b/docs/05_releases.mkd index b060fd2..8d1295b 100644 --- a/docs/05_releases.mkd +++ b/docs/05_releases.mkd @@ -2,8 +2,26 @@ ### Current Release +iciql is undergoing rapid development so api and configuration are subject to change from release to release + **%VERSION%** ([zip](http://code.google.com/p/iciql/downloads/detail?name=%ZIP%)|[jar](http://code.google.com/p/iciql/downloads/detail?name=%JAR%))   *released %BUILDDATE%* +- api change release (API v4) +- allow using objects to assign default values
+%BEGINCODE% +// CREATE TABLE ... myDate DATETIME DEFAULT '2000-02-01 00:00:00' +@IQColumn +Date myDate = new Date(100, 1, 1); +%ENDCODE% +- changed @IQTable.primaryKey definition to use array of column names
+%BEGINCODE% +@IQTable( primaryKey = {"name", "nickname"}) +%ENDCODE% + +### Older Releases + +**0.6.3**   *released 2011-08-08* + - api change release (API v3) - finished enum support (issue 4) - added UUID type support (H2 databases only) @@ -11,8 +29,6 @@ - added *between(A y).and(A z)* condition syntax - moved dialects into separate package -### Older Releases - **0.6.2**   *released 2011-08-05* - api change release (API v2) diff --git a/docs/resources/iciql.css b/docs/resources/iciql.css index 7f8a48b..3ba942b 100644 --- a/docs/resources/iciql.css +++ b/docs/resources/iciql.css @@ -77,6 +77,11 @@ a:hover, a:visited, a:active { color: #880000; } +span.warning { + font-weight: bold; + color: #f00000; +} + img.logo { margin-top:-8px; float: right; diff --git a/src/com/iciql/Constants.java b/src/com/iciql/Constants.java index 809c06c..917fcb0 100644 --- a/src/com/iciql/Constants.java +++ b/src/com/iciql/Constants.java @@ -25,18 +25,14 @@ public class Constants { // The build script extracts this exact line so be careful editing it // and only use A-Z a-z 0-9 .-_ in the string. - public static final String VERSION = "0.6.3"; + public static final String VERSION = "0.6.4-SNAPSHOT"; // The build script extracts this exact line so be careful editing it // and only use A-Z a-z 0-9 .-_ in the string. - public static final String VERSION_DATE = "2011-08-08"; - - // The build script extracts this exact line so be careful editing it - // and only use A-Z a-z 0-9 .-_ in the string. - public static final String API_CURRENT = "3"; + public static final String VERSION_DATE = "PENDING"; // The build script extracts this exact line so be careful editing it // and only use A-Z a-z 0-9 .-_ in the string. - public static final String API_PREVIOUS = "2"; + public static final String API_CURRENT = "4"; } diff --git a/src/com/iciql/Db.java b/src/com/iciql/Db.java index 121e50c..621e825 100644 --- a/src/com/iciql/Db.java +++ b/src/com/iciql/Db.java @@ -114,7 +114,7 @@ public class Db { return TOKENS.get(x); } - private static T instance(Class clazz) { + static T instance(Class clazz) { try { return clazz.newInstance(); } catch (Exception e) { diff --git a/src/com/iciql/DbVersion.java b/src/com/iciql/DbVersion.java index ff72ec0..2a8aa44 100644 --- a/src/com/iciql/DbVersion.java +++ b/src/com/iciql/DbVersion.java @@ -23,7 +23,7 @@ import com.iciql.Iciql.IQTable; /** * A system table to track database and table versions. */ -@IQTable(name = "_iq_versions", primaryKey = "schemaName tableName", memoryTable = true) +@IQTable(name = "_iq_versions", primaryKey = { "schemaName", "tableName"}, memoryTable = true) public class DbVersion { @IQColumn(name = "schemaName", length = 255, allowNull = false) diff --git a/src/com/iciql/Iciql.java b/src/com/iciql/Iciql.java index 64c2158..2eaf783 100644 --- a/src/com/iciql/Iciql.java +++ b/src/com/iciql/Iciql.java @@ -35,7 +35,9 @@ import java.lang.annotation.Target; *

* Fully Supported Data Types: * - * + * + * + * * * * @@ -104,7 +106,9 @@ import java.lang.annotation.Target; * * - * + * + * + * * * * @@ -117,22 +121,38 @@ import java.lang.annotation.Target; * BUT these field types may not be used to specify compile-time clauses or * constraints. *
All Databases
All Databases
java.lang.StringVARCHAR (length > 0) or TEXT (length == 0)INT
* EnumType.ENUMID
H2 Databases
H2 Databases
java.util.UUIDUUID
- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * *
byte []BLOB
booleanBIT
byteTINYINT
shortSMALLINT
intINT
longBIGINT
floatREAL
doubleDOUBLE
byte []BLOB
booleanBIT
byteTINYINT
shortSMALLINT
intINT
longBIGINT
floatREAL
doubleDOUBLE
*

* Table and field mapping: by default, the mapped table name is the class name @@ -302,13 +322,13 @@ public interface Iciql { * then no primary key is set by the IQTable annotation. You may specify * a composite primary key. *

    - *
  • primaryKey = "id, name" - *
  • primaryKey = "id name" + *
  • single column primaryKey: value = "id" + *
  • compound primary key: value = { "id", "name" } *
* The primary key may still be overridden in the define() method if the * model class is not annotated with IQTable. Default: unspecified. */ - String primaryKey() default ""; + String[] primaryKey() default {}; /** * The inherit columns allows this model class to inherit columns from @@ -406,6 +426,11 @@ public interface Iciql { * if the default value is specified, and auto increment is disabled, * and primary key is disabled, then this value is included in the * "DEFAULT ..." phrase of a column during the CREATE TABLE process. + *

+ * Alternatively, you may specify a default object value on the field + * and this will be converted to a properly formatted DEFAULT expression + * during the CREATE TABLE process. + *

* Default: unspecified (null). */ String defaultValue() default ""; @@ -435,7 +460,7 @@ public interface Iciql { */ public enum EnumType { NAME, ORDINAL, ENUMID; - + public static final EnumType DEFAULT_TYPE = NAME; } diff --git a/src/com/iciql/IciqlException.java b/src/com/iciql/IciqlException.java index 9f411d9..1e2a890 100644 --- a/src/com/iciql/IciqlException.java +++ b/src/com/iciql/IciqlException.java @@ -30,6 +30,11 @@ public class IciqlException extends RuntimeException { } + public IciqlException(Throwable t, String message, Object... parameters) { + super(parameters.length > 0 ? MessageFormat.format(message, parameters) : message, t); + + } + public IciqlException(Throwable t) { super(t); } diff --git a/src/com/iciql/ModelUtils.java b/src/com/iciql/ModelUtils.java index 579c7f6..2e42a7d 100644 --- a/src/com/iciql/ModelUtils.java +++ b/src/com/iciql/ModelUtils.java @@ -21,14 +21,16 @@ import static com.iciql.util.StringUtils.isNullOrEmpty; import java.lang.reflect.Method; import java.math.BigDecimal; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.regex.Pattern; -import com.iciql.Iciql.EnumType; import com.iciql.TableDefinition.FieldDefinition; import com.iciql.util.StringUtils; @@ -61,7 +63,7 @@ class ModelUtils { m.put(java.sql.Time.class, "TIME"); m.put(byte[].class, "BLOB"); m.put(UUID.class, "UUID"); - + // map primitives m.put(boolean.class, m.get(Boolean.class)); m.put(byte.class, m.get(Byte.class)); @@ -201,9 +203,9 @@ class ModelUtils { // do not map from SQL TYPE to primitive type continue; } - if (SUPPORTED_TYPES.get(clazz).equalsIgnoreCase(sqlType)) { + if (SUPPORTED_TYPES.get(clazz).equalsIgnoreCase(sqlType)) { mappedClass = clazz; - + break; } } @@ -252,6 +254,41 @@ class ModelUtils { return lower; } + /** + * Converts the object into a DEFAULT clause value. + * + * @param o + * the default object + * @return the value formatted for a DEFAULT clause + */ + static String formatDefaultValue(Object o) { + Class objectClass = o.getClass(); + String value = null; + if (Number.class.isAssignableFrom(objectClass)) { + // NUMBER + value = ((Number) o).toString(); + } else if (java.sql.Date.class.isAssignableFrom(objectClass)) { + // DATE + value = new SimpleDateFormat("yyyy-MM-dd").format((Date) o); + } else if (java.sql.Time.class.isAssignableFrom(objectClass)) { + // TIME + value = new SimpleDateFormat("HH:mm:ss").format((Date) o); + } else if (Date.class.isAssignableFrom(objectClass)) { + // DATETIME + value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) o); + } else if (String.class.isAssignableFrom(objectClass)) { + // STRING + value = o.toString(); + } else if (Boolean.class.isAssignableFrom(objectClass)) { + // BOOLEAN + value = o.toString(); + } + if (value == null) { + return "''"; + } + return MessageFormat.format("''{0}''", value); + } + /** * Checks the formatting of IQColumn.defaultValue(). * diff --git a/src/com/iciql/TableDefinition.java b/src/com/iciql/TableDefinition.java index 7b3e1e4..6e25c91 100644 --- a/src/com/iciql/TableDefinition.java +++ b/src/com/iciql/TableDefinition.java @@ -267,6 +267,7 @@ public class TableDefinition { classFields.addAll(Arrays.asList(superClass.getDeclaredFields())); } + T defaultObject = Db.instance(clazz); for (Field f : classFields) { // default to field name String columnName = f.getName(); @@ -277,6 +278,21 @@ public class TableDefinition { boolean allowNull = true; EnumType enumType = null; String defaultValue = ""; + // configure Java -> SQL enum mapping + if (f.getType().isEnum()) { + enumType = EnumType.DEFAULT_TYPE; + if (f.getType().isAnnotationPresent(IQEnum.class)) { + // enum definition is annotated for all instances + IQEnum iqenum = f.getType().getAnnotation(IQEnum.class); + enumType = iqenum.value(); + } + if (f.isAnnotationPresent(IQEnum.class)) { + // this instance of the enum is annotated + IQEnum iqenum = f.getAnnotation(IQEnum.class); + enumType = iqenum.value(); + } + } + boolean hasAnnotation = f.isAnnotationPresent(IQColumn.class); if (hasAnnotation) { IQColumn col = f.getAnnotation(IQColumn.class); @@ -288,21 +304,29 @@ public class TableDefinition { maxLength = col.length(); trimString = col.trim(); allowNull = col.allowNull(); - defaultValue = col.defaultValue(); - } - // configure Java -> SQL enum mapping - if (f.getType().isEnum()) { - enumType = EnumType.DEFAULT_TYPE; - if (f.getType().isAnnotationPresent(IQEnum.class)) { - // enum definition is annotated for all instances - IQEnum iqenum = f.getType().getAnnotation(IQEnum.class); - enumType = iqenum.value(); + // try using default object + try { + f.setAccessible(true); + Object value = f.get(defaultObject); + if (value != null) { + if (value.getClass().isEnum()) { + // enum default, convert to target type + Enum anEnum = (Enum) value; + Object o = Utils.convertEnum(anEnum, enumType); + defaultValue = ModelUtils.formatDefaultValue(o); + } else { + // object default + defaultValue = ModelUtils.formatDefaultValue(value); + } + } + } catch (IllegalAccessException e) { + throw new IciqlException(e, "Failed to get default object for {0}", columnName); } - if (f.isAnnotationPresent(IQEnum.class)) { - // this instance of the enum is annotated - IQEnum iqenum = f.getAnnotation(IQEnum.class); - enumType = iqenum.value(); + + // annotation overrides + if (!StringUtils.isNullOrEmpty(col.defaultValue())) { + defaultValue = col.defaultValue(); } } @@ -340,6 +364,9 @@ public class TableDefinition { */ private Object getValue(Object obj, FieldDefinition field) { Object value = field.getValue(obj); + if (value == null) { + return value; + } if (field.enumType != null) { // convert enumeration to INT or STRING Enum iqenum = (Enum) value; @@ -352,13 +379,13 @@ public class TableDefinition { } return iqenum.name(); case ORDINAL: - return iqenum.ordinal(); + return iqenum.ordinal(); case ENUMID: if (!EnumId.class.isAssignableFrom(value.getClass())) { throw new IciqlException(field.field.getName() + " does not implement EnumId!"); } EnumId enumid = (EnumId) value; - return enumid.enumId(); + return enumid.enumId(); } } if (field.trimString && field.maxLength > 0) { @@ -580,30 +607,6 @@ public class TableDefinition { return this; } - /** - * Retrieve list of columns from primary key definition. - * - * @param index - * the primary key columns, separated by space - * @return the column list - */ - private List getColumns(String index) { - List cols = Utils.newArrayList(); - if (index == null || index.length() == 0) { - return null; - } - String[] cs = index.split("(,|\\s)"); - for (String c : cs) { - if (c != null && c.trim().length() > 0) { - cols.add(c.trim()); - } - } - if (cols.size() == 0) { - return null; - } - return cols; - } - void mapObject(Object obj) { fieldMap.clear(); initObject(obj, fieldMap); @@ -636,8 +639,9 @@ public class TableDefinition { } // setup the primary index, if properly annotated - List primaryKey = getColumns(tableAnnotation.primaryKey()); - if (primaryKey != null) { + if (tableAnnotation.primaryKey().length > 0) { + List primaryKey = Utils.newArrayList(); + primaryKey.addAll(Arrays.asList(tableAnnotation.primaryKey())); setPrimaryKey(primaryKey); } } diff --git a/src/com/iciql/TableInspector.java b/src/com/iciql/TableInspector.java index 080e20e..6ec848d 100644 --- a/src/com/iciql/TableInspector.java +++ b/src/com/iciql/TableInspector.java @@ -226,11 +226,15 @@ public class TableInspector { ap.addParameter("name", table); if (primaryKeys.size() > 1) { - StringBuilder pk = new StringBuilder(); + StatementBuilder pk = new StatementBuilder(); + pk.append("{ "); for (String key : primaryKeys) { - pk.append(key).append(' '); + pk.appendExceptFirst(", "); + pk.append("\""); + pk.append(key); + pk.append("\""); } - pk.trimToSize(); + pk.append(" }"); ap.addParameter("primaryKey", pk.toString()); } @@ -328,8 +332,8 @@ public class TableInspector { // Imports // don't import primitives, java.lang classes, or byte [] if (clazz.getPackage() == null) { - } else if (clazz.getPackage().getName().equals("java.lang")) { - } else if (clazz.equals(byte[].class)) { + } else if (clazz.getPackage().getName().equals("java.lang")) { + } else if (clazz.equals(byte[].class)) { } else { imports.add(clazz.getCanonicalName()); } @@ -508,13 +512,12 @@ public class TableInspector { remarks.add(warn( table, col, - format("{0}.maxLength={1}, ColumnMaxLength={2}", IQColumn.class.getSimpleName(), + format("{0}.length={1}, ColumnMaxLength={2}", IQColumn.class.getSimpleName(), fieldDef.maxLength, col.size))); } if (fieldDef.maxLength > 0 && !fieldDef.trimString) { - remarks.add(consider(table, col, - format("{0}.truncateToMaxLength=true" + " will prevent IciqlExceptions on" - + " INSERT or UPDATE, but will clip data!", IQColumn.class.getSimpleName()))); + remarks.add(consider(table, col, format("{0}.trim=true will prevent IciqlExceptions on" + + " INSERT or UPDATE, but will clip data!", IQColumn.class.getSimpleName()))); } } @@ -523,55 +526,58 @@ public class TableInspector { remarks.add(warn( table, col, - format("{0}.isAutoIncrement={1}" + " while Column autoIncrement={2}", + format("{0}.autoIncrement={1}" + " while Column autoIncrement={2}", IQColumn.class.getSimpleName(), fieldDef.isAutoIncrement, col.isAutoIncrement))); } // default value if (!col.isAutoIncrement && !col.isPrimaryKey) { + String defaultValue = null; + if (fieldDef.defaultValue != null && fieldDef.defaultValue instanceof String) { + defaultValue = fieldDef.defaultValue.toString(); + } // check Model.defaultValue format - if (!ModelUtils.isProperlyFormattedDefaultValue(fieldDef.defaultValue)) { + if (!ModelUtils.isProperlyFormattedDefaultValue(defaultValue)) { remarks.add(error( table, col, format("{0}.defaultValue=\"{1}\"" + " is improperly formatted!", - IQColumn.class.getSimpleName(), fieldDef.defaultValue)) - .throwError(throwError)); + IQColumn.class.getSimpleName(), defaultValue)).throwError(throwError)); // next field return; } // compare Model.defaultValue to Column.defaultValue - if (isNullOrEmpty(fieldDef.defaultValue) && !isNullOrEmpty(col.defaultValue)) { + if (isNullOrEmpty(defaultValue) && !isNullOrEmpty(col.defaultValue)) { // Model.defaultValue is NULL, Column.defaultValue is NOT NULL remarks.add(warn( table, col, format("{0}.defaultValue=\"\"" + " while column default=\"{1}\"", IQColumn.class.getSimpleName(), col.defaultValue))); - } else if (!isNullOrEmpty(fieldDef.defaultValue) && isNullOrEmpty(col.defaultValue)) { + } else if (!isNullOrEmpty(defaultValue) && isNullOrEmpty(col.defaultValue)) { // Column.defaultValue is NULL, Model.defaultValue is NOT NULL remarks.add(warn( table, col, format("{0}.defaultValue=\"{1}\"" + " while column default=\"\"", - IQColumn.class.getSimpleName(), fieldDef.defaultValue))); - } else if (!isNullOrEmpty(fieldDef.defaultValue) && !isNullOrEmpty(col.defaultValue)) { - if (!fieldDef.defaultValue.equals(col.defaultValue)) { + IQColumn.class.getSimpleName(), defaultValue))); + } else if (!isNullOrEmpty(defaultValue) && !isNullOrEmpty(col.defaultValue)) { + if (!defaultValue.equals(col.defaultValue)) { // Model.defaultValue != Column.defaultValue remarks.add(warn( table, col, format("{0}.defaultValue=\"{1}\"" + " while column default=\"{2}\"", - IQColumn.class.getSimpleName(), fieldDef.defaultValue, col.defaultValue))); + IQColumn.class.getSimpleName(), defaultValue, col.defaultValue))); } } // sanity check Model.defaultValue literal value - if (!ModelUtils.isValidDefaultValue(fieldDef.field.getType(), fieldDef.defaultValue)) { + if (!ModelUtils.isValidDefaultValue(fieldDef.field.getType(), defaultValue)) { remarks.add(error( table, col, format("{0}.defaultValue=\"{1}\" is invalid!", IQColumn.class.getSimpleName(), - fieldDef.defaultValue))); + defaultValue))); } } } diff --git a/src/com/iciql/util/Utils.java b/src/com/iciql/util/Utils.java index 3237742..fa794cf 100644 --- a/src/com/iciql/util/Utils.java +++ b/src/com/iciql/util/Utils.java @@ -116,7 +116,7 @@ public class Utils { } } } - throw new IciqlException("Exception trying to create " + clazz.getName() + ": " + e, e); + throw new IciqlException("Missing default constructor? Exception trying to create " + clazz.getName() + ": " + e, e); } } }; diff --git a/tests/com/iciql/test/DefaultValuesTest.java b/tests/com/iciql/test/DefaultValuesTest.java new file mode 100644 index 0000000..b39dd7c --- /dev/null +++ b/tests/com/iciql/test/DefaultValuesTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2011 James Moger. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.iciql.test; + +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +import com.iciql.Db; +import com.iciql.DbInspector; +import com.iciql.ValidationRemark; +import com.iciql.test.models.DefaultValuesModel; + +/** + * Tests default object values. + */ +public class DefaultValuesTest { + + @Test + public void testDefaultObjectValues() { + Db db = Db.open("jdbc:h2:mem:", "sa", "sa"); + + // insert random model + DefaultValuesModel model = new DefaultValuesModel(); + db.insert(model); + + DefaultValuesModel v = new DefaultValuesModel(); + + // retrieve model and compare + DefaultValuesModel retrievedModel = db.from(v).selectFirst(); + assertTrue(model.myInteger.equals(retrievedModel.myInteger)); + assertTrue(model.myDate.equals(retrievedModel.myDate)); + assertTrue(model.myEnumIdTree.equals(retrievedModel.myEnumIdTree)); + assertTrue(model.myNameTree.equals(retrievedModel.myNameTree)); + assertTrue(model.myOrdinalTree.equals(retrievedModel.myOrdinalTree)); + assertTrue(retrievedModel.myNullTree == null); + + DbInspector inspector = new DbInspector(db); + List remarks = inspector.validateModel(model, false); + db.close(); + for (ValidationRemark remark : remarks) { + System.out.println(remark.toString()); + } + } +} diff --git a/tests/com/iciql/test/models/DefaultValuesModel.java b/tests/com/iciql/test/models/DefaultValuesModel.java new file mode 100644 index 0000000..2669257 --- /dev/null +++ b/tests/com/iciql/test/models/DefaultValuesModel.java @@ -0,0 +1,58 @@ +/* + * Copyright 2011 James Moger. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.iciql.test.models; + +import java.util.Date; + +import com.iciql.Iciql.EnumType; +import com.iciql.Iciql.IQColumn; +import com.iciql.Iciql.IQEnum; +import com.iciql.Iciql.IQTable; +import com.iciql.test.models.EnumModels.Tree; + +/** + * Default values model. + */ +@IQTable(name = "DefaultValuesTest") +public class DefaultValuesModel { + + @IQColumn(primaryKey = true, autoIncrement = true) + public Long myLong; + + @SuppressWarnings("deprecation") + @IQColumn + public Date myDate = new Date(100, 7, 1); + + @IQColumn + public Integer myInteger = 12345; + + @IQColumn + public Tree myEnumIdTree = Tree.WALNUT; + + @IQColumn + @IQEnum(EnumType.NAME) + public Tree myNameTree = Tree.MAPLE; + + @IQColumn + @IQEnum(EnumType.ORDINAL) + public Tree myOrdinalTree = Tree.PINE; + + @IQColumn(allowNull = true) + public Tree myNullTree; + + public DefaultValuesModel() { + } +} -- 2.39.5