001    package railo.commons.io.log;
002    
003    import railo.runtime.PageContext;
004    import railo.runtime.config.ConfigImpl;
005    import railo.runtime.db.CFTypes;
006    import railo.runtime.db.DataSource;
007    import railo.runtime.db.DatasourceConnection;
008    import railo.runtime.db.DatasourceConnectionPool;
009    import railo.runtime.db.SQL;
010    import railo.runtime.db.SQLImpl;
011    import railo.runtime.db.SQLItemImpl;
012    import railo.runtime.engine.ThreadLocalPageContext;
013    import railo.runtime.exp.PageException;
014    import railo.runtime.type.QueryImpl;
015    import railo.runtime.type.dt.DateTimeImpl;
016    
017    /**
018     * Datasource output logger
019     * TODO impl
020     */
021    public final class LogDataSource implements Log {
022     
023        private static final SQL SELECT = new SQLImpl("select for checking if table exists");//TODO
024        private static final String INSERT = "insert into cflog(application,message,created) values(?,?,?)";//TODO
025        private static final SQL CREATE = new SQLImpl("create table");//TODO
026            //private ConfigImpl config;
027        private DataSource datasource;
028        private String username;
029        private String password;
030        //private String table;
031        private int logLevel;
032            private DatasourceConnectionPool pool;
033            private LogConsole console;
034    
035        /**
036         * Constructor of the class
037         * @param config
038         * @param datasource 
039         * @param username 
040         * @param password 
041         * @param table 
042         * @throws PageException 
043         */
044        public LogDataSource(PageContext pc,int logLevel,ConfigImpl config, DataSource datasource, String username, String password, String table) {
045            this.logLevel=logLevel;
046            //this.config=config;
047            this.datasource=datasource;
048            this.username=username;
049            this.password=password;
050            //this.table=table;
051            pool = config.getDatasourceConnectionPool();
052            console=LogConsole.getInstance(config,logLevel);
053            
054            DatasourceConnection dc=null;
055            try {
056                            dc = pool.getDatasourceConnection(pc,datasource, username, password);
057                            try {
058                                    new QueryImpl(pc,dc,SELECT,-1,-1,-1,"query");
059                            }
060                            catch (PageException e) {
061                                    new QueryImpl(pc,dc,CREATE,-1,-1,-1,"query");
062                            }
063                    } 
064            catch (PageException e) {
065                            config.getErrWriter();
066                    }
067                    finally{
068                            if(pool!=null)pool.releaseDatasourceConnection(dc);
069                    }
070            
071            
072        }
073    
074    
075        @Override
076        public void log(int level, String application, String message) {
077            DatasourceConnection dc=null;
078            try {
079                            dc = pool.getDatasourceConnection(ThreadLocalPageContext.get(),datasource, username, password);
080                            SQLImpl sql = new SQLImpl(INSERT);
081                            sql.addItems(new SQLItemImpl(application,CFTypes.VARCHAR));
082                            sql.addItems(new SQLItemImpl(message,CFTypes.VARCHAR));
083                            sql.addItems(new SQLItemImpl(new DateTimeImpl(),CFTypes.DATE));
084                            new QueryImpl(ThreadLocalPageContext.get(),dc,sql,-1,-1,-1,"query");
085                    } 
086            catch (PageException e) {
087                            console.log(level, application, message);
088                    }
089                    finally{
090                            if(pool!=null)pool.releaseDatasourceConnection(dc);
091                    }
092        }
093    
094        @Override
095        public int getLogLevel() {
096            return logLevel;
097        }
098    
099        @Override
100        public void setLogLevel(int level) {
101            this.logLevel=level;
102        }
103    
104    
105        @Override
106        public void debug(String application, String message) {
107            log(LEVEL_DEBUG, application, message);
108        }
109    
110        @Override
111        public void error(String application, String message) {
112            log(LEVEL_ERROR, application, message);
113        }
114    
115        @Override
116        public void fatal(String application, String message) {
117            log(LEVEL_FATAL, application, message);
118        }
119    
120        @Override
121        public void info(String application, String message) {
122            log(LEVEL_INFO, application, message);
123        }
124    
125        @Override
126        public void warn(String application, String message) {
127            log(LEVEL_WARN, application, message);
128        }
129    }