public async Task DeleteSeriesAsync(string seriesName, string database = null, bool throwOnMissing = false)
        {
            if (seriesName == null)
            {
                throw new ArgumentNullException("seriesName");
            }

            if (database == null)
            {
                database = this.Options.DefaultDatabase;
            }
            if (database == null)
            {
                throw new ArgumentNullException("database", "Database is null and default is not set in options");
            }

            var request = new influxApiRequest(this.Options);

            try
            {
                await request.Execute <string>("DELETE", String.Format("db/{0}/series/{1}", database, seriesName), null);
            }
            catch (WebException ex)
            {
                if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.BadRequest && throwOnMissing)
                {
                    throw new InvalidOperationException("The time series or database does not exist");
                }
            }
        }
        public async Task <List <string> > GetTimeSeriesList(string database = null)
        {
            if (database == null)
            {
                database = this.Options.DefaultDatabase;
            }
            if (database == null)
            {
                throw new ArgumentNullException("database", "Database is null and default is not set in options");
            }

            var request = new influxApiRequest(this.Options);
            var result  = await request.Execute <string>("GET", String.Format("db/{0}/series", database), null, String.Format("&q={0}", "list series"));

            var seriesAll = JsonSerializer.DeserializeFromString <apiSeries[]>(result);

            return(seriesAll.Select(s => s.Name).ToList());
        }
        public async Task <List <List <InfluxPoint> > > RunQueryAsync(string query, Schema schema, string database = null)
        {
            if (database == null)
            {
                database = this.Options.DefaultDatabase;
            }
            if (database == null)
            {
                throw new ArgumentNullException("database", "Database is null and default is not set in options");
            }

            var request = new influxApiRequest(this.Options);
            var result  = await request.Execute <string>("GET", String.Format("db/{0}/series", database), null, String.Format("&q={0}", query));

            var seriesAll = JsonSerializer.DeserializeFromString <apiSeries[]>(result);

            var toRet = new List <List <InfluxPoint> >();

            foreach (var series in seriesAll)
            {
                var thisSeries = new List <InfluxPoint>();
                foreach (var row in series.Points)
                {
                    var newPoint = new InfluxPoint
                    {
                        Time = schema.Parse <DateTime>((string)row[0])
                    };

                    for (int i = 2; i < row.Count; i++)
                    {
                        if (row[i] != null)
                        {
                            newPoint.Values.Add(series.Columns[i], schema.Parse(series.Columns[i], (string)row[i]));
                        }
                    }
                    thisSeries.Add(newPoint);
                }
                toRet.Add(thisSeries);
            }
            return(toRet);
        }
        public async Task DeleteDatabaseAsync(string databaseName, bool throwOnMissing = false)
        {
            if (databaseName == null)
            {
                throw new ArgumentNullException("databaseName");
            }

            var request = new influxApiRequest(this.Options);

            try
            {
                await request.Execute <string>("DELETE", String.Format("db/{0}", databaseName), null);
            }
            catch (WebException ex)
            {
                if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.BadRequest && throwOnMissing)
                {
                    throw new InvalidOperationException("The database does not exist");
                }
            }
        }
        public async Task CreateDatabaseAsync(string databaseName, bool throwOnExisting = false)
        {
            if (databaseName == null)
            {
                throw new ArgumentNullException("databaseName");
            }

            var request = new influxApiRequest(this.Options);

            try
            {
                await request.Execute <string>("POST", "db", JsonSerializer.SerializeToString(new InfluxDB {
                    Name = databaseName
                }));
            }
            catch (WebException ex)
            {
                if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.Conflict && throwOnExisting)
                {
                    throw new InvalidOperationException("The database already exists");
                }
            }
        }
        public async Task <IEnumerable <InfluxDB> > GetDatabaseListAsync()
        {
            var request = new influxApiRequest(this.Options);

            return(JsonSerializer.DeserializeFromString <InfluxDB[]>(await request.Execute <string>("GET", "db", null)));
        }
        public async Task WriteTimeSeries(string seriesName, IEnumerable <InfluxPoint> points, string database = null)
        {
            if (seriesName == null)
            {
                throw new ArgumentNullException("seriesName");
            }

            if (database == null)
            {
                database = this.Options.DefaultDatabase;
            }
            if (database == null)
            {
                throw new ArgumentNullException("database", "Database is null and default is not set in options");
            }

            var request = new influxApiRequest(this.Options);
            var cols    = new List <string>();

            cols.Add("time");
            var columnLookup = new Dictionary <string, int>();

            foreach (var point in points)
            {
                foreach (var val in point.Values)
                {
                    if (!columnLookup.ContainsKey(val.Key))
                    {
                        columnLookup.Add(val.Key, cols.Count);
                        cols.Add(val.Key);
                    }
                }
            }

            var vals = new List <List <object> >();

            foreach (var point in points)
            {
                var row = new List <object>();
                row.Add((long)(point.Time - unixEpoch).TotalMilliseconds);
                for (int i = 1; i < cols.Count; i++)
                {
                    object val;
                    if (!point.Values.TryGetValue(cols[i], out val))
                    {
                        row.Add(null);
                    }
                    else
                    {
                        row.Add(val);
                    }
                }
                vals.Add(row);
            }

            var data = new[] { new apiSeries
                               {
                                   Name    = seriesName,
                                   Columns = cols,
                                   Points  = vals
                               } };

            await request.Execute <string>("POST", String.Format("db/{0}/series", database), JsonSerializer.SerializeToString(data), "&time_precision=m"); //,
        }