[ 1801842 ] DB connection fix & improvements for concurrent threads.
This commit is contained in:
parent
24bb00b332
commit
0c22a4243a
|
@ -287,7 +287,7 @@ public abstract class AbstractElementHandler implements ElementHandler {
|
||||||
fileTarget = new FileInputStream(filePath);
|
fileTarget = new FileInputStream(filePath);
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException e ) {
|
catch (FileNotFoundException e ) {
|
||||||
System.out.println("Can't find file ");
|
System.out.println("File not found: " + filePath);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -308,7 +308,7 @@ public abstract class AbstractElementHandler implements ElementHandler {
|
||||||
fileTarget = new FileOutputStream(filePath);
|
fileTarget = new FileOutputStream(filePath);
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException e ) {
|
catch (FileNotFoundException e ) {
|
||||||
System.out.println("Can't find file ");
|
System.out.println("File not found: " + filePath);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.pipo.exception.DatabaseAccessException;
|
||||||
import org.compiere.util.CLogger;
|
import org.compiere.util.CLogger;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
|
||||||
|
@ -66,6 +67,7 @@ public class IDFinder {
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.info ("get_ID:"+e);
|
log.info ("get_ID:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -113,7 +115,8 @@ public class IDFinder {
|
||||||
pstmt = null;
|
pstmt = null;
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.info ("get_ID:"+e);
|
log.info ("get_IDWithColumn:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -154,6 +157,7 @@ public class IDFinder {
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.info ("get_IDWithMaster:"+e);
|
log.info ("get_IDWithMaster:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -196,6 +200,7 @@ public class IDFinder {
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.info ("get_IDWithMasterAndColumn:"+e);
|
log.info ("get_IDWithMasterAndColumn:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -232,6 +237,7 @@ public class IDFinder {
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.info ("get_IDWithMasterID:"+e);
|
log.info ("get_IDWithMasterID:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -269,7 +275,8 @@ public class IDFinder {
|
||||||
pstmt = null;
|
pstmt = null;
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
log.log(Level.SEVERE, "getID:"+e);
|
log.log(Level.SEVERE, "getIDbyName:"+e);
|
||||||
|
throw new DatabaseAccessException(e);
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package org.adempiere.pipo.handler;
|
package org.adempiere.pipo.handler;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.sql.Connection;
|
||||||
import java.sql.DatabaseMetaData;
|
import java.sql.DatabaseMetaData;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
@ -36,6 +37,7 @@ import org.compiere.model.X_AD_Column;
|
||||||
import org.compiere.model.X_AD_Element;
|
import org.compiere.model.X_AD_Element;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Trx;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import org.xml.sax.helpers.AttributesImpl;
|
import org.xml.sax.helpers.AttributesImpl;
|
||||||
|
@ -219,9 +221,9 @@ public class ColumnElementHandler extends AbstractElementHandler {
|
||||||
recreateColumn = false;
|
recreateColumn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tableName.equals("A_Depreciation") && columnName.equals("Processed")) {
|
/*if (tableName.equals("A_Depreciation") && columnName.equals("Processed")) {
|
||||||
System.out.println("A_Depreciation.Processed: " + recreateColumn);
|
System.out.println("A_Depreciation.Processed: " + recreateColumn);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (m_Column.save(getTrxName(ctx)) == true) {
|
if (m_Column.save(getTrxName(ctx)) == true) {
|
||||||
record_log(ctx, 1, m_Column.getName(), "Column", m_Column
|
record_log(ctx, 1, m_Column.getName(), "Column", m_Column
|
||||||
|
@ -281,9 +283,15 @@ public class ColumnElementHandler extends AbstractElementHandler {
|
||||||
String sql = null;
|
String sql = null;
|
||||||
ResultSet rst = null;
|
ResultSet rst = null;
|
||||||
ResultSet rsc = null;
|
ResultSet rsc = null;
|
||||||
|
Connection conn = null;
|
||||||
|
Trx trx = Trx.get(getTrxName(ctx), true);
|
||||||
|
if (!trx.commit())
|
||||||
|
return 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Find Column in Database
|
// Find Column in Database
|
||||||
DatabaseMetaData md = DB.getConnectionRO().getMetaData();
|
conn = trx.getConnection();
|
||||||
|
DatabaseMetaData md = conn.getMetaData();
|
||||||
String catalog = DB.getDatabase().getCatalog();
|
String catalog = DB.getDatabase().getCatalog();
|
||||||
String schema = DB.getDatabase().getSchema();
|
String schema = DB.getDatabase().getSchema();
|
||||||
String tableName = table.getTableName();
|
String tableName = table.getTableName();
|
||||||
|
@ -327,14 +335,16 @@ public class ColumnElementHandler extends AbstractElementHandler {
|
||||||
log.info(sql);
|
log.info(sql);
|
||||||
|
|
||||||
if (sql.indexOf(DB.SQLSTATEMENT_SEPARATOR) == -1) {
|
if (sql.indexOf(DB.SQLSTATEMENT_SEPARATOR) == -1) {
|
||||||
no = DB.executeUpdate(sql, false, getTrxName(ctx));
|
System.out.println(sql);
|
||||||
|
no = DB.executeUpdate(sql, false, trx.getTrxName());
|
||||||
if (no == -1)
|
if (no == -1)
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
String statements[] = sql.split(DB.SQLSTATEMENT_SEPARATOR);
|
String statements[] = sql.split(DB.SQLSTATEMENT_SEPARATOR);
|
||||||
for (int i = 0; i < statements.length; i++) {
|
for (int i = 0; i < statements.length; i++) {
|
||||||
|
System.out.println(statements[i]);
|
||||||
int count = DB.executeUpdate(statements[i], false,
|
int count = DB.executeUpdate(statements[i], false,
|
||||||
getTrxName(ctx));
|
trx.getTrxName());
|
||||||
if (count == -1) {
|
if (count == -1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -342,6 +352,7 @@ public class ColumnElementHandler extends AbstractElementHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
trx.commit(true);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
|
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
|
||||||
if (rsc != null) {
|
if (rsc != null) {
|
||||||
|
@ -358,19 +369,10 @@ public class ColumnElementHandler extends AbstractElementHandler {
|
||||||
}
|
}
|
||||||
rst = null;
|
rst = null;
|
||||||
}
|
}
|
||||||
|
trx.rollback();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// postgres requires commit on DDL (ALTER,CREATE)
|
|
||||||
if (DB.isPostgreSQL()) {
|
|
||||||
try {
|
|
||||||
DB.commit(true, getTrxName(ctx));
|
|
||||||
} catch (SQLException e) {
|
|
||||||
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,7 @@ public class ProcessElementHandler extends AbstractElementHandler {
|
||||||
.get_ID(), AD_Backup_ID, Object_Status, "AD_Process",
|
.get_ID(), AD_Backup_ID, Object_Status, "AD_Process",
|
||||||
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
||||||
"AD_Process"));
|
"AD_Process"));
|
||||||
|
element.recordId = m_Process.getAD_Process_ID();
|
||||||
} else {
|
} else {
|
||||||
record_log(ctx, 0, m_Process.getName(), "Process", m_Process
|
record_log(ctx, 0, m_Process.getName(), "Process", m_Process
|
||||||
.get_ID(), AD_Backup_ID, Object_Status, "AD_Process",
|
.get_ID(), AD_Backup_ID, Object_Status, "AD_Process",
|
||||||
|
|
|
@ -41,10 +41,38 @@ public class ProcessParaElementHandler extends AbstractElementHandler {
|
||||||
|
|
||||||
String entitytype = atts.getValue("EntityType");
|
String entitytype = atts.getValue("EntityType");
|
||||||
if (isProcessElement(ctx, entitytype)) {
|
if (isProcessElement(ctx, entitytype)) {
|
||||||
|
if (element.parent != null && element.parent.getElementValue().equals("process") &&
|
||||||
|
element.parent.defer) {
|
||||||
|
element.defer = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String name = atts.getValue("Name");
|
String name = atts.getValue("Name");
|
||||||
|
|
||||||
int id = get_IDWithMaster(ctx, "AD_Process_Para", name,
|
int id = 0;
|
||||||
"AD_Process", atts.getValue("ADProcessNameID"));
|
int masterId = 0;
|
||||||
|
String processValue = "";
|
||||||
|
if (element.parent != null && element.parent.getElementValue().equals("process") &&
|
||||||
|
element.parent.recordId > 0) {
|
||||||
|
masterId = element.parent.recordId;
|
||||||
|
} else {
|
||||||
|
processValue = atts.getValue("ADProcessValueID");
|
||||||
|
if (processValue != null && processValue.trim().length() > 0) {
|
||||||
|
masterId = get_IDWithColumn(ctx, "AD_Process", "Value", processValue);
|
||||||
|
} else {
|
||||||
|
//for backward compatibility
|
||||||
|
processValue = atts.getValue("ADProcessNameID");
|
||||||
|
masterId = get_IDWithColumn(ctx, "AD_Process", "Name", processValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (masterId <= 0) {
|
||||||
|
element.defer = true;
|
||||||
|
element.unresolved = "AD_Process: " + processValue;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
id = get_IDWithMasterAndColumn(ctx, "AD_Process_Para", "Name",
|
||||||
|
name, "AD_Process", masterId);
|
||||||
|
|
||||||
X_AD_Process_Para m_Process_para = new X_AD_Process_Para(ctx, id,
|
X_AD_Process_Para m_Process_para = new X_AD_Process_Para(ctx, id,
|
||||||
getTrxName(ctx));
|
getTrxName(ctx));
|
||||||
int AD_Backup_ID = -1;
|
int AD_Backup_ID = -1;
|
||||||
|
@ -58,14 +86,8 @@ public class ProcessParaElementHandler extends AbstractElementHandler {
|
||||||
AD_Backup_ID = 0;
|
AD_Backup_ID = 0;
|
||||||
}
|
}
|
||||||
m_Process_para.setName(atts.getValue("Name"));
|
m_Process_para.setName(atts.getValue("Name"));
|
||||||
name = atts.getValue("ADProcessNameID");
|
|
||||||
id = get_IDWithColumn(ctx, "AD_Process", "Name", name);
|
m_Process_para.setAD_Process_ID(masterId);
|
||||||
if (id <= 0) {
|
|
||||||
element.defer = true;
|
|
||||||
element.unresolved = "AD_Process: " + name;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_Process_para.setAD_Process_ID(id);
|
|
||||||
|
|
||||||
m_Process_para.setColumnName(atts.getValue("ColumnName"));
|
m_Process_para.setColumnName(atts.getValue("ColumnName"));
|
||||||
m_Process_para.setEntityType(atts.getValue("EntityType"));
|
m_Process_para.setEntityType(atts.getValue("EntityType"));
|
||||||
|
@ -200,12 +222,12 @@ public class ProcessParaElementHandler extends AbstractElementHandler {
|
||||||
(m_Processpara.getName() != null ? m_Processpara
|
(m_Processpara.getName() != null ? m_Processpara
|
||||||
.getName() : ""));
|
.getName() : ""));
|
||||||
if (m_Processpara.getAD_Process_ID() > 0) {
|
if (m_Processpara.getAD_Process_ID() > 0) {
|
||||||
sql = "SELECT Name FROM AD_Process WHERE AD_Process_ID=?";
|
sql = "SELECT Value FROM AD_Process WHERE AD_Process_ID=?";
|
||||||
name = DB.getSQLValueString(null, sql, m_Processpara
|
name = DB.getSQLValueString(null, sql, m_Processpara
|
||||||
.getAD_Process_ID());
|
.getAD_Process_ID());
|
||||||
atts.addAttribute("", "", "ADProcessNameID", "CDATA", name);
|
atts.addAttribute("", "", "ADProcessValueID", "CDATA", name);
|
||||||
} else
|
} else
|
||||||
atts.addAttribute("", "", "ADProcessNameID", "CDATA", "");
|
atts.addAttribute("", "", "ADProcessValueID", "CDATA", "");
|
||||||
if (m_Processpara.getAD_Process_Para_ID() > 0) {
|
if (m_Processpara.getAD_Process_Para_ID() > 0) {
|
||||||
sql = "SELECT Name FROM AD_Process_Para WHERE AD_Process_Para_ID=?";
|
sql = "SELECT Name FROM AD_Process_Para WHERE AD_Process_Para_ID=?";
|
||||||
name = DB.getSQLValueString(null, sql, m_Processpara
|
name = DB.getSQLValueString(null, sql, m_Processpara
|
||||||
|
|
|
@ -90,6 +90,7 @@ public class ReferenceElementHandler extends AbstractElementHandler {
|
||||||
"AD_Reference", get_IDWithColumn(ctx, "AD_Table",
|
"AD_Reference", get_IDWithColumn(ctx, "AD_Table",
|
||||||
"TableName", "AD_Reference"));
|
"TableName", "AD_Reference"));
|
||||||
references.add(m_Reference.getAD_Reference_ID());
|
references.add(m_Reference.getAD_Reference_ID());
|
||||||
|
element.recordId = m_Reference.getAD_Reference_ID();
|
||||||
} else {
|
} else {
|
||||||
record_log(ctx, 0, m_Reference.getName(), "Reference",
|
record_log(ctx, 0, m_Reference.getName(), "Reference",
|
||||||
m_Reference.get_ID(), AD_Backup_ID, Object_Status,
|
m_Reference.get_ID(), AD_Backup_ID, Object_Status,
|
||||||
|
|
|
@ -48,8 +48,15 @@ public class ReferenceListElementHandler extends AbstractElementHandler {
|
||||||
}
|
}
|
||||||
String name = atts.getValue("Name");
|
String name = atts.getValue("Name");
|
||||||
String value = atts.getValue("Value");
|
String value = atts.getValue("Value");
|
||||||
int AD_Reference_ID = get_IDWithColumn(ctx, "AD_Reference", "Name",
|
int AD_Reference_ID = 0;
|
||||||
|
if (element.parent != null && element.parent.getElementValue().equals("reference") &&
|
||||||
|
element.parent.recordId > 0) {
|
||||||
|
AD_Reference_ID = element.parent.recordId;
|
||||||
|
} else {
|
||||||
|
AD_Reference_ID = get_IDWithColumn(ctx, "AD_Reference", "Name",
|
||||||
atts.getValue("ADRefenceNameID"));
|
atts.getValue("ADRefenceNameID"));
|
||||||
|
}
|
||||||
|
|
||||||
int AD_Ref_List_ID = get_IDWithMasterAndColumn(ctx, "AD_Ref_List", "Value", value, "AD_Reference", AD_Reference_ID);
|
int AD_Ref_List_ID = get_IDWithMasterAndColumn(ctx, "AD_Ref_List", "Value", value, "AD_Reference", AD_Reference_ID);
|
||||||
X_AD_Ref_List m_Ref_List = new X_AD_Ref_List(ctx, AD_Ref_List_ID,
|
X_AD_Ref_List m_Ref_List = new X_AD_Ref_List(ctx, AD_Ref_List_ID,
|
||||||
getTrxName(ctx));
|
getTrxName(ctx));
|
||||||
|
|
|
@ -54,12 +54,19 @@ public class ReferenceTableElementHandler extends AbstractElementHandler {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int AD_Reference_ID = 0;
|
||||||
|
if (element.parent != null && element.parent.getElementValue().equals("reference") &&
|
||||||
|
element.parent.recordId > 0) {
|
||||||
|
AD_Reference_ID = element.parent.recordId;
|
||||||
|
} else {
|
||||||
StringBuffer sqlB = new StringBuffer(
|
StringBuffer sqlB = new StringBuffer(
|
||||||
"SELECT AD_Reference_ID FROM AD_Reference WHERE Name= ?");
|
"SELECT AD_Reference_ID FROM AD_Reference WHERE Name= ?");
|
||||||
int id = DB.getSQLValue(getTrxName(ctx), sqlB.toString(), name);
|
AD_Reference_ID = DB.getSQLValue(getTrxName(ctx), sqlB.toString(), name);
|
||||||
sqlB = new StringBuffer(
|
}
|
||||||
|
|
||||||
|
StringBuffer sqlB = new StringBuffer(
|
||||||
"SELECT Count(*) FROM AD_Ref_Table WHERE AD_Reference_ID= ?");
|
"SELECT Count(*) FROM AD_Ref_Table WHERE AD_Reference_ID= ?");
|
||||||
int count = DB.getSQLValue(getTrxName(ctx), sqlB.toString(), id);
|
int count = DB.getSQLValue(getTrxName(ctx), sqlB.toString(), AD_Reference_ID);
|
||||||
int tableId = get_IDWithColumn(ctx, "AD_Table", "TableName", atts
|
int tableId = get_IDWithColumn(ctx, "AD_Table", "TableName", atts
|
||||||
.getValue("ADTableNameID"));
|
.getValue("ADTableNameID"));
|
||||||
if (tableId == 0) {
|
if (tableId == 0) {
|
||||||
|
@ -141,17 +148,17 @@ public class ReferenceTableElementHandler extends AbstractElementHandler {
|
||||||
"', OrderByClause = '" + OrderByClause).append(
|
"', OrderByClause = '" + OrderByClause).append(
|
||||||
"', EntityType ='" + entityType).append(
|
"', EntityType ='" + entityType).append(
|
||||||
"', WhereClause = '" + WhereClause).append(
|
"', WhereClause = '" + WhereClause).append(
|
||||||
"' WHERE AD_Reference_ID = " + id);
|
"' WHERE AD_Reference_ID = " + AD_Reference_ID);
|
||||||
|
|
||||||
int no = DB.executeUpdate(sqlB.toString(), getTrxName(ctx));
|
int no = DB.executeUpdate(sqlB.toString(), getTrxName(ctx));
|
||||||
if (no > 0) {
|
if (no > 0) {
|
||||||
record_log(ctx, 1, atts.getValue("ADRefenceNameID"),
|
record_log(ctx, 1, atts.getValue("ADRefenceNameID"),
|
||||||
"Reference Table", id, 0, "Update", "AD_Ref_Table",
|
"Reference Table", AD_Reference_ID, 0, "Update", "AD_Ref_Table",
|
||||||
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
||||||
"AD_Ref_Table"));
|
"AD_Ref_Table"));
|
||||||
} else {
|
} else {
|
||||||
record_log(ctx, 0, atts.getValue("ADRefenceNameID"),
|
record_log(ctx, 0, atts.getValue("ADRefenceNameID"),
|
||||||
"Reference Table", id, 0, "Update", "AD_Ref_Table",
|
"Reference Table", AD_Reference_ID, 0, "Update", "AD_Ref_Table",
|
||||||
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
||||||
"AD_Ref_Table"));
|
"AD_Ref_Table"));
|
||||||
throw new POSaveFailedException("ReferenceTable");
|
throw new POSaveFailedException("ReferenceTable");
|
||||||
|
@ -165,7 +172,7 @@ public class ReferenceTableElementHandler extends AbstractElementHandler {
|
||||||
.append(
|
.append(
|
||||||
",entityType, isValueDisplayed, OrderByClause, ")
|
",entityType, isValueDisplayed, OrderByClause, ")
|
||||||
.append(" WhereClause )").append(
|
.append(" WhereClause )").append(
|
||||||
"VALUES(0, 0, 0, 0, " + id).append(
|
"VALUES(0, 0, 0, 0, " + AD_Reference_ID).append(
|
||||||
", " + tableId).append(", " + DisplayId)
|
", " + tableId).append(", " + DisplayId)
|
||||||
.append(", " + keyId).append(", '" + entityType)
|
.append(", " + keyId).append(", '" + entityType)
|
||||||
.append("', '" + isValueDisplayed).append(
|
.append("', '" + isValueDisplayed).append(
|
||||||
|
@ -175,12 +182,12 @@ public class ReferenceTableElementHandler extends AbstractElementHandler {
|
||||||
int no = DB.executeUpdate(sqlB.toString(), getTrxName(ctx));
|
int no = DB.executeUpdate(sqlB.toString(), getTrxName(ctx));
|
||||||
if (no > 0) {
|
if (no > 0) {
|
||||||
record_log(ctx, 1, atts.getValue("ADRefenceNameID"),
|
record_log(ctx, 1, atts.getValue("ADRefenceNameID"),
|
||||||
"Reference Table", id, 0, "New", "AD_Ref_Table",
|
"Reference Table", AD_Reference_ID, 0, "New", "AD_Ref_Table",
|
||||||
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
||||||
"AD_Ref_Table"));
|
"AD_Ref_Table"));
|
||||||
} else {
|
} else {
|
||||||
record_log(ctx, 0, atts.getValue("ADRefenceNameID"),
|
record_log(ctx, 0, atts.getValue("ADRefenceNameID"),
|
||||||
"Reference Table", id, 0, "New", "AD_Ref_Table",
|
"Reference Table", AD_Reference_ID, 0, "New", "AD_Ref_Table",
|
||||||
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
get_IDWithColumn(ctx, "AD_Table", "TableName",
|
||||||
"AD_Ref_Table"));
|
"AD_Ref_Table"));
|
||||||
throw new POSaveFailedException("ReferenceTable");
|
throw new POSaveFailedException("ReferenceTable");
|
||||||
|
|
|
@ -45,7 +45,13 @@ public class ReportViewColElementHandler extends AbstractElementHandler {
|
||||||
|
|
||||||
if (isProcessElement(ctx, entitytype)) {
|
if (isProcessElement(ctx, entitytype)) {
|
||||||
String name = atts.getValue("ADReportviewNameID");
|
String name = atts.getValue("ADReportviewNameID");
|
||||||
int AD_ReportView_ID = get_IDWithColumn(ctx, "AD_ReportView", "Name", name);
|
int AD_ReportView_ID = 0;
|
||||||
|
if (element.parent != null && element.parent.getElementValue().equals("reportview") &&
|
||||||
|
element.parent.recordId > 0) {
|
||||||
|
AD_ReportView_ID = element.parent.recordId;
|
||||||
|
} else {
|
||||||
|
AD_ReportView_ID = get_IDWithColumn(ctx, "AD_ReportView", "Name", name);
|
||||||
|
}
|
||||||
if (AD_ReportView_ID <= 0) {
|
if (AD_ReportView_ID <= 0) {
|
||||||
element.defer = true;
|
element.defer = true;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -97,6 +97,7 @@ public class ReportViewElementHandler extends AbstractElementHandler {
|
||||||
m_Reportview.get_ID(), AD_Backup_ID, Object_Status,
|
m_Reportview.get_ID(), AD_Backup_ID, Object_Status,
|
||||||
"AD_Reportview", get_IDWithColumn(ctx, "AD_Table",
|
"AD_Reportview", get_IDWithColumn(ctx, "AD_Table",
|
||||||
"TableName", "AD_Reportview"));
|
"TableName", "AD_Reportview"));
|
||||||
|
element.recordId = m_Reportview.getAD_ReportView_ID();
|
||||||
} else {
|
} else {
|
||||||
record_log(ctx, 0, m_Reportview.getName(), "Reportview",
|
record_log(ctx, 0, m_Reportview.getName(), "Reportview",
|
||||||
m_Reportview.get_ID(), AD_Backup_ID, Object_Status,
|
m_Reportview.get_ID(), AD_Backup_ID, Object_Status,
|
||||||
|
|
|
@ -60,12 +60,16 @@ public class SQLStatementElementHandler extends AbstractElementHandler {
|
||||||
// pstmt.executeUpdate();
|
// pstmt.executeUpdate();
|
||||||
//
|
//
|
||||||
Connection m_con = DB.getConnectionRW(true);
|
Connection m_con = DB.getConnectionRW(true);
|
||||||
|
try {
|
||||||
Statement stmt = m_con.createStatement();
|
Statement stmt = m_con.createStatement();
|
||||||
int n = stmt.executeUpdate (atts.getValue("statement"));
|
int n = stmt.executeUpdate (atts.getValue("statement"));
|
||||||
log.info("Executed SQL Statement for PostgreSQL: "+ atts.getValue("statement"));
|
log.info("Executed SQL Statement for PostgreSQL: "+ atts.getValue("statement"));
|
||||||
// Postgres needs to commit DDL statements
|
// Postgres needs to commit DDL statements
|
||||||
if (m_con != null && !m_con.getAutoCommit())
|
if (m_con != null && !m_con.getAutoCommit())
|
||||||
m_con.commit();
|
m_con.commit();
|
||||||
|
} finally {
|
||||||
|
m_con.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* else if(DB.isSybase() == true && DBType.equals("Sybase")){
|
/* else if(DB.isSybase() == true && DBType.equals("Sybase")){
|
||||||
pstmt.executeUpdate();
|
pstmt.executeUpdate();
|
||||||
|
|
|
@ -547,6 +547,7 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");
|
System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");
|
||||||
|
//System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "ALL");
|
||||||
ComboPooledDataSource cpds = new ComboPooledDataSource();
|
ComboPooledDataSource cpds = new ComboPooledDataSource();
|
||||||
cpds.setDataSourceName("AdempiereDS");
|
cpds.setDataSourceName("AdempiereDS");
|
||||||
cpds.setDriverClass(DRIVER);
|
cpds.setDriverClass(DRIVER);
|
||||||
|
@ -555,8 +556,10 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
cpds.setUser(connection.getDbUid());
|
cpds.setUser(connection.getDbUid());
|
||||||
cpds.setPassword(connection.getDbPwd());
|
cpds.setPassword(connection.getDbPwd());
|
||||||
cpds.setPreferredTestQuery(DEFAULT_CONN_TEST_SQL);
|
cpds.setPreferredTestQuery(DEFAULT_CONN_TEST_SQL);
|
||||||
cpds.setIdleConnectionTestPeriod(120);
|
cpds.setIdleConnectionTestPeriod(1200);
|
||||||
cpds.setAcquireRetryAttempts(5);
|
cpds.setAcquireRetryAttempts(5);
|
||||||
|
//cpds.setTestConnectionOnCheckin(true);
|
||||||
|
//cpds.setTestConnectionOnCheckout(true);
|
||||||
//cpds.setCheckoutTimeout(60);
|
//cpds.setCheckoutTimeout(60);
|
||||||
|
|
||||||
if (Ini.isClient())
|
if (Ini.isClient())
|
||||||
|
@ -565,7 +568,7 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
cpds.setMinPoolSize(1);
|
cpds.setMinPoolSize(1);
|
||||||
cpds.setMaxPoolSize(15);
|
cpds.setMaxPoolSize(15);
|
||||||
cpds.setMaxIdleTimeExcessConnections(1200);
|
cpds.setMaxIdleTimeExcessConnections(1200);
|
||||||
cpds.setMaxIdleTime(600);
|
cpds.setMaxIdleTime(900);
|
||||||
m_maxbusyconnections = 12;
|
m_maxbusyconnections = 12;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -574,12 +577,13 @@ public class DB_Oracle implements AdempiereDatabase
|
||||||
cpds.setMinPoolSize(5);
|
cpds.setMinPoolSize(5);
|
||||||
cpds.setMaxPoolSize(150);
|
cpds.setMaxPoolSize(150);
|
||||||
cpds.setMaxIdleTimeExcessConnections(1200);
|
cpds.setMaxIdleTimeExcessConnections(1200);
|
||||||
cpds.setMaxIdleTime(900);
|
cpds.setMaxIdleTime(1200);
|
||||||
m_maxbusyconnections = 120;
|
m_maxbusyconnections = 120;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpds.setUnreturnedConnectionTimeout(1200);
|
//the following sometimes kill active connection!
|
||||||
cpds.setDebugUnreturnedConnectionStackTraces(true);
|
//cpds.setUnreturnedConnectionTimeout(1200);
|
||||||
|
//cpds.setDebugUnreturnedConnectionStackTraces(true);
|
||||||
|
|
||||||
m_ds = cpds;
|
m_ds = cpds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -504,6 +504,9 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
getDataSource(connection);
|
getDataSource(connection);
|
||||||
//
|
//
|
||||||
Connection conn = m_ds.getConnection();
|
Connection conn = m_ds.getConnection();
|
||||||
|
ComboPooledDataSource cpds = (ComboPooledDataSource)m_ds;
|
||||||
|
//System.out.println("Num Connections: " + cpds.getNumConnections() + ", Busy Connections: "
|
||||||
|
// + cpds.getNumBusyConnections());
|
||||||
// Connection conn = getDriverConnection(connection);
|
// Connection conn = getDriverConnection(connection);
|
||||||
//
|
//
|
||||||
conn.setAutoCommit(autoCommit);
|
conn.setAutoCommit(autoCommit);
|
||||||
|
@ -519,13 +522,13 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
*/
|
*/
|
||||||
public DataSource getDataSource(CConnection connection)
|
public DataSource getDataSource(CConnection connection)
|
||||||
{
|
{
|
||||||
//throw new UnsupportedOperationException("Not supported/implemented");
|
|
||||||
if (m_ds != null)
|
if (m_ds != null)
|
||||||
return m_ds;
|
return m_ds;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");
|
System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");
|
||||||
|
//System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "ALL");
|
||||||
ComboPooledDataSource cpds = new ComboPooledDataSource();
|
ComboPooledDataSource cpds = new ComboPooledDataSource();
|
||||||
cpds.setDataSourceName("AdempiereDS");
|
cpds.setDataSourceName("AdempiereDS");
|
||||||
cpds.setDriverClass(DRIVER);
|
cpds.setDriverClass(DRIVER);
|
||||||
|
@ -534,7 +537,9 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
cpds.setUser(connection.getDbUid());
|
cpds.setUser(connection.getDbUid());
|
||||||
cpds.setPassword(connection.getDbPwd());
|
cpds.setPassword(connection.getDbPwd());
|
||||||
cpds.setPreferredTestQuery(DEFAULT_CONN_TEST_SQL);
|
cpds.setPreferredTestQuery(DEFAULT_CONN_TEST_SQL);
|
||||||
cpds.setIdleConnectionTestPeriod(120);
|
cpds.setIdleConnectionTestPeriod(1200);
|
||||||
|
//cpds.setTestConnectionOnCheckin(true);
|
||||||
|
//cpds.setTestConnectionOnCheckout(true);
|
||||||
cpds.setAcquireRetryAttempts(5);
|
cpds.setAcquireRetryAttempts(5);
|
||||||
//cpds.setCheckoutTimeout(60);
|
//cpds.setCheckoutTimeout(60);
|
||||||
|
|
||||||
|
@ -544,7 +549,7 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
cpds.setMinPoolSize(1);
|
cpds.setMinPoolSize(1);
|
||||||
cpds.setMaxPoolSize(15);
|
cpds.setMaxPoolSize(15);
|
||||||
cpds.setMaxIdleTimeExcessConnections(1200);
|
cpds.setMaxIdleTimeExcessConnections(1200);
|
||||||
cpds.setMaxIdleTime(600);
|
cpds.setMaxIdleTime(900);
|
||||||
m_maxbusyconnections = 12;
|
m_maxbusyconnections = 12;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -553,12 +558,13 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
||||||
cpds.setMinPoolSize(5);
|
cpds.setMinPoolSize(5);
|
||||||
cpds.setMaxPoolSize(150);
|
cpds.setMaxPoolSize(150);
|
||||||
cpds.setMaxIdleTimeExcessConnections(1200);
|
cpds.setMaxIdleTimeExcessConnections(1200);
|
||||||
cpds.setMaxIdleTime(900);
|
cpds.setMaxIdleTime(1200);
|
||||||
m_maxbusyconnections = 120;
|
m_maxbusyconnections = 120;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpds.setUnreturnedConnectionTimeout(1200);
|
//the following sometimes kill active connection!
|
||||||
cpds.setDebugUnreturnedConnectionStackTraces(true);
|
//cpds.setUnreturnedConnectionTimeout(1200);
|
||||||
|
//cpds.setDebugUnreturnedConnectionStackTraces(true);
|
||||||
|
|
||||||
m_ds = cpds;
|
m_ds = cpds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,10 +141,10 @@ public class MChangeLog extends X_AD_ChangeLog
|
||||||
int AD_Client_ID, int AD_Org_ID,
|
int AD_Client_ID, int AD_Org_ID,
|
||||||
Object OldValue, Object NewValue)
|
Object OldValue, Object NewValue)
|
||||||
{
|
{
|
||||||
this (ctx, 0, null); // out of trx
|
this (ctx, 0, TrxName);
|
||||||
if (AD_ChangeLog_ID == 0)
|
if (AD_ChangeLog_ID == 0)
|
||||||
{
|
{
|
||||||
AD_ChangeLog_ID = DB.getNextID (AD_Client_ID, Table_Name, null);
|
AD_ChangeLog_ID = DB.getNextID (AD_Client_ID, Table_Name, TrxName);
|
||||||
if (AD_ChangeLog_ID <= 0)
|
if (AD_ChangeLog_ID <= 0)
|
||||||
log.severe("No NextID (" + AD_ChangeLog_ID + ")");
|
log.severe("No NextID (" + AD_ChangeLog_ID + ")");
|
||||||
}
|
}
|
||||||
|
|
|
@ -695,6 +695,19 @@ public abstract class PO
|
||||||
else if (value.getClass() == Integer.class
|
else if (value.getClass() == Integer.class
|
||||||
&& p_info.getColumnClass(index) == String.class)
|
&& p_info.getColumnClass(index) == String.class)
|
||||||
m_newValues[index] = value;
|
m_newValues[index] = value;
|
||||||
|
else if (value.getClass() == String.class
|
||||||
|
&& p_info.getColumnClass(index) == Integer.class)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_newValues[index] = new Integer((String)value);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e)
|
||||||
|
{
|
||||||
|
log.log(Level.SEVERE, ColumnName
|
||||||
|
+ " - Class invalid: " + value.getClass().toString()
|
||||||
|
+ ", Should be " + p_info.getColumnClass(index).toString() + ": " + value);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log.log(Level.SEVERE, ColumnName
|
log.log(Level.SEVERE, ColumnName
|
||||||
|
@ -1817,12 +1830,24 @@ public abstract class PO
|
||||||
setAD_Org_ID(0);
|
setAD_Org_ID(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Trx localTrx = null;
|
||||||
|
if (m_trxName == null) {
|
||||||
|
m_trxName = Trx.createTrxName("POSave");
|
||||||
|
localTrx = Trx.get(m_trxName, true);
|
||||||
|
}
|
||||||
|
|
||||||
// Before Save
|
// Before Save
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!beforeSave(newRecord))
|
if (!beforeSave(newRecord))
|
||||||
{
|
{
|
||||||
log.warning("beforeSave failed - " + toString());
|
log.warning("beforeSave failed - " + toString());
|
||||||
|
if (localTrx != null) {
|
||||||
|
localTrx.rollback();
|
||||||
|
localTrx.close();
|
||||||
|
m_trxName = null;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1830,9 +1855,15 @@ public abstract class PO
|
||||||
{
|
{
|
||||||
log.log(Level.WARNING, "beforeSave - " + toString(), e);
|
log.log(Level.WARNING, "beforeSave - " + toString(), e);
|
||||||
log.saveError("Error", e.toString(), false);
|
log.saveError("Error", e.toString(), false);
|
||||||
// throw new DBException(e);
|
if (localTrx != null) {
|
||||||
|
localTrx.rollback();
|
||||||
|
localTrx.close();
|
||||||
|
m_trxName = null;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
// Call ModelValidators TYPE_NEW/TYPE_CHANGE
|
// Call ModelValidators TYPE_NEW/TYPE_CHANGE
|
||||||
String errorMsg = ModelValidationEngine.get().fireModelChange
|
String errorMsg = ModelValidationEngine.get().fireModelChange
|
||||||
(this, newRecord ? ModelValidator.TYPE_NEW : ModelValidator.TYPE_CHANGE);
|
(this, newRecord ? ModelValidator.TYPE_NEW : ModelValidator.TYPE_CHANGE);
|
||||||
|
@ -1840,13 +1871,54 @@ public abstract class PO
|
||||||
{
|
{
|
||||||
log.warning("Validation failed - " + errorMsg);
|
log.warning("Validation failed - " + errorMsg);
|
||||||
log.saveError("Error", errorMsg);
|
log.saveError("Error", errorMsg);
|
||||||
|
if (localTrx != null) {
|
||||||
|
localTrx.rollback();
|
||||||
|
m_trxName = null;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Save
|
// Save
|
||||||
if (newRecord)
|
if (newRecord)
|
||||||
return saveNew();
|
{
|
||||||
|
boolean b = saveNew();
|
||||||
|
if (b)
|
||||||
|
{
|
||||||
|
if (localTrx != null)
|
||||||
|
return localTrx.commit();
|
||||||
else
|
else
|
||||||
return saveUpdate();
|
return b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (localTrx != null)
|
||||||
|
localTrx.rollback();
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boolean b = saveUpdate();
|
||||||
|
if (b)
|
||||||
|
{
|
||||||
|
if (localTrx != null)
|
||||||
|
return localTrx.commit();
|
||||||
|
else
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (localTrx != null)
|
||||||
|
localTrx.rollback();
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (localTrx != null)
|
||||||
|
{
|
||||||
|
localTrx.close();
|
||||||
|
m_trxName = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
} // save
|
} // save
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,7 +70,10 @@ public class ColumnSync extends SvrProcess
|
||||||
throw new AdempiereUserError("@NotFound@ @AD_Table_ID@ " + column.getAD_Table_ID());
|
throw new AdempiereUserError("@NotFound@ @AD_Table_ID@ " + column.getAD_Table_ID());
|
||||||
|
|
||||||
// Find Column in Database
|
// Find Column in Database
|
||||||
DatabaseMetaData md = DB.getConnectionRO().getMetaData();
|
Connection conn = null;
|
||||||
|
try {
|
||||||
|
conn = DB.getConnectionRO();
|
||||||
|
DatabaseMetaData md = conn.getMetaData();
|
||||||
String catalog = DB.getDatabase().getCatalog();
|
String catalog = DB.getDatabase().getCatalog();
|
||||||
String schema = DB.getDatabase().getSchema();
|
String schema = DB.getDatabase().getSchema();
|
||||||
String tableName = table.getTableName();
|
String tableName = table.getTableName();
|
||||||
|
@ -135,6 +138,13 @@ public class ColumnSync extends SvrProcess
|
||||||
throw new AdempiereUserError (msg);
|
throw new AdempiereUserError (msg);
|
||||||
}
|
}
|
||||||
return sql;
|
return sql;
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (Exception e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
} // doIt
|
} // doIt
|
||||||
|
|
||||||
} // ColumnSync
|
} // ColumnSync
|
||||||
|
|
|
@ -81,7 +81,10 @@ public class TableCreateColumns extends SvrProcess
|
||||||
+ ", AllTables=" + p_AllTables
|
+ ", AllTables=" + p_AllTables
|
||||||
+ ", AD_Table_ID=" + p_AD_Table_ID);
|
+ ", AD_Table_ID=" + p_AD_Table_ID);
|
||||||
//
|
//
|
||||||
Connection conn = DB.getConnectionRO();
|
Connection conn = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
conn = DB.getConnectionRO();
|
||||||
AdempiereDatabase db = DB.getDatabase();
|
AdempiereDatabase db = DB.getDatabase();
|
||||||
DatabaseMetaData md = conn.getMetaData();
|
DatabaseMetaData md = conn.getMetaData();
|
||||||
String catalog = db.getCatalog();
|
String catalog = db.getCatalog();
|
||||||
|
@ -107,6 +110,13 @@ public class TableCreateColumns extends SvrProcess
|
||||||
}
|
}
|
||||||
|
|
||||||
return "#" + m_count;
|
return "#" + m_count;
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (Exception e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
} // doIt
|
} // doIt
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -152,11 +152,17 @@ public class Login
|
||||||
Env.setContext(m_ctx, "#Host", cc.getAppsHost());
|
Env.setContext(m_ctx, "#Host", cc.getAppsHost());
|
||||||
Env.setContext(m_ctx, "#Database", cc.getDbName());
|
Env.setContext(m_ctx, "#Database", cc.getDbName());
|
||||||
|
|
||||||
if (DB.getConnectionRO() == null)
|
Connection conn = DB.getConnectionRO();
|
||||||
|
if (conn == null)
|
||||||
{
|
{
|
||||||
log.saveError("NoDatabase", "");
|
log.saveError("NoDatabase", "");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
}
|
||||||
|
|
||||||
if (app_pwd == null)
|
if (app_pwd == null)
|
||||||
return null;
|
return null;
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue