📄 dbviewsource.java
字号:
/*
<dbSource>
<class>MyNa.xml.DBViewSource</class>
<useclass>MyNa.xml.RowViewSource</useclass>
<dbDriver>sun.jdbc.odbc.JdbcOdbcDriver</dbDriver>
<dbName>jdbc:odbc:PHONEBOOK</dbName>
<dbUser>JohnSmith</dbUser>
<dbPwd>hArd-tO-gUEss?</dbPwd>
<dbSource>INBOX</dbSource>
<dbQuery>SELECT * FROM |dbSource| ORDER BY msgdate,msgfromaddr</dbQuery>
<verbose>true</verbose>
<debug>true</debug>
</dbSource>
<class>MyNa.xml.MailViewSource</class>
<useclass>MyNa.xml.RowViewSource</useclass>
<dbDriver>pop3</dbDriver>
<dbName>mail.dreamscape.com</dbName>
<dbUser>JohnSmith</dbUser>
<dbPwd>hArd-tO-gUEss?</dbPwd>
<dbSource>INBOX</dbSource>
<theColumnLabels>msgsubject,msgdate,msgflags,msgfromaddr</theColumnLabels>
<verbose>true</verbose>
<debug>true</debug>
*/
/* The DBViewSource provides access to one table
at a time, in the form of a RowViewSource. It's initializable
by an xml file via the XmlConfig interface.
*/
package MyNa.xml;
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import MyNa.utils.*;
import org.w3c.dom.Node;
import java.sql.*;
public class DBViewSource extends XmlConfigBase
implements RowViewSource{
Env msgEnv; Logger lg; MyNa.xml.DBHandler dbHandler;
String dbDriver,dbName,dbUser,dbPwd,dbSource;
String dbQuery;
String retaddr;
boolean expunge; // if true, deletions stay gone.
int rownum; // used for individual extraction/deletion
String[]columnLabels;
String[]columnTypes;
String errorType;
String errorMessage;
public DBViewSource(){
lg=new Logger(); msgEnv=new Env(); dbHandler=null;
dbQuery="SELECT |columnLabels| FROM |dbSource|";
errorType=null; errorMessage=null;
}
public void setInitDefs(Env E){
msgEnv.addHashtable(E);
}
public void initDBHandler(Env E)throws Exception{
dbHandler=new DBHandler(E);
}
private boolean ok(String S){return null!=S && S.length()>0;}
public void setDbDriver(String S){
if(ok(S))dbDriver=S;
lg.logIt("dbVS: dbDriver="+dbDriver);
}
public void setDbName(String S){
if(ok(S))dbName=S;
lg.logIt("dbVS: dbName="+dbName);
}
public void setDbUser(String S){if(ok(S))dbUser=S;}
public void setDbPwd(String S){if(ok(S))dbPwd=S;}
public void setRetaddr(String S){if(ok(S))retaddr=S;}
public void setDbSource(String S){if(ok(S))dbSource=S;}
public void setExpunge(String S){ // not used at present
if(ok(S))expunge=(new Boolean(S)).booleanValue();
}
public void setRowNum(String S){if(ok(S))rownum=Integer.parseInt(S);}
public void setRowNum(int N){rownum=N;}
public void setColumnLabels(String[]A){
columnLabels=A; int N=0;
if(columnTypes==null ||
columnTypes.length!=(N=columnLabels.length)){
columnTypes=new String[N];
for(int i=0;i<N;i++)columnTypes[i]="VARCHAR";
}
}
public void setColumnLabels(String S){
if(ok(S))setColumnLabels(Misc.stringSplit(S,','));
}
public void setColumnTypes(String S){
if(ok(S))setColumnTypes(Misc.stringSplit(S,','));
}
public void setColumnTypes(String[]A){
columnTypes=A;
}
public void setMiscError(String S){
errorType="miscError"; errorMessage=S;
}
public void setLoginError(String S){
errorType="loginError"; errorMessage=S;
}
public void setString(String nm,String val){
if(nm==null)return;
if(nm.equals("dbDriver"))setDbDriver(val);
else if(nm.equals("dbName"))setDbName(val);
else if(nm.equals("dbUser"))setDbUser(val);
else if(nm.equals("dbPwd"))setDbPwd(val);
else if(nm.equals("dbSource"))setDbSource(val);
else if(nm.equals("expunge"))setExpunge(val);
else if(nm.equals("rownum"))setRowNum(val);
else if(nm.equals("verbose"))setVerbose(val);
else if(nm.equals("debug"))setDebug(val);
else if(nm.equals("beanName"))setBeanName(val);
else if(nm.equals("retaddr"))setRetaddr(val);
else lg.logIt("(DBViewSource) no such setstring: "+nm+"!="+val);
}
public int getRowNum(){return rownum;}
public String getString(String key){
if(key==null)return null;
if(key.equals("errorMessage"))return getErrorMessage();
if(key.equals("errorType"))return getErrorType();
if(key.equals("dbSource"))return dbSource;
if(key.equals("rownum"))return ""+rownum;
return null;
}
public void setQueries(Env E){
if(null==E)return;
E.put("dbQueries","getTable,getAllColumnsTable,delRow");
E.put("columnLabels",MessageData.getAllLabels());
E.put("getAllColumnsTable", Misc.stringDelimSubst(dbQuery,"|",E));
E.put("columnLabels",columnLabels);
E.put("getTable", Misc.stringDelimSubst(dbQuery,"|",E));
String qStr="DELETE FROM "+dbSource+" WHERE "+columnLabels[0]+"=?";
for(int i=1;i<columnLabels.length;i++)qStr+=" AND "+columnLabels[i]+"=?";
qStr+=";"; // qStr= delete from inbox where msgsubject=? AND msgcontent=?..
E.put("delRow",qStr);
}
public void initSession(Env E) throws Exception{
if(null==E)throw new Exception("null Env for DBViewSource.initSession");
//dbSource,dbDriver,dbName,dbUser,dbPwd,dateFormat,getTable_types
E.put("dbSource",dbSource);
E.put("dbDriver",dbDriver);
E.put("dbName",dbName);
E.put("dbUser",dbUser);
E.put("dbPwd",dbPwd);
setQueries(E);
try{initDBHandler(E);}
catch(Exception ex){
throw new Exception("DBViewSource.initSession: "+Logger.stackTrace(ex));
}
}
public boolean hasError(){
return (null!=errorMessage && errorMessage.length()>0);
}
public String getErrorMessage(){
String S=errorMessage; errorMessage=null; return S;
}
public String getErrorType(){return errorType;}
public String[]getColumnLabels(){return columnLabels;}
public String[]getColumnTypes(){return columnTypes;}
public int getNumberOfColumns(){return columnLabels.length;}
public RowSeq getRowList(){ // with columnLabels as in msgEnv
if(null==dbHandler)return null;
msgEnv.put("dbOperation","getTable");
try{return dbHandler.getQueryRows(msgEnv);}
catch(Exception ex){
setMiscError("dbVS.getRowList: \n"+Logger.stackTrace(ex));
return null;
}
}
public RowSeq getAllColumnsRowList(){ // with columnLabels as in msgEnv
if(null==dbHandler){
lg.logIt("no dbHandler for getAllColumnsRowList");
return null;
}
msgEnv.put("dbOperation","getAllColumnsTable");
try{return dbHandler.getQueryRows(msgEnv);}
catch(Exception ex){
String S="dbVS.getAllColumnsRowList: \n"+Logger.stackTrace(ex);
setMiscError(S);
lg.logIt(S);
return null;
}
}
public Env getRow(int N){
RowSeq rE=getAllColumnsRowList();
if(null==rE){
setMiscError("failure to get row list");
return msgEnv;
}
if(N<=0) return rE.getRow(); // init values only
int lim=N;
while(lim>0 && rE.next())lim--;
if(lim!=0) setMiscError("no item "+N+" available");
Env row= rE.getRow();
rE.close();
return row;
}
public void delRow(int N){
if(N<=0) return;
RowSeq rE=getRowList();
int lim=N;
while(lim>0 && rE.next())lim--;
if(lim!=0) setMiscError("no item "+N+" available");
delRows(rE.getColumnLabels(),rE.getColumnValues());
}
public void delRowRange(int start,int end){
for(int i=start;i<end;i++)delRow(i);
}
public void sendTo(String sourceType,String sourceName){
if("mail".equalsIgnoreCase(sourceType))sendToMail(sourceName);
else if("db".equalsIgnoreCase(sourceType))sendToDB(sourceName);
else if("file".equalsIgnoreCase(sourceType))sendToXML(sourceName);
else if("string".equalsIgnoreCase(sourceType))
sendToXMLString(sourceName); // result in msgEnv.
else setMiscError("unknown sourceType "+sourceType+" for sendTo");
}
public void sendTo(Env E){
sendTo(msgEnv.getStr("sourceType","mail"),
msgEnv.getStr("sourceName",retaddr));
}
public void sendToXMLString(String name){
try{
StringWriter sw=new StringWriter();
sendToXML(sw);
msgEnv.put(name,sw.toString());
lg.logIt("sendToXMLString("+name+") produces \n"+msgEnv.getStr(name));
}catch(Exception ex){msgEnv.put(name,"dbVS.sendToXMLString error: "+ex);}
}
public void close(){
try{
if(null!=dbHandler)dbHandler.close();
}catch(Exception E){setMiscError("closing error "+E);}
}
public void sendToMail(String msgtoaddr){
try{forwardMessageList(msgtoaddr);
}catch(Exception E){setMiscError("can't mail to "+msgtoaddr+": "+E);}
}
public void sendToXML(String fileName){
try{
Writer out=new BufferedWriter(new FileWriter(new File(fileName)));
sendToXML(out);
out.close();
}catch(Exception E){setMiscError("can't save to "+fileName+": "+E);}
}
public void sendToXML(Writer out)throws Exception{
msgEnv.put("OutputWriter",out);
msgEnv.put("tableName",dbSource);
getAllColumnsRowList().toXML();
}
public void sendToDB(Connection conn,String tableName,boolean reset)
throws Exception{
getAllColumnsRowList().toDB(conn,tableName,reset);
}
public void sendToDB(String tableName){
try{
sendToDB(dbHandler.getConnection(),tableName,false);
}catch(Exception E){
setMiscError("can't save to db box "+tableName+": "+E);
}
}
public void forwardMessageList(String msgtoaddr)throws Exception{
RowSeq rE=getAllColumnsRowList();
rE=new MapRowSeq("msgtoaddr",msgtoaddr,rE);
rE.toMail();
}
public void addRow(String[]fieldNames,String[]vals){
/* NOT IMPLEMENTED IN THIS EXAMPLE */
// construct a message, call folder.appendMessages()
}
public void delRowSearch(String field,String pat){
/* NOT IMPLEMENTED IN THIS EXAMPLE */
// loop through RowSeq.next().getStr(field),
// test val.indexOf(pat)>=0, call delRow(loop counter)
}
// deletes rows in which that field contains pat.
public RowSeq getFilteredRowList(String field,String pat){
return null;
/* NOT IMPLEMENTED IN THIS EXAMPLE */
}
public void delRows(String[]fieldNames,String[]vals){
try{
for(int i=1;i<=vals.length;i++)
msgEnv.put("Parameter"+i,vals[i-1]);
msgEnv.put("ParameterMax",""+vals.length);
msgEnv.put("dbOperation","delRow");
dbHandler.getQueryRows(msgEnv);
msgEnv.put("ParameterMax","0");
}catch(Exception ex){
setMiscError("dbVS.delRows():\n"+Logger.stackTrace(ex));
}
}
// deletes rows in which each of those fieldnames
// has exactly the corresponding value, apart from
// case (nulls match each other).
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -