Skip to content
37 changes: 30 additions & 7 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
jobs:
# this checks that the readme created from rustdoc is up to date
readmecheck:
if: false
name: README Format Check
runs-on: ubuntu-latest
steps:
Expand All @@ -20,6 +21,7 @@ jobs:

# this checks that there are no clippy lints
clippy:
if: false
name: Style Check (clippy)
runs-on: ubuntu-latest
steps:
Expand All @@ -34,6 +36,7 @@ jobs:

# this checks that the code is formatted with rustfmt
rustfmt:
if: false
name: Style Checks (rustfmt)
runs-on: ubuntu-latest
steps:
Expand All @@ -46,6 +49,7 @@ jobs:

# this tests that all unit and doc tests are successful
unit_tests:
if: false
name: Unit and Doc Tests (Rust ${{matrix.rust.name}} on ${{matrix.os}})
runs-on: ${{matrix.os}}
continue-on-error: ${{matrix.rust.nightly}}
Expand Down Expand Up @@ -94,7 +98,7 @@ jobs:
- name: Stable
toolchain: stable
nightly: false
http-backend: [curl-client, h1-client, h1-client-rustls, hyper-client, reqwest-client, reqwest-client-rustls]
http-backend: [curl-client] #, h1-client, h1-client-rustls, hyper-client, reqwest-client, reqwest-client-rustls]
services:
influxdb:
image: influxdb:1.8
Expand Down Expand Up @@ -134,15 +138,33 @@ jobs:
~/.cargo/registry
target
key: "${{runner.os}} Rust ${{steps.rust-toolchain.outputs.cachekey}}"
- name: Run tests

- name: Setup InfluxDB
uses: influxdata/influxdb-action@v3
with:
influxdb_version: 2.6.1
influxdb_start: false
# - name: Run tests
# run: |
# for test in integration_tests{,_v2}
# do
# cargo test -p influxdb --no-default-features --features 'use-serde derive ${{matrix.http-backend}}' --no-fail-fast --test $test
# done

- name: Create Org
run: |
influx org create --name testing2 --token admintoken --skip-verify --host http://localhost:2086
NEW_BUCKET_ID=$(influx bucket create --name mydb --org testing2 --token admintoken --skip-verify --host http://localhost:2086 --json | jq -r .id)
influx v1 dbrp create --db mydb --rp testing2 --org testing2 --bucket-id "$NEW_BUCKET_ID" --token admintoken --skip-verify --host http://localhost:2086

- name: Run dbrp tests
run: |
for test in integration_tests{,_v2}
do
cargo test -p influxdb --no-default-features --features 'use-serde derive ${{matrix.http-backend}}' --no-fail-fast --test $test
done
cargo test -p influxdb --no-default-features --features 'use-serde derive ${{matrix.http-backend}}' --no-fail-fast --test integration_tests_dbrp


# this uses cargo-tarpaulin to inspect the code coverage
coverage:
if: false
name: Code Coverage (stable/ubuntu-latest)
runs-on: ubuntu-latest
services:
Expand Down Expand Up @@ -202,10 +224,11 @@ jobs:

# this uploads the code coverage to github pages
pages:
if: false
runs-on: ubuntu-latest
needs:
- coverage
if: github.ref == 'refs/heads/main'
# if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
with:
Expand Down
17 changes: 17 additions & 0 deletions influxdb/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,23 @@ impl Client {
self
}

/// Add a retention policy to [`Client`](crate::Client)
///
/// This is designed for InfluxDB 2.x's backward-compatible API, which
/// maps databases and retention policies to buckets using the **database
/// and retention policy (DBRP) mapping service**.
/// See [InfluxDB Docs](https://docs.influxdata.com/influxdb/v2/reference/api/influxdb-1x/dbrp/) for more details.
#[must_use = "Creating a client is pointless unless you use it"]
pub fn with_retention_policy<S>(mut self, retention_policy: S) -> Self
where
S: Into<String>,
{
let mut with_retention_policy = self.parameters.as_ref().clone();
with_retention_policy.insert("rp", retention_policy.into());
self.parameters = Arc::new(with_retention_policy);
self
}

/// Returns the name of the database the client is using
pub fn database_name(&self) -> &str {
// safe to unwrap: we always set the database name in `Self::new`
Expand Down
7 changes: 6 additions & 1 deletion influxdb/src/query/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ where
T: TimeZone,
{
fn from(date_time: DateTime<T>) -> Self {
Timestamp::Nanoseconds(date_time.timestamp_nanos() as u128)
Timestamp::Nanoseconds(
date_time
.timestamp_nanos_opt()
.expect("value can not be represented in a timestamp with nanosecond precision.")
as u128,
)
}
}

Expand Down
2 changes: 1 addition & 1 deletion influxdb/src/query/write_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ impl Query for Vec<WriteQuery> {

fn get_type(&self) -> QueryType {
QueryType::WriteQuery(
self.get(0)
self.first()
.map(|q| q.get_precision())
// use "ms" as placeholder if query is empty
.unwrap_or_else(|| "ms".to_owned()),
Expand Down
67 changes: 67 additions & 0 deletions influxdb/tests/integration_tests_dbrp.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
extern crate influxdb;

#[path = "./utilities.rs"]
pub mod utilities;
use utilities::{assert_result_err, assert_result_ok, run_test};

use influxdb::InfluxDbWriteable;
use influxdb::{Client, Error, ReadQuery, Timestamp};

/// INTEGRATION TEST
///
/// This test case tests connection error
#[async_std::test]
#[cfg(not(tarpaulin_include))]
async fn test_no_rp() {
let client = Client::new("http://127.0.0.1:2086", "mydb").with_token("admintoken");
let read_query = ReadQuery::new("SELECT * FROM weather");
let read_result = client.query(read_query).await;
assert_result_err(&read_result);
match read_result {
Err(Error::ConnectionError { error: s }) => {
println!("NO_RP_ERROR: {}", s);
}
_ => panic!(
"Should cause a ConnectionError: {}",
read_result.unwrap_err()
),
}
}

/// INTEGRATION TEST
///
/// This test case tests using the retention policy with DBRP mapping
#[async_std::test]
#[cfg(not(tarpaulin))]
pub async fn test_authed_write_and_read_with_rp() {
run_test(
|| async move {
let client = Client::new("http://127.0.0.1:2086", "mydb")
.with_token("admintoken")
.with_retention_policy("testing2");
let write_query = Timestamp::Hours(11)
.into_query("weather")
.add_field("temperature", 82);
let write_result = client.query(&write_query).await;
assert_result_ok(&write_result);

let read_query = ReadQuery::new("SELECT * FROM weather");
let read_result = client.query(read_query).await;
assert_result_ok(&read_result);
assert!(
!read_result.unwrap().contains("error"),
"Data contained a database error"
);
},
|| async move {
let client = Client::new("http://127.0.0.1:2086", "mydb")
.with_token("admintoken")
.with_retention_policy("testing2");
let read_query = ReadQuery::new("DELETE MEASUREMENT weather");
let read_result = client.query(read_query).await;
assert_result_ok(&read_result);
assert!(!read_result.unwrap().contains("error"), "Teardown failed");
},
)
.await;
}
1 change: 0 additions & 1 deletion influxdb/tests/integration_tests_v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ use influxdb::{Client, Error, ReadQuery, Timestamp};

/// INTEGRATION TEST
///

/// This test case tests the Authentication
#[async_std::test]
#[cfg(not(tarpaulin))]
Expand Down