org.apache.openjpa.jdbc.sql.JDataStoreDictionary Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.openjpa.jdbc.sql;
import java.sql.SQLException;
import java.util.Arrays;
import org.apache.openjpa.jdbc.kernel.exps.FilterValue;
import org.apache.openjpa.util.OpenJPAException;
import org.apache.openjpa.util.ReferentialIntegrityException;
/**
* Dictionary for Borland JDataStore
*/
public class JDataStoreDictionary
extends DBDictionary {
public JDataStoreDictionary() {
platform = "Borland JDataStore";
joinSyntax = SYNTAX_TRADITIONAL;
supportsDeferredConstraints = false;
allowsAliasInBulkClause = false;
maxTableNameLength = 31;
maxColumnNameLength = 31;
maxIndexNameLength = 31;
maxConstraintNameLength = 31;
useGetStringForClobs = true;
useSetStringForClobs = true;
useGetBytesForBlobs = true;
blobTypeName = "VARBINARY";
clobTypeName = "VARCHAR";
// it is possible to use a FOR UPDATE clause with JDataStore,
// but the actual row won't wind up being locked
supportsLockingWithDistinctClause = false;
supportsQueryTimeout = false;
// there is no build-in function for getting the last generated
// key in JDataStore; using MAX will have to suffice
supportsAutoAssign = true;
lastGeneratedKeyQuery = "SELECT MAX({0}) FROM {1}";
autoAssignClause = "AUTOINCREMENT";
fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
"SHORT", "INT", "LONG", "DOUBLE PRECISION", "BOOLEAN",
}));
searchStringEscape = "";
}
@Override
public void substring(SQLBuffer buf, FilterValue str, FilterValue start,
FilterValue length) {
buf.append("SUBSTRING(");
str.appendTo(buf);
buf.append(" FROM (");
start.appendTo(buf);
buf.append(") FOR (");
if (length == null) {
buf.append("CHAR_LENGTH(");
str.appendTo(buf);
buf.append(")");
} else
length.appendTo(buf);
buf.append(" - (");
start.appendTo(buf);
buf.append(" - 1)))");
}
@Override
public void indexOf(SQLBuffer buf, FilterValue str, FilterValue find,
FilterValue start) {
buf.append("(POSITION(");
find.appendTo(buf);
buf.append(" IN ");
if (start != null)
substring(buf, str, start, null);
else
str.appendTo(buf);
buf.append(")");
if (start != null) {
buf.append(" - 1 + ");
start.appendTo(buf);
}
buf.append(")");
}
@Override
public OpenJPAException newStoreException(String msg, SQLException[] causes,
Object failed) {
OpenJPAException ke = super.newStoreException(msg, causes, failed);
if (ke instanceof ReferentialIntegrityException
&& causes[0].getMessage().indexOf("Duplicate key value for") > -1) {
((ReferentialIntegrityException) ke).setIntegrityViolation
(ReferentialIntegrityException.IV_UNIQUE);
}
return ke;
}
}