Project: AdServing
/**
 * Mad-Advertisement 
 * Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net> 
 * 
 * This program is free software: you can redistribute it and/or modify it under 
 * the terms of the GNU General Public License as published by the Free Software 
 * Foundation, either version 3 of the License, or (at your option) any later 
 * version. 
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 
 * details. 
 * 
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>. 
 */
package net.mad.ads.services.geo; 
 
 
import java.io.BufferedReader; 
 
import java.io.FileReader; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Scanner; 
 
import net.mad.ads.services.geo.helper.ValidateIP; 
 
import org.hsqldb.jdbc.pool.JDBCPooledDataSource; 
 
 
 
import au.com.bytecode.opencsv.CSVReader; 
import biz.source_code.miniConnectionPoolManager.MiniConnectionPoolManager; 
 
 
 
/**
 * Reader zum einlesen 
 *  
 * "ip_start";"country_code";"country_name";"region_code";"region_name";"city"; 
 * "zipcode";"latitude";"longitude";"metrocode" 
 *  
 * @author tmarx 
 *  
 */
 
public class IpinfoLocationDB implements IPLocationDB { 
  
  
 private static final String jdbc_class_hsql = "org.hsqldb.jdbc.JDBCDriver"
 private static final String jdbc_url_hsql = "jdbc:hsqldb:"
  
// private Connection conn = null; 
  
 private String db; 
  
 private MiniConnectionPoolManager poolMgr = null
  
 public IpinfoLocationDB() { 
 
  
 public void open(String db) throws ClassNotFoundException, SQLException { 
  this.db = db; 
  Class.forName(jdbc_class_hsql); 
  // conn = DriverManager.getConnection(jdbc_url_hsql + db, "sa", 
  // "citydb"); 
 
  JDBCPooledDataSource datasource = new JDBCPooledDataSource(); 
//  datasource.setUrl(jdbc_url_hsql + db); 
  datasource.setUser("sa"); 
  datasource.setPassword(""); 
  datasource.setDatabase(jdbc_url_hsql + db); 
 
  poolMgr = new MiniConnectionPoolManager(datasource, 50); 
 
 
 /**
  * Falls die Datenbank von verschiedenen Services verwendet wird, kann eine 
  * Connection �bergeben werden 
  *  
  * @param con 
  */
 
 public void open(MiniConnectionPoolManager poolmgr) { 
  this.poolMgr = poolmgr; 
 
 
 public void close() throws SQLException { 
  poolMgr.dispose(); 
 
 
 public void importCountry(String filename) { 
  Connection conn = null
  try { 
   conn = poolMgr.getConnection(); 
   conn.setAutoCommit(true); 
   Statement stat = conn.createStatement(); 
    
    
   StringBuilder builder = new StringBuilder(); 
   builder.append("CREATE CACHED TABLE IP_COUNTRY ("); 
      builder.append("ipFROM BIGINT NOT NULL ,"); 
      builder.append("ipTO BIGINT NOT NULL ,"); 
      builder.append("countrySHORT VARCHAR(2),"); 
      builder.append("countryLONG VARCHAR(64),"); 
      builder.append("ipREGION VARCHAR(128),"); 
      builder.append("ipCITY VARCHAR(128),"); 
      builder.append("ipLATITUDE DOUBLE,"); 
      builder.append("ipLONGITUDE DOUBLE,"); 
      builder.append("ipZIPCODE VARCHAR(10),"); 
      builder.append("ipTIMEZONE VARCHAR(8),"); 
      builder.append("PRIMARY KEY(ipFROM, ipTO)"); 
      builder.append(")"); 
       
//      stat.execute("CREATE CACHED TABLE IP_COUNTRY(ip_from BIGINT PRIMARY KEY, ip_to BIGINT, country_code VARCHAR(4), region_name VARCHAR(100), city_name VARCHAR(50), city_zip VARCHAR(20), latitude VARCHAR(30), longitude VARCHAR(30), timezone VARCHAR(8) )"); 
      stat.execute(builder.toString()); 
   stat.close(); 
       
   builder = new StringBuilder(); 
   builder.append("INSERT INTO IP_COUNTRY ("); 
   builder.append("ipFROM,"); 
      builder.append("ipTO,"); 
      builder.append("countrySHORT,"); 
      builder.append("countryLONG,"); 
      builder.append("ipREGION,"); 
      builder.append("ipCITY,"); 
      builder.append("ipLATITUDE,"); 
      builder.append("ipLONGITUDE,"); 
      builder.append("ipZIPCODE,"); 
      builder.append("ipTIMEZONE) "); 
      builder.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
    
//   PreparedStatement ps = conn.prepareStatement("INSERT INTO IP_COUNTRY (ip_from, ip_to, country_code, region_name, city_name, city_zip, latitude, longitude, timezone) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
      PreparedStatement ps = conn.prepareStatement(builder.toString()); 
    
   BufferedReader br = new BufferedReader(new FileReader(filename)); 
   CSVReader reader = new CSVReader(br, ',', '\"'); 
    
//   Scanner scanner = new Scanner(new FileReader(filename)); 
//   boolean firstLine = true; 
   int count = 0
   String [] values; 
   while ((values = reader.readNext()) != null) { 
    ps.setLong(1, Long.valueOf(values[0])); 
    ps.setLong(2, Long.valueOf(values[1])); 
    ps.setString(3, values[2]); 
    ps.setString(4, values[3]); 
    ps.setString(5, values[4]); 
    ps.setString(6, values[5]); 
    ps.setDouble(7, values[6].equals("-") ? 0 : Double.valueOf(values[6])); 
    ps.setDouble(8, values[7].equals("-") ? 0 : Double.valueOf(values[7])); 
    ps.setString(9, values[8]); 
    ps.setString(10, values[9]); 
 
    ps.execute(); 
    count++; 
   
   System.out.println(count + " Eintr�ge importiert"); 
    
   ps.close(); 
  catch (Exception e) { 
   e.printStackTrace(); 
  finally { 
   try { 
    conn.close(); 
   catch (Exception e) { 
    e.printStackTrace(); 
   
  
 
  
 public Location searchIp(String ip) { 
  Connection conn = null
  Statement stat = null
  try { 
   conn = poolMgr.getConnection(); 
   stat = conn.createStatement(); 
          
         long inetAton = ValidateIP.ip2long(ip); 
          
         String query = "SELECT * FROM IP_COUNTRY WHERE ipFROM <= " + inetAton + " ORDER BY ipFROM DESC LIMIT 1"
          
//         String query = "SELECT * FROM IP_COUNTRY WHERE " + inetAton + " BETWEEN ipFROM AND ipTO"; 
          
         ResultSet result = stat.executeQuery(query); 
          
         while (result.next()) { 
          String c = result.getString("countrySHORT"); 
          String rn = result.getString("ipREGION"); 
          String cn = result.getString("ipCITY"); 
           
          String lat = result.getString("ipLATITUDE"); 
          String lng = result.getString("ipLONGITUDE"); 
           
          Location loc = new Location(c, rn, cn, lat, lng); 
          return loc; 
         } 
          
         return Location.UNKNOWN; 
  catch (Exception e) { 
   e.printStackTrace(); 
  finally { 
   try { 
    conn.close(); 
    stat.close(); 
   catch (Exception e) { 
    e.printStackTrace(); 
   
  
   
  return null
 
  
 public String mtrim (String text) { 
  if (text.startsWith("\"")) { 
   text = text.substring(1); 
  
  if (text.endsWith("\"")) { 
   text = text.substring(0, text.length()-1); 
  
  return text; 
 
}