package org.n3r.eql.mtcp.impl;
import com.google.common.collect.Maps;
import org.n3r.eql.Eql;
import org.n3r.eql.diamond.Dql;
import org.n3r.eql.map.EqlRowMapper;
import org.n3r.eql.mtcp.TenantPropertiesConfigurator;
import org.n3r.eql.mtcp.utils.Mtcps;
import org.n3r.eql.spec.ParamsAppliable;
import org.n3r.eql.util.Rs;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
public class TableTenantPropertiesConfigurator implements TenantPropertiesConfigurator, ParamsAppliable {
static String urlTemplate
= "jdbc:mysql://{host}:{port}/{dbname}?[useUnicode,characterEncoding,connectTimeout,autoReconnect]";
Map<String, Map<String, String>> tenantPropertiesMap = Maps.newHashMap();
@Override
public Map<String, String> getTenantProperties(String tenantId) {
Map<String, String> map = tenantPropertiesMap.get(tenantId);
if (map == null) throw new RuntimeException(tenantId + "'s config is not found");
return map;
}
@Override
public void applyParams(String[] params) {
String eqlConfigName = params[0];
String tenantPropsTable = params[1];
boolean dql = params.length >= 3 && "Dql".equalsIgnoreCase(params[2]);
Eql eql = dql ? new Dql(eqlConfigName) : new Eql(eqlConfigName);
eql.returnType(new EqlRowMapper() {
@Override
public Object mapRow(ResultSet rs, int rowNum, boolean isSingleColumn) throws SQLException {
Map<String, String> tenantProperties = Maps.newHashMap();
ResultSetMetaData metaData = rs.getMetaData();
String rowkey = rs.getString(1);
for (int i = 2, ii = metaData.getColumnCount(); i <= ii; ++i) {
String key = Rs.lookupColumnName(metaData, i);
String value = rs.getString(i);
tenantProperties.put(key, value);
}
String url = Mtcps.interpret(urlTemplate, tenantProperties);
tenantProperties.put("url", url);
tenantPropertiesMap.put(rowkey, tenantProperties);
return null;
}
}).execute("select * from " + tenantPropsTable);
}
}