📄 db.java
字号:
for (int i = 0; i < s_conCacheSize; i++)
{
cons[i] = s_cc.getConnection (true, trxLevel); // auto commit
if (cons[i] == null)
log.warning("Connection is NULL"); // don't use log
}
}
catch (Exception e)
{
log.severe(e.getMessage());
}
return cons;
} // createConnections
/**
* Get Database Driver.
* Access to database specific functionality.
* @return Compiere Database Driver
*/
public static CompiereDatabase getDatabase()
{
if (s_cc != null)
return s_cc.getDatabase();
log.severe("No Database");
return null;
} // getDatabase
/**
* Do we have an Oracle DB ?
* @return true if connected to Oracle
*/
public static boolean isOracle()
{
if (s_cc != null)
return s_cc.isOracle();
log.severe("No Database");
return false;
} // isOracle
/**
* Do we have a Sybase DB ?
* @return true if connected to Sybase
*/
public static boolean isSybase()
{
if (s_cc != null)
return s_cc.isSybase();
log.severe("No Database");
return false;
} // isSybase
/**
* Get Database Info
* @return info
*/
public static String getDatabaseInfo()
{
if (s_cc != null)
return s_cc.getDBInfo();
return "No Database";
} // getDatabaseInfo
/**************************************************************************
* Check database Version with Code version
* @param ctx context
* @return true if Database version (date) is the same
*/
public static boolean isDatabaseOK (Properties ctx)
{
// Check Version
String version = "?";
String sql = "SELECT Version FROM AD_System";
try
{
PreparedStatement pstmt = prepareStatement(sql, null);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
version = rs.getString(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, "Problem with AD_System Table - Run system.sql script - " + e.toString());
return false;
}
log.info("DB_Version=" + version);
// Identical DB version
if (Compiere.DB_VERSION.equals(version))
return true;
String AD_Message = "DatabaseVersionError";
String title = org.compiere.Compiere.getName() + " " + Msg.getMsg(ctx, AD_Message, true);
// Code assumes Database version {0}, but Database has Version {1}.
String msg = Msg.getMsg(ctx, AD_Message); // complete message
msg = MessageFormat.format(msg, new Object[] {Compiere.DB_VERSION, version});
Object[] options = { UIManager.get("OptionPane.noButtonText"), "Migrate" };
int no = JOptionPane.showOptionDialog (null, msg,
title, JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE,
UIManager.getIcon("OptionPane.errorIcon"), options, options[0]);
if (no == 1)
{
JOptionPane.showMessageDialog (null,
"Start RUN_Migrate (in utils)\nSee: http://www.compiere.com/maintain",
title, JOptionPane.INFORMATION_MESSAGE);
Env.exitEnv(1);
}
return false;
} // isDatabaseOK
/**************************************************************************
* Close Target
*/
public static void closeTarget()
{
boolean closed = false;
// RO connection
if (s_connections != null)
{
for (int i = 0; i < s_conCacheSize; i++)
{
try
{
if (s_connections[i] != null)
{
closed = true;
s_connections[i].close();
}
}
catch (SQLException e)
{
log.warning("#" + i + " - " + e.getMessage());
}
s_connections[i] = null;
}
}
s_connections = null;
// RW connection
try
{
if (s_connectionRW != null)
{
closed = true;
s_connectionRW.close();
}
}
catch (SQLException e)
{
log.log(Level.SEVERE, "R/W", e);
}
s_connectionRW = null;
// CConnection
if (s_cc != null)
{
closed = true;
s_cc.setDataSource(null);
}
s_cc = null;
if (closed)
log.fine("closed");
} // closeTarget
/**************************************************************************
* Prepare Forward Read Only Call
* @param RO_SQL sql (RO)
* @return Callable Statement
*/
public static CallableStatement prepareCall(String RO_SQL)
{
if (RO_SQL == null || RO_SQL.length() == 0)
throw new IllegalArgumentException("Required parameter missing - " + RO_SQL);
//
String sql = getDatabase().convertStatement(RO_SQL);
try
{
return getConnectionRO().prepareCall
(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
// throw new DBException(e);
}
return null;
} // prepareCall
/**************************************************************************
* Prepare Read Only Statement
* @param RO_SQL sql (RO)
* @return Prepared Statement
* @deprecated
*/
public static CPreparedStatement prepareStatement (String RO_SQL)
{
return prepareStatement(RO_SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, null);
} // prepareStatement
/**
* Prepare Read Only Statement
* @param RO_SQL sql (RO)
* @param trxName transaction
* @return Prepared Statement
*/
public static CPreparedStatement prepareStatement (String RO_SQL, String trxName)
{
return prepareStatement(RO_SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, trxName);
} // prepareStatement
/**
* Prepare Statement.
* @param sql sql statement
* @param resultSetType - ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE
* @param resultSetConcurrency - ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
* @return Prepared Statement r/o or r/w depending on concur
* @deprecated
*/
public static CPreparedStatement prepareStatement (String sql,
int resultSetType, int resultSetConcurrency)
{
return prepareStatement(sql, resultSetType, resultSetConcurrency, null);
} // prepareStatement
/**
* Prepare Statement.
* @param sql sql statement
* @param resultSetType - ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE
* @param resultSetConcurrency - ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
* @param trxName transaction name
* @return Prepared Statement r/o or r/w depending on concur
*/
public static CPreparedStatement prepareStatement(String sql,
int resultSetType, int resultSetConcurrency, String trxName)
{
if (sql == null || sql.length() == 0)
throw new IllegalArgumentException("DB.prepareStatement - No SQL");
//
return new CPreparedStatement(resultSetType, resultSetConcurrency, sql, trxName);
} // prepareStatement
/**
* Create Read Only Statement
* @return Statement
*/
public static Statement createStatement()
{
return createStatement (ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, null);
} // createStatement
/**
* Create Statement.
* @param resultSetType - ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.TYPE_SCROLL_SENSITIVE
* @param resultSetConcurrency - ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE
* @param trxName transaction name
* @return Statement - either r/w ir r/o depending on concur
*/
public static Statement createStatement(int resultSetType, int resultSetConcurrency, String trxName)
{
return new CStatement(resultSetType, resultSetConcurrency, trxName);
} // createStatement
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @return number of rows updated or -1 if error
* @deprecated
*/
public static int executeUpdate (String sql)
{
return executeUpdate(sql, null, false, null);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param trxName optional transaction name
* @return number of rows updated or -1 if error
*/
public static int executeUpdate (String sql, String trxName)
{
return executeUpdate(sql, null, false, trxName);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param ignoreError if true, no execution error is reported
* @return number of rows updated or -1 if error
* @deprecated
*/
public static int executeUpdate (String sql, boolean ignoreError)
{
return executeUpdate (sql, null, ignoreError, null);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param ignoreError if true, no execution error is reported
* @return number of rows updated or -1 if error
*/
public static int executeUpdate (String sql, boolean ignoreError, String trxName)
{
return executeUpdate (sql, null, ignoreError, trxName);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param param int param
* @param trxName trx
* @return number of rows updated or -1 if error
*/
public static int executeUpdate (String sql, int param, String trxName)
{
return executeUpdate (sql, new Object[]{new Integer(param)}, false, trxName);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param param int parameter
* @param ignoreError if true, no execution error is reported
* @return number of rows updated or -1 if error
*/
public static int executeUpdate (String sql, int param, boolean ignoreError, String trxName)
{
return executeUpdate (sql, new Object[]{new Integer(param)}, ignoreError, trxName);
} // executeUpdate
/**
* Execute Update.
* saves "DBExecuteError" in Log
* @param sql sql
* @param ignoreError if true, no execution error is reported
* @param trxName optional transaction name
* @return number of rows updated or -1 if error
*/
public static int executeUpdate (String sql, Object[] params, boolean ignoreError, String trxName)
{
if (sql == null || sql.length() == 0)
throw new IllegalArgumentException("Required parameter missing - " + sql);
//
int no = -1;
CPreparedStatement cs = new CPreparedStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE, sql, trxName); // converted in call
try
{
// Set Parameter
if (params != null)
{
for (int i = 0; i < params.length; i++)
{
Object param = params[i];
if (param instanceof String)
cs.setString(i+1, (String)param);
else if (param instanceof Integer)
cs.setInt(i+1, ((Integer)param).intValue());
else if (param instanceof BigDecimal)
cs.setBigDecimal(i+1, (BigDecimal)param);
else if (param instanceof Timestamp)
cs.setTimestamp(i+1, (Timestamp)param);
}
}
//
no = cs.executeUpdate();
// No Transaction - Commit
if (trxName == null)
{
cs.commit(); // Local commit
// Connection conn = cs.getConnection();
// if (conn != null && !conn.getAutoCommit()) // is null for remote
// conn.commit();
}
}
catch (SQLException e)
{
if (ignoreError)
log.log(Level.SEVERE, cs.getSql() + " [" + trxName + "] - " + e.getMessage());
else
{
log.log(Level.SEVERE, cs.getSql() + " [" + trxName + "]", e);
log.saveError ("DBExecuteError", e);
}
// throw new DBException(e);
}
finally
{
// Always close cursor
try
{
cs.close();
}
catch (SQLException e2)
{
log.log(Level.SEVERE, "Cannot close statement");
}
}
return no;
} // executeUpdate
/**
* Execute multiple Update statements.
* saves (last) "DBExecuteError" in Log
* @param sql multiple sql statements separated by "; " SQLSTATEMENT_SEPARATOR
* @param ignoreError if true, no execution error is reported
* @param trxName optional transaction name
* @return number of rows updated or -1 if error
*/
public static int executeUpdateMultiple (String sql, boolean ignoreError, String trxName)
{
if (sql == null || sql.length() == 0)
throw new IllegalArgumentException("Required parameter missing - " + sql);
int index = sql.indexOf(SQLSTATEMENT_SEPARATOR);
if (index == -1)
return executeUpdate(sql, null, ignoreError, trxName);
int no = 0;
//
String statements[] = sql.split(SQLSTATEMENT_SEPARATOR);
for (int i = 0; i < statements.length; i++)
{
log.fine(statements[i]);
no += executeUpdate(statements[i], null, ignoreError, trxName);
}
return no;
} // executeUpdareMultiple
/**
* Execute Update and throw exception.
* @param SQL sql
* @return number of rows updated or -1 if error
* @throws SQLException
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -