FR 1834749

It should be reviewd for Oracle, as I only have a postgres instance for testing. Also, when you finish applying the scripts you should go into the Tables window and create the table AD_MigrationScript by syncing the table and the db.
For those of you who want to use it asap, there's a a manual in the FR tracker, inside the zip file. I'll add it to the wiki as soon as time allows me.
Regards,

Fernando
This commit is contained in:
fer_luck 2008-03-06 18:59:32 +00:00
parent 3177eb5037
commit b100c457e7
4 changed files with 4636 additions and 0 deletions

View File

@ -0,0 +1,191 @@
/**********************************************************************
* This file is part of Adempiere ERP Bazaar *
* http://www.adempiere.org *
* *
* Copyright (C) Fernando Lucktemberg - fer_luck *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - Fernando Lucktemberg - fer_luck *
* *
* Sponsors: *
* - Company (http://www.faire.com.br) *
***********************************************************************/
package org.adempiere.process;
import java.io.BufferedReader;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import java.util.logging.Level;
import org.compiere.Adempiere;
import org.compiere.model.MIssue;
import org.compiere.model.X_AD_Error;
import org.compiere.process.SvrProcess;
import org.compiere.util.CLogErrorBuffer;
import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
public class ApplyMigrationScripts extends SvrProcess {
/** Logger */
private static CLogger log = CLogger
.getCLogger(ApplyMigrationScripts.class);
@Override
protected String doIt() throws Exception {
// TODO Auto-generated method stub
log.info("Applying migrations scripts");
String sql = "select ad_migrationscript_id, script, name from ad_migrationscript where isApply = 'Y' and status = 'IP' order by name, created";
PreparedStatement pstmt = DB.prepareStatement(sql, this.get_TrxName());
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
byte[] scriptArray = rs.getBytes(2);
int seqID = rs.getInt(1);
boolean execOk = true;
try {
StringBuffer tmpSql = new StringBuffer();
tmpSql = new StringBuffer(new String(scriptArray));
if (tmpSql.length() > 0) {
log.info("Executing script " + rs.getString(3));
execOk = executeScript(tmpSql.toString(), rs.getString(3));
System.out.println();
}
} catch (SQLException e) {
execOk = false;
e.printStackTrace();
log.saveError("Error", "Script: " + rs.getString(3) + " - "
+ e.getMessage());
log.severe(e.getMessage());
} finally {
sql = "update ad_migrationscript set status = ? , isApply = 'N' where ad_migrationscript_id = ? ";
pstmt = DB.prepareStatement(sql, this.get_TrxName());
if (execOk) {
pstmt.setString(1, "CO");
pstmt.setInt(2, seqID);
} else {
pstmt.setString(1, "ER");
pstmt.setInt(2, seqID);
}
try {
pstmt.executeUpdate();
if (!execOk) {
pstmt.close();
return null;
}
} catch (SQLException e) {
e.printStackTrace();
log.saveError("Error", "Script: " + rs.getString(3) + " - "
+ e.getMessage());
log.severe(e.getMessage());
}
}
}
rs.close();
pstmt.close();
return null;
}
@Override
protected void prepare() {
// TODO Auto-generated method stub
}
public boolean executeScript(String sql, String fileName) {
BufferedReader reader = new BufferedReader(new StringReader(sql));
StringBuffer sqlBuf = new StringBuffer();
String line;
boolean statementReady = false;
boolean execOk = true;
boolean longComment = false;
try {
while ((line = reader.readLine()) != null) {
// different continuation for oracle and postgres
line = line.trim();
//Check if it's a comment
if (line.startsWith("--") || line.length() == 0){
continue;
} else if (line.endsWith(";") && !longComment) {
sqlBuf.append(' ');
sqlBuf.append(line.substring(0, line.length() - 1));
statementReady = true;
} else if(line.startsWith("/*")){
longComment = true;
} else if(line.endsWith("*/")){
longComment = false;
} else {
if(longComment)
continue;
sqlBuf.append(' ');
sqlBuf.append(line);
statementReady = false;
}
if (statementReady) {
if (sqlBuf.length() == 0)
continue;
Connection conn = DB.getConnectionRW();
conn.setAutoCommit(false);
Statement stmt = null;
try {
stmt = conn.createStatement();
stmt.execute(sqlBuf.toString());
System.out.print(".");
} catch (SQLException e) {
e.printStackTrace();
execOk = false;
log.saveError("Error", "Script: " + fileName + " - "
+ e.getMessage() + ". The line that caused the error is the following ==> " + sqlBuf);
log.severe(e.getMessage());
} finally {
stmt.close();
if(execOk)
conn.commit();
else
conn.rollback();
conn.setAutoCommit(true);
conn.close();
if(!execOk)
return false;
}
sqlBuf.setLength(0);
}
}
} catch(SQLException e){
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}

View File

@ -0,0 +1,267 @@
/**********************************************************************
* This file is part of Adempiere ERP Bazaar *
* http://www.adempiere.org *
* *
* Copyright (C) Fernando Lucktemberg - fer_luck *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
* *
* Contributors: *
* - Fernando Lucktemberg - fer_luck *
* *
* Sponsors: *
* - Company (http://www.faire.com.br) *
***********************************************************************/
package org.adempiere.process;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Scanner;
import java.util.Vector;
import java.util.logging.Level;
import org.compiere.Adempiere;
import org.compiere.model.MSequence;
import org.compiere.process.ProcessInfoParameter;
import org.compiere.process.SvrProcess;
import org.compiere.util.DB;
import org.compiere.util.Env;
public class PrepareMigrationScripts extends SvrProcess {
String path;
// Charset found variable
public static boolean found = false;
@Override
protected String doIt() throws Exception {
String directory;
if (path != null)
directory = path;
else
return "ERROR - No path";
File dir = new File(directory);
// The list of files can also be retrieved as File objects
File[] dirList = dir.listFiles();
Vector<String> fileName = new Vector<String>();
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".sql");
}
};
dirList = dir.listFiles(filter);
log.info("Searching for SQL files in the " + dir + " directory");
String msg = "";
// Get Filenames
for (int i = 0; i < dirList.length; i++) {
fileName.add(dirList[i].toString()
.substring(directory.length() + 1));
log
.fine("Found file ["
+ fileName.get(i)
+ "]. Finding out if the script has or hasn't been applied yet...");
try {
// First of all, check if the script hasn't been applied yet...
String checkScript = "select ad_migrationscript_id from ad_migrationscript where name = ?";
PreparedStatement pstmt = DB.prepareStatement(checkScript, this
.get_TrxName());
pstmt.setString(1, fileName.get(i));
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
log.warning("Script " + fileName.get(i)
+ " already in the database");
pstmt.close();
continue;
}
pstmt.close();
// first use a Scanner to get each line
Scanner scanner = new Scanner(dirList[i]);
StringBuffer body = new StringBuffer();
boolean blHeader = false;
boolean blBody = false;
boolean isFirstLine = true;
boolean hasHeader = false;
String Name = fileName.get(i);
String Description = "Unknown";
String ProjectName = "Adempiere";
String tmp = Adempiere.MAIN_VERSION;
tmp = tmp.replace("Release ", "");
tmp = tmp.replace(".", "");
String ReleaseNo = tmp;
String DeveloperName = "Not known";
String Reference = "--";
String Url = "http://www.sourceforge.net/projects/adempiere";
Timestamp ts = new Timestamp(Calendar.getInstance()
.getTimeInMillis());
while (scanner.hasNextLine()) {
String line = null;
// if it's the first line check for the header
if (isFirstLine)
line = scanner.nextLine();
if (isFirstLine && line.equals("--BEGINHEADER--"))
hasHeader = true;
if (hasHeader) {
if (!isFirstLine)
line = scanner.nextLine();
if (line.equals("--ENDHEADER--")) {
blHeader = false;
blBody = false;
}
if (line.equals("--ENDMS--")) {
blHeader = false;
blBody = false;
}
if (blHeader) {
if (line.startsWith("Name")) {
Name = line.substring("Name".length() + 1);
} else if (line.startsWith("Description")) {
Description = line.substring("Description"
.length() + 1);
} else if (line.startsWith("ProjectName")) {
ProjectName = line.substring("ProjectName"
.length() + 1);
} else if (line.startsWith("ReleaseNo")) {
ReleaseNo = line
.substring("ReleaseNo".length() + 1);
} else if (line.startsWith("DeveloperName")) {
DeveloperName = line.substring("DeveloperName"
.length() + 1);
} else if (line.startsWith("Reference")) {
Reference = line
.substring("Reference".length() + 1);
} else if (line.startsWith("Url")) {
Url = line.substring("Url".length() + 1);
}
}
if (blBody) {
body.append(line + '\n');
}
if (line.equals("--BEGINHEADER--")) {
blHeader = true;
blBody = false;
}
if (line.equals("--BEGINMS--")) {
blHeader = false;
blBody = true;
}
} else {
if (!isFirstLine)
line = scanner.nextLine();
body.append(line + '\n');
}
isFirstLine = false;
}
scanner.close();
int seqID = MSequence.getNextID(0, "AD_MigrationScript", this
.get_TrxName());
String sql = "INSERT INTO ad_migrationscript (ad_client_id, ad_org_id, "
+ "ad_migrationscript_id, createdby, "
+ "name, projectname, "
+ "releaseno, status, "
+ "url, updatedby, "
+ "filename, description, "
+ "developername, reference, "
+ "isactive, isapply, "
+ "created, updated) "
+ "VALUES "
+ "(0, 0, ?, ?, "
+ "?, ?, ?, ?, "
+ "?, ?, ?, ?, "
+ "?, ?, ?, ?, "
+ "?, ? )";
pstmt = DB.prepareStatement(sql, this.get_TrxName());
pstmt.setInt(1, seqID);
pstmt.setInt(2, Env.getAD_User_ID(Env.getCtx()));
pstmt.setString(3, Name);
pstmt.setString(4, ProjectName);
pstmt.setString(5, ReleaseNo);
pstmt.setString(6, "IP");
pstmt.setString(7, Url);
pstmt.setInt(8, Env.getAD_User_ID(Env.getCtx()));
pstmt.setString(9, path);
pstmt.setString(10, Description);
pstmt.setString(11, DeveloperName);
pstmt.setString(12, Reference);
pstmt.setString(13, "Y");
pstmt.setString(14, "Y");
pstmt.setTimestamp(15, ts);
pstmt.setTimestamp(16, ts);
int result = pstmt.executeUpdate();
pstmt.close();
if (result > 0)
log.info("Header inserted. Now inserting the script body");
else {
log.severe("Script " + fileName.get(i) + " failed!");
msg = msg + "Script " + fileName.get(i) + " failed!";
continue;
}
sql = "update AD_MigrationScript set script = ? where AD_MigrationScript_ID = ?";
pstmt = DB.prepareStatement(sql, this.get_TrxName());
pstmt.setBytes(1, body.toString().getBytes());
pstmt.setInt(2, seqID);
result = pstmt.executeUpdate();
pstmt.close();
if (result > 0)
log.info("Script Body inserted.");
else {
log.severe("Script Body " + fileName.get(i) + " failed!");
msg = msg + "Script Body " + fileName.get(i) + " failed!";
pstmt = DB
.prepareStatement(
"delete from ad_migrationscript = ad_migrationscript_id = ?",
this.get_TrxName());
pstmt.setInt(1, seqID);
result = pstmt.executeUpdate();
continue;
}
} catch (Exception ex) {
log.severe(ex.getMessage());
}
}
return "Sucess";
}
@Override
protected void prepare() {
ProcessInfoParameter[] para = getParameter();
for (int i = 0; i < para.length; i++) {
String name = para[i].getParameterName();
if (para[i].getParameter() == null)
;
else if (name.equals("ScriptsPath"))
path = (String) para[i].getParameter();
else
log.log(Level.SEVERE, "Unknown Parameter: " + name);
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff