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(dc,SELECT,-1,-1,-1,"query");
059                            }
060                            catch (PageException e) {
061                                    new QueryImpl(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        /**
076         * @see railo.commons.io.log.Log#log(int, java.lang.String, java.lang.String)
077         */
078        public void log(int level, String application, String message) {
079            DatasourceConnection dc=null;
080            try {
081                            dc = pool.getDatasourceConnection(ThreadLocalPageContext.get(),datasource, username, password);
082                            SQLImpl sql = new SQLImpl(INSERT);
083                            sql.addItems(new SQLItemImpl(application,CFTypes.VARCHAR));
084                            sql.addItems(new SQLItemImpl(message,CFTypes.VARCHAR));
085                            sql.addItems(new SQLItemImpl(new DateTimeImpl(),CFTypes.DATE));
086                            new QueryImpl(dc,sql,-1,-1,-1,"query");
087                    } 
088            catch (PageException e) {
089                            console.log(level, application, message);
090                    }
091                    finally{
092                            if(pool!=null)pool.releaseDatasourceConnection(dc);
093                    }
094        }
095    
096        /**
097         * @see railo.commons.io.log.LogWithLevel#getLogLevel()
098         */
099        public int getLogLevel() {
100            return logLevel;
101        }
102    
103        /**
104         * @see railo.commons.io.log.LogWithLevel#setLogLevel(int)
105         */
106        public void setLogLevel(int level) {
107            this.logLevel=level;
108        }
109    
110    
111        /**
112         * @see railo.commons.io.log.Log#debug(java.lang.String, java.lang.String)
113         */
114        public void debug(String application, String message) {
115            log(LEVEL_DEBUG, application, message);
116        }
117    
118        /**
119         * @see railo.commons.io.log.Log#error(java.lang.String, java.lang.String)
120         */
121        public void error(String application, String message) {
122            log(LEVEL_ERROR, application, message);
123        }
124    
125        /**
126         * @see railo.commons.io.log.Log#fatal(java.lang.String, java.lang.String)
127         */
128        public void fatal(String application, String message) {
129            log(LEVEL_FATAL, application, message);
130        }
131    
132        /**
133         * @see railo.commons.io.log.Log#info(java.lang.String, java.lang.String)
134         */
135        public void info(String application, String message) {
136            log(LEVEL_INFO, application, message);
137        }
138    
139        /**
140         * @see railo.commons.io.log.Log#warn(java.lang.String, java.lang.String)
141         */
142        public void warn(String application, String message) {
143            log(LEVEL_WARN, application, message);
144        }
145    }