package railo.commons.io.log;
import railo.runtime.PageContext;
import railo.runtime.config.ConfigImpl;
import railo.runtime.db.CFTypes;
import railo.runtime.db.DataSource;
import railo.runtime.db.DatasourceConnection;
import railo.runtime.db.DatasourceConnectionPool;
import railo.runtime.db.SQL;
import railo.runtime.db.SQLImpl;
import railo.runtime.db.SQLItemImpl;
import railo.runtime.engine.ThreadLocalPageContext;
import railo.runtime.exp.PageException;
import railo.runtime.type.QueryImpl;
import railo.runtime.type.dt.DateTimeImpl;
/**
* Datasource output logger
* TODO impl
*/
public final class LogDataSource implements Log {
private static final SQL SELECT = new SQLImpl("select for checking if table exists");//TODO
private static final String INSERT = "insert into cflog(application,message,created) values(?,?,?)";//TODO
private static final SQL CREATE = new SQLImpl("create table");//TODO
//private ConfigImpl config;
private DataSource datasource;
private String username;
private String password;
//private String table;
private int logLevel;
private DatasourceConnectionPool pool;
private LogConsole console;
/**
* Constructor of the class
* @param config
* @param datasource
* @param username
* @param password
* @param table
* @throws PageException
*/
public LogDataSource(PageContext pc,int logLevel,ConfigImpl config, DataSource datasource, String username, String password, String table) {
this.logLevel=logLevel;
//this.config=config;
this.datasource=datasource;
this.username=username;
this.password=password;
//this.table=table;
pool = config.getDatasourceConnectionPool();
console=LogConsole.getInstance(config,logLevel);
DatasourceConnection dc=null;
try {
dc = pool.getDatasourceConnection(pc,datasource, username, password);
try {
new QueryImpl(pc,dc,SELECT,-1,-1,-1,"query");
}
catch (PageException e) {
new QueryImpl(pc,dc,CREATE,-1,-1,-1,"query");
}
}
catch (PageException e) {
config.getErrWriter();
}
finally{
if(pool!=null)pool.releaseDatasourceConnection(dc);
}
}
@Override
public void log(int level, String application, String message) {
DatasourceConnection dc=null;
try {
dc = pool.getDatasourceConnection(ThreadLocalPageContext.get(),datasource, username, password);
SQLImpl sql = new SQLImpl(INSERT);
sql.addItems(new SQLItemImpl(application,CFTypes.VARCHAR));
sql.addItems(new SQLItemImpl(message,CFTypes.VARCHAR));
sql.addItems(new SQLItemImpl(new DateTimeImpl(),CFTypes.DATE));
new QueryImpl(ThreadLocalPageContext.get(),dc,sql,-1,-1,-1,"query");
}
catch (PageException e) {
console.log(level, application, message);
}
finally{
if(pool!=null)pool.releaseDatasourceConnection(dc);
}
}
@Override
public int getLogLevel() {
return logLevel;
}
@Override
public void setLogLevel(int level) {
this.logLevel=level;
}
@Override
public void debug(String application, String message) {
log(LEVEL_DEBUG, application, message);
}
@Override
public void error(String application, String message) {
log(LEVEL_ERROR, application, message);
}
@Override
public void fatal(String application, String message) {
log(LEVEL_FATAL, application, message);
}
@Override
public void info(String application, String message) {
log(LEVEL_INFO, application, message);
}
@Override
public void warn(String application, String message) {
log(LEVEL_WARN, application, message);
}
}