package org.xapek.influxdb import java.util.Date import java.net.URI import scala.collection.JavaConversions._ import shapeless.Sized import org.apache.http.client.utils.URLEncodedUtils import org.apache.http.NameValuePair import org.xapek.influxdb.types.{InfluxIdentifier, InfluxString, InfluxNumber, InfluxDate} class InfluxdbError(val serverMessage: String) extends Exception(s"Server responded: $serverMessage") case class InfluxDB(val host: String, val port: Int = 8086, val db: String = "data", val path: String = "query", val username: String = "", val password: String = "") private case class UriNameValue(val name: String, val value: String) { def this(nvp: NameValuePair) = this(nvp.getName, nvp.getValue) } object InfluxDB { def SELECT(column: String) = { new QueryBuilderSelect(Sized[List](influxIdentifier(column))) } implicit def influxIdentifier(s: String): InfluxIdentifier = new InfluxIdentifier(s) implicit def influxString(s: String) = new InfluxString(s) implicit def influxNumber(n: Int) = new InfluxNumber(n) implicit def influxNumber(n: Double) = new InfluxNumber(n) implicit def influxDate(n: Date): InfluxDate = new InfluxDate(n) def fromUrl(url: String): InfluxDB = { val uri = new URI(url) var influxdb = new InfluxDB(uri.getHost) URLEncodedUtils.parse(uri, "UTF-8").toList .map(new UriNameValue(_)).foreach { x => x match { case UriNameValue("db", db) => influxdb = influxdb.copy(db = db) case UriNameValue("username", username) => influxdb = influxdb.copy(username = username) case UriNameValue("password", password) => influxdb = influxdb.copy(password = password) case _ => } } if (uri.getPort != -1) influxdb = influxdb.copy(port = uri.getPort) if (uri.getPath.length() > 1) influxdb = influxdb.copy(path = uri.getPath) influxdb } def col(col: String) = new InfluxIdentifier(col) def time = new InfluxIdentifier("time") }