| /* |
| * 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", |
| })); |
| |
| requiresSearchStringEscapeForLike = true; |
| 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; |
| } |
| } |