1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.database.internal.core;
import java.io.ByteArrayInputStream;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
import org.eclipse.osee.framework.core.exception.OseeDataStoreException;
import org.eclipse.osee.framework.core.exception.OseeExceptions;
import org.eclipse.osee.framework.database.core.SQL3DataType;
import org.eclipse.osee.framework.database.internal.Activator;
import org.eclipse.osee.framework.logging.OseeLog;
/**
* @author Roberto E. Escobar
*/
public final class StatementUtil {
private StatementUtil() {
// Utility class
}
public static <O extends Object> String getBatchErrorMessage(List<O[]> dataList) {
StringBuilder details = new StringBuilder(dataList.size() * dataList.get(0).length * 20);
details.append("[ DATA OBJECT: \n");
for (Object[] data : dataList) {
for (int i = 0; i < data.length; i++) {
details.append(i);
details.append(": ");
Object dataValue = data[i];
if (dataValue != null) {
details.append(dataValue.getClass().getName());
details.append(":");
String value = dataValue.toString();
if (value.length() > 35) {
details.append(value.substring(0, 35));
} else {
details.append(value);
}
details.append("\n");
} else {
details.append("NULL\n");
}
}
details.append("---------\n");
}
details.append("]\n");
return details.toString();
}
public static int calculateBatchUpdateResults(int[] updates) {
int returnCount = 0;
for (int update : updates) {
if (update >= 0) {
returnCount += update;
} else if (Statement.EXECUTE_FAILED == update) {
OseeLog.log(Activator.class, Level.SEVERE, "sql execute failed.");
} else if (Statement.SUCCESS_NO_INFO == update) {
returnCount++;
}
}
return returnCount;
}
public static void close(PreparedStatement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
OseeLog.log(Activator.class, Level.WARNING, "Unable to close database statement: ", ex);
}
}
}
public static <O extends Object> void populateValuesForPreparedStatement(PreparedStatement preparedStatement, O... data) throws OseeCoreException {
try {
int preparedIndex = 0;
for (Object dataValue : data) {
preparedIndex++;
if (dataValue instanceof String) {
int length = ((String) dataValue).length();
if (length > 4000) {
throw new OseeDataStoreException("SQL data value length must be <= 4000 not %d\nValue: %s", length,
dataValue);
}
}
if (dataValue == null) {
throw new OseeDataStoreException(
"instead of passing null for an query parameter, pass the corresponding SQL3DataType");
} else if (dataValue instanceof SQL3DataType) {
int dataTypeNumber = ((SQL3DataType) dataValue).getSQLTypeNumber();
if (dataTypeNumber == java.sql.Types.BLOB) {
// TODO Need to check this - for PostgreSql, setNull for BLOB with the new JDBC driver gives the error "column
// "content" is of type bytea but expression is of type oid"
preparedStatement.setBytes(preparedIndex, null);
} else {
preparedStatement.setNull(preparedIndex, dataTypeNumber);
}
} else if (dataValue instanceof ByteArrayInputStream) {
preparedStatement.setBinaryStream(preparedIndex, (ByteArrayInputStream) dataValue,
((ByteArrayInputStream) dataValue).available());
} else {
preparedStatement.setObject(preparedIndex, dataValue);
}
}
} catch (SQLException ex) {
OseeExceptions.wrapAndThrow(ex);
}
}
}
|