001 package railo.runtime.db; 002 003 import java.util.Iterator; 004 import java.util.Map.Entry; 005 import java.util.TimeZone; 006 007 import railo.commons.lang.ClassException; 008 import railo.commons.lang.StringUtil; 009 import railo.runtime.config.ConfigWebFactory; 010 import railo.runtime.op.Caster; 011 import railo.runtime.type.Collection.Key; 012 import railo.runtime.type.KeyImpl; 013 import railo.runtime.type.Struct; 014 import railo.runtime.type.util.CollectionUtil; 015 016 017 /** 018 * 019 */ 020 public final class DataSourceImpl extends DataSourceSupport { 021 022 private String connStr; 023 private String host; 024 private String database; 025 private int port; 026 private String connStrTranslated; 027 private Struct custom; 028 private boolean validate; 029 030 /** 031 * constructor of the class 032 * @param name 033 * @param clazz 034 * @param host 035 * @param dsn 036 * @param database 037 * @param port 038 * @param username 039 * @param password 040 * @param connectionLimit 041 * @param connectionTimeout 042 * @param blob 043 * @param clob 044 * @param allow 045 * @param custom 046 * @param readOnly 047 * @throws ClassException 048 */ 049 public DataSourceImpl(String name,String className, String host, String dsn, String database, int port, String username, String password, 050 int connectionLimit, int connectionTimeout,long metaCacheTimeout, boolean blob, boolean clob, int allow, Struct custom, boolean readOnly, 051 boolean validate,boolean storage, TimeZone timezone) throws ClassException { 052 this(name, toClass(className), host, dsn, database, port, username, password, connectionLimit, connectionTimeout,metaCacheTimeout, blob, clob, allow, custom, readOnly,validate,storage,timezone); 053 054 } 055 056 private DataSourceImpl(String name,Class<?> clazz, String host, String dsn, String database, int port, String username, String password, 057 int connectionLimit, int connectionTimeout,long metaCacheTimeout, boolean blob, boolean clob, int allow, Struct custom, boolean readOnly, 058 boolean validate,boolean storage,TimeZone timezone) { 059 super(name, clazz,username,ConfigWebFactory.decrypt(password),blob,clob,connectionLimit, connectionTimeout, metaCacheTimeout, timezone, allow<0?ALLOW_ALL:allow, storage, readOnly); 060 061 this.host=host; 062 this.database=database; 063 this.connStr=dsn; 064 this.port=port; 065 066 this.custom=custom; 067 this.validate=validate; 068 069 this.connStrTranslated=dsn; 070 translateDsn(); 071 072 // throw new DatabaseException("can't find class ["+classname+"] for jdbc driver, check if driver (jar file) is inside lib folder",e.getMessage(),null,null,null); 073 074 } 075 private void translateDsn() { 076 connStrTranslated=replace(connStrTranslated,"host",host,false); 077 connStrTranslated=replace(connStrTranslated,"database",database,false); 078 connStrTranslated=replace(connStrTranslated,"port",Caster.toString(port),false); 079 connStrTranslated=replace(connStrTranslated,"username",getUsername(),false); 080 connStrTranslated=replace(connStrTranslated,"password",getPassword(),false); 081 082 //Collection.Key[] keys = custom==null?new Collection.Key[0]:custom.keys(); 083 if(custom!=null) { 084 Iterator<Entry<Key, Object>> it = custom.entryIterator(); 085 Entry<Key, Object> e; 086 while(it.hasNext()) { 087 e = it.next(); 088 connStrTranslated=replace(connStrTranslated,e.getKey().getString(),Caster.toString(e.getValue(),""),true); 089 } 090 } 091 } 092 093 private String replace(String src, String name, String value,boolean doQueryString) { 094 if(StringUtil.indexOfIgnoreCase(src,"{"+name+"}")!=-1) { 095 return StringUtil.replace(connStrTranslated,"{"+name+"}",value,false); 096 } 097 if(!doQueryString) return src; 098 if(getClazz().getName().indexOf("microsoft")!=-1 || getClazz().getName().indexOf("jtds")!=-1) 099 return src+=';'+name+'='+value; 100 return src+=((src.indexOf('?')!=-1)?'&':'?')+name+'='+value; 101 } 102 103 @Override 104 public String getDsnOriginal() { 105 return getConnectionString(); 106 } 107 108 @Override 109 public String getConnectionString() { 110 return connStr; 111 } 112 113 @Override 114 public String getDsnTranslated() { 115 return getConnectionStringTranslated(); 116 } 117 118 @Override 119 public String getConnectionStringTranslated() { 120 return connStrTranslated; 121 } 122 123 @Override 124 public String getDatabase() { 125 return database; 126 } 127 128 @Override 129 public int getPort() { 130 return port; 131 } 132 133 @Override 134 public String getHost() { 135 return host; 136 } 137 138 @Override 139 public Object clone() { 140 return new DataSourceImpl(getName(),getClazz(), host, connStr, database, port, getUsername(), getPassword(), getConnectionLimit(), getConnectionTimeout(),getMetaCacheTimeout(), isBlob(), isClob(), allow, custom, isReadOnly(),validate,isStorage(),getTimeZone()); 141 } 142 143 @Override 144 public DataSource cloneReadOnly() { 145 return new DataSourceImpl(getName(),getClazz(), host, connStr, database, port, getUsername(), getPassword(), getConnectionLimit(), getConnectionTimeout(),getMetaCacheTimeout(), isBlob(), isClob(), allow,custom, true,validate,isStorage(),getTimeZone()); 146 } 147 148 @Override 149 public String getCustomValue(String key) { 150 return Caster.toString(custom.get(KeyImpl.init(key),null),""); 151 } 152 153 @Override 154 public String[] getCustomNames() { 155 return CollectionUtil.keysAsString(custom); 156 } 157 158 @Override 159 public Struct getCustoms() { 160 return (Struct)custom.clone(); 161 } 162 163 @Override 164 public boolean validate() { 165 return validate; 166 } 167 }