package com.smtscript.lib; import java.io.FileInputStream; import java.io.InputStreamReader; import org.mozilla.javascript.Context; import org.mozilla.javascript.NativeFunction; import org.mozilla.javascript.NativeObject; import com.smtscript.utils.SMTStatic; public class JSStaticSQLFile extends JSStaticAbstract { @JSComment( "\n" + "@param nvConfig \n" + " eofchar - String : sql eof char(default '/')\n" + " filename - String : sql file name\n" + " encode - String : file encode(defualt UTF-8)\n" + " func - Function : function(sql)\n" + "") public void load(NativeObject nvConfig)throws Exception { String fileName = (String) SMTStatic.getJSValue(nvConfig, "filename"); String encode = (String) SMTStatic.getJSValue(nvConfig, "encode", "UTF-8"); String endChar= (String) SMTStatic.getJSValue(nvConfig, "eofchar", ";"); NativeFunction func = (NativeFunction)SMTStatic.getJSValue(nvConfig, "func"); InputStreamReader rd = new InputStreamReader(new FileInputStream(fileName), encode); try { Context cx = this.__parentScope__().__runtime__().entryContext(); try { StringBuilder sbSQL = new StringBuilder(); char eofChar = endChar.charAt(0); char strChar = 0; int ich; while((ich = rd.read()) >= 0) { // 如果不是在字符串模式 if(strChar == 0) { // 如果当前是字符串标识,则进入字符串模式 if(ich == '\'' || ich == '"' || ich == '`') { sbSQL.append((char)ich); strChar = (char)ich; } // 如果当前是结束符,则终止当前解析,执行脚本 else if(ich == eofChar) { if(sbSQL.length() > 0) { Object value = func.call(cx, func, null, new Object[]{sbSQL.toString()}); sbSQL.setLength(0); if(value instanceof Boolean && !(Boolean)value) { sbSQL.setLength(0); break; } } } else { sbSQL.append((char)ich); } } // 如果是在字符串模式,则一直扫描到非字符串结束 else { sbSQL.append((char)ich); if(ich == strChar) { strChar = 0; } } } if(sbSQL.length() > 0) { func.call(cx, func, null, new Object[]{sbSQL.toString()}); } } finally { Context.exit(); } } finally { rd.close(); } } }