blob: 477332318abbec4d6a39cbb7124d3c04c49afe1d [file] [log] [blame]
/**************************************************************
*
* 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 util;
import com.sun.star.uno.Exception;
import java.io.PrintWriter ;
// access the implementations via names
import com.sun.star.uno.XInterface;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.sdbc.XConnection ;
import com.sun.star.sdbc.XResultSet ;
import com.sun.star.sdbc.XResultSetUpdate ;
import com.sun.star.sdbc.XStatement ;
import com.sun.star.sdbc.XRowUpdate ;
import com.sun.star.util.Date ;
import com.sun.star.uno.XNamingService ;
import com.sun.star.task.XInteractionHandler ;
import com.sun.star.sdb.XCompletedConnection ;
import com.sun.star.container.XEnumeration ;
import com.sun.star.container.XEnumerationAccess ;
import com.sun.star.io.XInputStream ;
import com.sun.star.io.XTextInputStream ;
import com.sun.star.io.XDataInputStream ;
import com.sun.star.container.XNameAccess ;
import com.sun.star.frame.XStorable;
import com.sun.star.sdb.XDocumentDataSource;
import com.sun.star.sdbc.XCloseable ;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* Provides useful methods for working with SOffice databases.
* Database creation, data transfering, outputting infromation.
*/
public class DBTools {
private XMultiServiceFactory xMSF = null ;
private XNamingService dbContext = null ;
private PrintWriter m_log = null;
//JDBC driver
public final static String TST_JDBC_DRIVER = "org.gjt.mm.mysql.Driver";
// constants for TestDB table column indexes
public final static int TST_STRING = 1 ;
public final static int TST_INT = 2 ;
public final static int TST_DOUBLE = 5 ;
public final static int TST_DATE = 6 ;
public final static int TST_BOOLEAN = 10 ;
public final static int TST_CHARACTER_STREAM = 11 ;
public final static int TST_BINARY_STREAM = 12 ;
// constants for TestDB columns names
public final static String TST_STRING_F = "_TEXT" ;
public final static String TST_INT_F = "_INT" ;
public final static String TST_DOUBLE_F = "_DOUBLE" ;
public final static String TST_DATE_F = "_DATE" ;
public final static String TST_BOOLEAN_F = "_BOOL" ;
public final static String TST_CHARACTER_STREAM_F = "_MEMO1" ;
public final static String TST_BINARY_STREAM_F = "_MEMO2" ;
/**
* Values for filling test table.
*/
public final static Object[][] TST_TABLE_VALUES = new Object[][] {
{"String1", new Integer(1), null, null, new Double(1.1),
new Date((short) 1,(short) 1, (short) 2001), null, null, null,
Boolean.TRUE, null, null},
{"String2", new Integer(2), null, null, new Double(1.2),
new Date((short) 2, (short) 1,(short) 2001), null, null, null,
Boolean.FALSE, null, null},
{null, null, null, null, null,
null, null, null, null,
null, null, null}
} ;
/**
* Array of lengths of streams for each row in of the
* <code>TST_TABLE_VALUES</code> constants.
*/
public final static int[] TST_STREAM_LENGTHS = {0, 0, 0} ;
/**
* It's just a structure with some useful methods for representing
* <code>com.sun.star.sdb.DataSource</code> service. All this
* service's properties are stored in appropriate class fields.
* Class also allows to construct its instances using service
* information, and create new service instance upon class
* fields.
* @see com.sun.star.sdb.DataSource
*/
public class DataSourceInfo {
/**
* Representation of <code>'Name'</code> property.
*/
public String Name = null ;
/**
* Representation of <code>'URL'</code> property.
*/
public String URL = null ;
/**
* Representation of <code>'Info'</code> property.
*/
public PropertyValue[] Info = null ;
/**
* Representation of <code>'User'</code> property.
*/
public String User = null ;
/**
* Representation of <code>'Password'</code> property.
*/
public String Password = null ;
/**
* Representation of <code>'IsPasswordRequired'</code> property.
*/
public Boolean IsPasswordRequired = null ;
/**
* Representation of <code>'SuppressVersionColumns'</code> property.
*/
public Boolean SuppressVersionColumns = null ;
/**
* Representation of <code>'IsReadOnly'</code> property.
*/
public Boolean IsReadOnly = null ;
/**
* Representation of <code>'TableFilter'</code> property.
*/
public String[] TableFilter = null ;
/**
* Representation of <code>'TableTypeFilter'</code> property.
*/
public String[] TableTypeFilter = null ;
/**
* Creates an empty instance.
*/
public DataSourceInfo()
{
}
/**
* Creates an instance laying upon specified DataSource.
* @param dataSource All source properties are copied into
* class fields.
*/
public DataSourceInfo(Object dataSource) {
XPropertySet xProps = (XPropertySet)
UnoRuntime.queryInterface(XPropertySet.class, dataSource) ;
try {
Name = (String)xProps.getPropertyValue("Name") ;
URL = (String)xProps.getPropertyValue("URL") ;
Info = (PropertyValue[])xProps.getPropertyValue("Info") ;
User = (String)xProps.getPropertyValue("User") ;
Password = (String)xProps.getPropertyValue("Password") ;
IsPasswordRequired = (Boolean)xProps.getPropertyValue("IsPasswordRequired") ;
SuppressVersionColumns = (Boolean)
xProps.getPropertyValue("SuppressVersionColumns") ;
IsReadOnly = (Boolean)xProps.getPropertyValue("IsReadOnly") ;
TableFilter = (String[])xProps.getPropertyValue("TableFilter") ;
TableTypeFilter = (String[])xProps.getPropertyValue("TableTypeFilter") ;
} catch (com.sun.star.beans.UnknownPropertyException e) {
System.err.println("util.DBTools.DataSourceInfo: Error retrieving property") ;
e.printStackTrace(System.err) ;
} catch (com.sun.star.lang.WrappedTargetException e) {
System.err.println("util.DBTools.DataSourceInfo: Error retrieving property") ;
e.printStackTrace(System.err) ;
}
}
/**
* Prints datasource info.
* @param out Stream to which information is printed.
*/
public void printInfo(PrintWriter out) {
out.println("Name = '" + Name + "'") ;
out.println(" URL = '" + URL + "'") ;
out.print(" Info = ") ;
if (Info == null) out.println("null") ;
else {
out.print("{") ;
for (int i = 0; i < Info.length; i++) {
out.print(Info[i].Name + " = '" + Info[i].Value + "'") ;
if (i + 1 < Info.length) out.print("; ") ;
}
out.println("}") ;
}
out.println(" User = '" + User + "'") ;
out.println(" Password = '" + Password + "'") ;
out.println(" IsPasswordRequired = '" + IsPasswordRequired + "'") ;
out.println(" SuppressVersionColumns = '" + SuppressVersionColumns + "'") ;
out.println(" IsReadOnly = '" + IsReadOnly + "'") ;
out.print(" TableFilter = ") ;
if (TableFilter == null) out.println("null") ;
else {
out.print("{") ;
for (int i = 0; i < TableFilter.length; i++) {
out.print("'" + TableFilter[i] + "'") ;
if (i+1 < TableFilter.length) out.print("; ");
}
out.println("}") ;
}
out.print(" TableTypeFilter = ") ;
if (TableTypeFilter == null) out.println("null") ;
else {
out.print("{") ;
for (int i = 0; i < TableTypeFilter.length; i++) {
out.print("'" + TableTypeFilter[i] + "'") ;
if (i+1 < TableTypeFilter.length) out.print("; ");
}
out.println("}") ;
}
}
/**
* Creates new <code>com.sun.star.sdb.DataSource</code> service
* instance and copies all fields (which are not null) to
* appropriate service properties.
* @return <code>com.sun.star.sdb.DataSource</code> service.
*/
public Object getDataSourceService() throws Exception
{
Object src = src = xMSF.createInstance("com.sun.star.sdb.DataSource") ;
XPropertySet props = (XPropertySet) UnoRuntime.queryInterface
(XPropertySet.class, src) ;
if (Name != null) props.setPropertyValue("Name", Name) ;
if (URL != null) props.setPropertyValue("URL", URL) ;
if (Info != null) props.setPropertyValue("Info", Info) ;
if (User != null) props.setPropertyValue("User", User) ;
if (Password != null) props.setPropertyValue("Password", Password) ;
if (IsPasswordRequired != null) props.setPropertyValue("IsPasswordRequired", IsPasswordRequired) ;
if (SuppressVersionColumns != null) props.setPropertyValue("SuppressVersionColumns", SuppressVersionColumns) ;
if (IsReadOnly != null) props.setPropertyValue("IsReadOnly", IsReadOnly) ;
if (TableFilter != null) props.setPropertyValue("TableFilter", TableFilter) ;
if (TableTypeFilter != null) props.setPropertyValue("TableTypeFilter", TableTypeFilter) ;
return src ;
}
}
/**
* Creates class instance.
* @param xMSF <code>XMultiServiceFactory</code>.
*/
public DBTools(XMultiServiceFactory xMSF, PrintWriter _logger )
{
this.xMSF = xMSF ;
this.m_log = _logger;
try {
Object cont = xMSF.createInstance("com.sun.star.sdb.DatabaseContext") ;
dbContext = (XNamingService) UnoRuntime.queryInterface
(XNamingService.class, cont) ;
} catch (com.sun.star.uno.Exception e) {}
}
/**
* Returns new instance of <code>DataSourceInfo</code> class.
*/
public DataSourceInfo newDataSourceInfo() { return new DataSourceInfo() ;}
/**
* Returns new instance of <code>DataSourceInfo</code> class.
*/
public DataSourceInfo newDataSourceInfo(Object dataSource) {
return new DataSourceInfo(dataSource);
}
/**
* Registers the datasource on the specified name in
* <code>DatabaseContext</code> service.
* @param name Name which dataSource will have in global context.
* @param dataSource <code>DataSource</code> object which is to
* be registered.
*/
public void registerDB(String name, Object dataSource)
throws com.sun.star.uno.Exception {
dbContext.registerObject(name, dataSource) ;
}
/**
* First tries to revoke the datasource with the specified
* name and then registers a new one.
* @param name Name which dataSource will have in global context.
* @param dataSource <code>DataSource</code> object which is to
* be registered.
*/
public void reRegisterDB(String name, Object dataSource)
throws com.sun.star.uno.Exception {
try {
revokeDB(name) ;
} catch (com.sun.star.uno.Exception e) {}
XDocumentDataSource xDDS = (XDocumentDataSource)
UnoRuntime.queryInterface(XDocumentDataSource.class, dataSource);
XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class,
xDDS.getDatabaseDocument());
String aFile = utils.getOfficeTemp(xMSF) + name + ".odb";
store.storeAsURL(aFile, new PropertyValue[] { });
registerDB(name, dataSource) ;
}
/**
* RESERVED. Not used.
*/
public XConnection connectToTextDB(String contextName,
String dbDir, String fileExtension)
throws com.sun.star.uno.Exception {
try {
XInterface newSource = (XInterface) xMSF.createInstance
("com.sun.star.sdb.DataSource") ;
XPropertySet xSrcProp = (XPropertySet)
UnoRuntime.queryInterface(XPropertySet.class, newSource);
xSrcProp.setPropertyValue("URL", "sdbc:text:" + dirToUrl(dbDir));
PropertyValue extParam = new PropertyValue() ;
extParam.Name = "EXT" ;
extParam.Value = fileExtension ;
xSrcProp.setPropertyValue("Info", new PropertyValue[] {extParam}) ;
dbContext.registerObject(contextName, newSource) ;
Object handler = xMSF.createInstance("com.sun.star.sdb.InteractionHandler");
XInteractionHandler xHandler = (XInteractionHandler)
UnoRuntime.queryInterface(XInteractionHandler.class, handler) ;
XCompletedConnection xSrcCon = (XCompletedConnection)
UnoRuntime.queryInterface(XCompletedConnection.class, newSource) ;
XConnection con = xSrcCon.connectWithCompletion(xHandler) ;
return con ;
} finally {
try {
dbContext.revokeObject(contextName) ;
} catch (Exception e) {}
}
}
/**
* Registers DBase database (directory with DBF files) in the
* global DB context, then connects to it.
* @param contextName Name under which DB will be registered.
* @param dbDir The directory with DBF tables.
* @return Connection to the DB.
*/
public XConnection connectToDBase(String contextName,
String dbDir)
throws com.sun.star.uno.Exception {
try {
XInterface newSource = (XInterface) xMSF.createInstance
("com.sun.star.sdb.DataSource") ;
XPropertySet xSrcProp = (XPropertySet)
UnoRuntime.queryInterface(XPropertySet.class, newSource);
xSrcProp.setPropertyValue("URL", "sdbc:dbase:" + dirToUrl(dbDir));
dbContext.registerObject(contextName, newSource) ;
XConnection con = connectToSource(newSource) ;
return con ;
} catch(com.sun.star.uno.Exception e) {
try {
dbContext.revokeObject(contextName) ;
} catch (Exception ex) {}
throw e ;
}
}
/**
* Performs connection to DataSource specified.
* @param dbSource <code>com.sun.star.sdb.DataSource</code> service
* specified data source which must be already registered in the
* <code>DatabaseContext</code> service.
* @return Connection to the data source.
*/
public XConnection connectToSource(Object dbSource)
throws com.sun.star.uno.Exception {
Object handler = xMSF.createInstance("com.sun.star.sdb.InteractionHandler");
XInteractionHandler xHandler = (XInteractionHandler)
UnoRuntime.queryInterface(XInteractionHandler.class, handler) ;
XCompletedConnection xSrcCon = (XCompletedConnection)
UnoRuntime.queryInterface(XCompletedConnection.class, dbSource) ;
return xSrcCon.connectWithCompletion(xHandler) ;
}
/**
* Registers Test data source in the <code>DatabaseContext</code> service.
* This source always has name <code>'APITestDatabase'</code> and it
* is registered in subdirectory <code>TestDB</code> of directory
* <code>docPath</code> which is supposed to be a directory with test
* documents, but can be any other (it must have subdirectory with DBF
* tables). If such data source doesn't exists or exists with
* different URL it is recreated and reregistered.
* @param docPath Path to database <code>TestDB</code> directory.
* @return <code>com.sun.star.sdb.DataSource</code> service
* implementation which represents TestDB.
*/
public Object registerTestDB(String docPath)
throws com.sun.star.uno.Exception {
String testURL = null ;
if (docPath.endsWith("/") || docPath.endsWith("\\"))
testURL = dirToUrl(docPath + "TestDB") ;
else
testURL = dirToUrl(docPath + "/" + "TestDB") ;
testURL = "sdbc:dbase:" + testURL ;
String existURL = null ;
XNameAccess na = (XNameAccess) UnoRuntime.queryInterface
(XNameAccess.class, dbContext) ;
Object src = null ;
if (na.hasByName("APITestDatabase")) {
src = dbContext.getRegisteredObject("APITestDatabase") ;
XPropertySet srcPs = (XPropertySet) UnoRuntime.queryInterface
(XPropertySet.class, src) ;
existURL = (String) srcPs.getPropertyValue("URL") ;
}
if (src == null || !testURL.equals(existURL)) {
// test data source must be reregistered.
DataSourceInfo info = new DataSourceInfo() ;
info.URL = testURL ;
src = info.getDataSourceService() ;
reRegisterDB("APITestDatabase", src) ;
src = dbContext.getRegisteredObject("APITestDatabase") ;
}
return src ;
}
/**
* Connects to <code>DataSource</code> specially created for testing.
* This source always has name <code>'APITestDatabase'</code> and it
* is registered in subdirectory <code>TestDB</code> of directory
* <code>docPath</code> which is supposed to be a directory with test
* documents, but can be any other (it must have subdirectory with DBF
* tables). If such data source doesn't exists or exists with
* different URL it is recreated and reregistered. Finally connection
* performed.
* @param docPath Path to database <code>TestDB</code> directory.
* @return Connection to test database.
*/
public XConnection connectToTestDB(String docPath)
throws com.sun.star.uno.Exception {
return connectToSource(registerTestDB(docPath)) ;
}
/**
* Empties the table in the specified source.
* @param con Connection to the DataSource where appropriate
* table exists.
* @param table The name of the table where all rows will be deleted.
* @return Number of rows deleted.
*/
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Currently doesn't work because of bugs 85509, 85510
public int deleteAllRows(XConnection con, String table)
throws com.sun.star.sdbc.SQLException {
XStatement stat = con.createStatement() ;
XResultSet set = stat.executeQuery("SELECT * FROM " + table) ;
XResultSetUpdate updt = (XResultSetUpdate) UnoRuntime.queryInterface
(XResultSetUpdate.class, set) ;
int count = 0 ;
set.last() ;
int rowNum = set.getRow() ;
set.first() ;
for (int i = 0; i < rowNum; i++) {
updt.deleteRow() ;
set.next() ;
count ++ ;
}
XCloseable xClose = (XCloseable) UnoRuntime.queryInterface
(XCloseable.class, set) ;
xClose.close() ;
return count ;
}
/**
* Inserts row into test table of the specified connection.
* Test table has some predefined format which includes as much
* field types as possible. For every column type constants
* {@link #TST_STRING TST_STRING}, {@link #TST_INT TST_INT}, etc.
* are declared for column index fast find.
* @param con Connection to data source where test table exists.
* @param table Test table name.
* @param values Values to be inserted into test table. Values of
* this array inserted into appropriate fields depending on their
* types. So <code>String</code> value of the array is inserted
* into the field of <code>CHARACTER</code> type, etc.
* @param streamLength Is optional. It is used only if in values
* list <code>XCharacterInputStream</code> or <code>XBinaryInputStream
* </code> types specified. In this case the parameter specifies
* the length of the stream for inserting.
*/
public void addRowToTestTable(XConnection con, String table, Object[] values,
int streamLength)
throws com.sun.star.sdbc.SQLException {
XStatement stat = con.createStatement() ;
XResultSet set = stat.executeQuery("SELECT * FROM " + table) ;
XResultSetUpdate updt = (XResultSetUpdate) UnoRuntime.queryInterface
(XResultSetUpdate.class, set) ;
XRowUpdate rowUpdt = (XRowUpdate) UnoRuntime.queryInterface
(XRowUpdate.class, set) ;
updt.moveToInsertRow() ;
for (int i = 0; i < values.length; i++) {
if (values[i] instanceof String) {
rowUpdt.updateString(TST_STRING, (String) values[i]) ;
} else
if (values[i] instanceof Integer) {
rowUpdt.updateInt(TST_INT, ((Integer) values[i]).intValue()) ;
} else
if (values[i] instanceof Double) {
rowUpdt.updateDouble(TST_DOUBLE, ((Double) values[i]).doubleValue()) ;
} else
if (values[i] instanceof Date) {
rowUpdt.updateDate(TST_DATE, (Date) values[i]) ;
} else
if (values[i] instanceof Boolean) {
rowUpdt.updateBoolean(TST_BOOLEAN, ((Boolean) values[i]).booleanValue()) ;
} else
if (values[i] instanceof XTextInputStream) {
rowUpdt.updateCharacterStream(TST_CHARACTER_STREAM, (XInputStream) values[i],
streamLength) ;
} else
if (values[i] instanceof XDataInputStream) {
rowUpdt.updateBinaryStream(TST_BINARY_STREAM, (XInputStream) values[i],
streamLength) ;
}
}
updt.insertRow() ;
XCloseable xClose = (XCloseable) UnoRuntime.queryInterface
(XCloseable.class, set) ;
xClose.close() ;
}
/**
* Initializes test table specified of the connection specified.
* Deletes all record from table, and then inserts data from
* <code>TST_TABLE_VALUES</code> constant array. <p>
* Test table has some predefined format which includes as much
* field types as possible. For every column type constants
* {@link #TST_STRING TST_STRING}, {@link #TST_INT TST_INT}, etc.
* are declared for column index fast find.
* @param con Connection to data source where test table exists.
* @param table Test table name.
*/
public void initializeTestTable(XConnection con, String table)
throws com.sun.star.sdbc.SQLException {
deleteAllRows(con, table) ;
for (int i = 0; i < TST_TABLE_VALUES.length; i++) {
addRowToTestTable(con, table, TST_TABLE_VALUES[i], TST_STREAM_LENGTHS[i]) ;
}
}
/**
* Prints full info about currently registered DataSource's.
*/
public void printRegisteredDatabasesInfo(PrintWriter out) {
XEnumerationAccess dbContEA = (XEnumerationAccess)
UnoRuntime.queryInterface(XEnumerationAccess.class, dbContext) ;
XEnumeration xEnum = dbContEA.createEnumeration() ;
out.println("DatabaseContext registered DataSource's :") ;
while (xEnum.hasMoreElements()) {
try {
DataSourceInfo inf = new DataSourceInfo(xEnum.nextElement()) ;
inf.printInfo(out) ;
} catch (com.sun.star.container.NoSuchElementException e) {}
catch (com.sun.star.lang.WrappedTargetException e) {}
}
}
/**
* Convert system pathname to SOffice URL string
* (for example 'C:\Temp\DBDir\' -> 'file:///C|/Temp/DBDir/').
* (for example '\\server\Temp\DBDir\' -> 'file://server/Temp/DBDir/').
* Already converted string retured unchanged.
*/
public static String dirToUrl(String dir) {
String retVal = null;
if (dir.startsWith("file:/")) retVal = dir;
else {
retVal = dir.replace(':', '|').replace('\\', '/');
if (dir.startsWith("\\\\")) {
retVal = "file:" + retVal;
}
else retVal = "file:///" + retVal ;
}
return retVal;
}
/**
* Revokes datasource from global DB context.
* @param name DataSource name to be revoked.
*/
public void revokeDB(String name) throws com.sun.star.uno.Exception
{
dbContext.revokeObject(name) ;
}
/**
* Initializes test table specified of the connection specified
* using JDBC driver. Drops table with the name <code>tbl_name</code>,
* creates new table with this name and then inserts data from
* <code>TST_TABLE_VALUES</code> constant array. <p>
* Test table has some predefined format which includes as much
* field types as possible. For every column type constants
* {@link #TST_STRING TST_STRING}, {@link #TST_INT TST_INT}, etc.
* are declared for column index fast find.
* @param tbl_name Test table name.
*/
public void initTestTableUsingJDBC(String tbl_name, DataSourceInfo dsi)
throws java.sql.SQLException,
ClassNotFoundException {
//register jdbc driver
if ( dsi.Info[0].Name.equals("JavaDriverClass") ) {
Class.forName((String)dsi.Info[0].Value);
} else {
Class.forName(TST_JDBC_DRIVER);
}
//getting connection
Connection connection = null;
connection = DriverManager.getConnection(
dsi.URL, dsi.User, dsi.Password);
Statement statement = connection.createStatement();
//drop table
dropMySQLTable(statement, tbl_name);
//create table
createMySQLTable(statement, tbl_name);
//insert some content
insertContentMySQLTable(statement, tbl_name);
}
/**
* Inserts data from <code>TST_TABLE_VALUES</code> constant array
* to test table <code>tbl_name</code>.
* @param statement object used for executing a static SQL
* statement and obtaining the results produced by it.
* @param tbl_name Test table name.
*/
protected void insertContentMySQLTable(Statement statement, String tbl_name)
throws java.sql.SQLException {
for(int i = 0; i < DBTools.TST_TABLE_VALUES.length; i++) {
String query = "insert into " + tbl_name + " values (";
int j = 0;
while(j < DBTools.TST_TABLE_VALUES[i].length) {
if (j > 0) {
query += ", ";
}
Object value = DBTools.TST_TABLE_VALUES[i][j];
if (value instanceof String ||
value instanceof Date) {
query += "'";
}
if (value instanceof Date) {
Date date = (Date)value;
query += date.Year + "-" + date.Month +
"-" + date.Day;
} else if (value instanceof Boolean) {
query += (((Boolean)value).booleanValue())
? "1" : "0";
} else {
query += value;
}
if (value instanceof String ||
value instanceof Date) {
query += "'";
}
j++;
}
query += ")";
statement.executeUpdate(query);
}
}
/**
* Creates test table specified.
* Test table has some predefined format which includes as much
* field types as possible. For every column type constants
* {@link #TST_STRING TST_STRING}, {@link #TST_INT TST_INT}, etc.
* are declared for column index fast find.
* @param statement object used for executing a static SQL
* statement and obtaining the results produced by it.
* @param tbl_name Test table name.
*/
protected void createMySQLTable(Statement statement, String tbl_name)
throws java.sql.SQLException {
final String empty_col_name = "Column";
int c = 0;
String query = "create table " + tbl_name + " (";
for (int i = 0; i < TST_TABLE_VALUES[0].length; i++) {
if (i > 0) query += ",";
switch(i + 1) {
case TST_BINARY_STREAM:
query += TST_BINARY_STREAM_F + " BLOB";
break;
case TST_BOOLEAN:
query += TST_BOOLEAN_F + " TINYINT";
break;
case TST_CHARACTER_STREAM:
query += TST_CHARACTER_STREAM_F + " TEXT";
break;
case TST_DATE:
query += TST_DATE_F + " DATE";
break;
case TST_DOUBLE:
query += TST_DOUBLE_F + " DOUBLE";
break;
case TST_INT:
query += TST_INT_F + " INT";
break;
case TST_STRING:
query += TST_STRING_F + " TEXT";
break;
default: query += empty_col_name + (c++) + " INT";
if (c == 1) {
query += " NOT NULL AUTO_INCREMENT";
}
}
}
query += ", PRIMARY KEY (" + empty_col_name + "0)";
query += ")";
statement.execute(query);
}
/**
* Drops table.
* @param statement object used for executing a static SQL
* statement and obtaining the results produced by it.
* @param tbl_name Test table name.
*/
protected void dropMySQLTable(Statement statement, String tbl_name)
throws java.sql.SQLException {
statement.executeUpdate("drop table if exists " + tbl_name);
}
}