Skip to content

Commit 99fbca4

Browse files
committed
database: store client_filter_flags as integer
1 parent d2f43c3 commit 99fbca4

File tree

5 files changed

+14
-9
lines changed

5 files changed

+14
-9
lines changed

common/src/database/postgres.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,11 @@ fn row_to_subscription(row: &Row) -> Result<SubscriptionData> {
218218
let client_filter = match client_filter_op {
219219
Some(op) => {
220220
let client_filter_kind: Option<String> = row.try_get("client_filter_kind")?;
221-
Some(ClientFilter::from(op, client_filter_kind.unwrap(), row.try_get("client_filter_flags")?, row.try_get("client_filter_targets")?)?)
221+
let client_filter_flags: Option<i32> = row.try_get("client_filter_flags")?;
222+
Some(
223+
ClientFilter::from(op, client_filter_kind.unwrap(),
224+
client_filter_flags.map(|c| c.try_into()).transpose()?, row.try_get("client_filter_targets")?)?
225+
)
222226
},
223227
None => None
224228
};
@@ -632,7 +636,7 @@ impl Database for PostgresDatabase {
632636
let max_envelope_size: i32 = subscription.max_envelope_size().try_into()?;
633637
let client_filter_op: Option<String> = subscription.client_filter().map(|f| f.operation().to_string());
634638
let client_filter_kind = subscription.client_filter().map(|f| f.kind().to_string());
635-
let client_filter_flags = subscription.client_filter().map(|f| f.flags().to_string());
639+
let client_filter_flags: Option<i32> = subscription.client_filter().map(|f| f.flags().bits().try_into()).transpose()?;
636640
let client_filter_targets = subscription.client_filter().and_then(|f| f.targets_to_opt_string());
637641

638642
let count = self

common/src/database/schema/postgres/_014_alter_client_filter_in_subscriptions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl PostgresMigration for AlterClientFilterInSubscriptionsTable {
2020
tx.execute("ALTER TABLE subscriptions ADD COLUMN client_filter_kind TEXT", &[]).await?;
2121
tx.execute("UPDATE subscriptions SET client_filter_kind = 'KerberosPrinc' WHERE client_filter_op IS NOT NULL", &[]).await?;
2222

23-
tx.execute("ALTER TABLE subscriptions ADD COLUMN client_filter_flags TEXT", &[]).await?;
23+
tx.execute("ALTER TABLE subscriptions ADD COLUMN client_filter_flags INT4", &[]).await?;
2424
Ok(())
2525
}
2626

common/src/database/schema/sqlite/_014_alter_client_filter_in_subscriptions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl SQLiteMigration for AlterClientFilterInSubscriptionsTable {
2323
conn.execute("UPDATE subscriptions SET client_filter_kind = 'KerberosPrinc' WHERE client_filter_op IS NOT NULL", [])
2424
.map_err(|err| anyhow!("SQLiteError: {}", err))?;
2525

26-
conn.execute("ALTER TABLE subscriptions ADD COLUMN client_filter_flags TEXT", [])
26+
conn.execute("ALTER TABLE subscriptions ADD COLUMN client_filter_flags INTEGER", [])
2727
.map_err(|err| anyhow!("SQLiteError: {}", err))?;
2828
Ok(())
2929
}

common/src/database/sqlite.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ impl Database for SQLiteDatabase {
557557
let subscription = subscription.clone();
558558
let client_filter_op: Option<String> = subscription.client_filter().map(|f| f.operation().to_string());
559559
let client_filter_kind = subscription.client_filter().map(|f| f.kind().to_string());
560-
let client_filter_flags = subscription.client_filter().map(|f| f.flags().to_string());
560+
let client_filter_flags = subscription.client_filter().map(|f| f.flags().bits());
561561
let client_filter_targets = subscription.client_filter().and_then(|f| f.targets_to_opt_string());
562562

563563
let count = self

common/src/subscription.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
str::FromStr,
77
};
88

9-
use anyhow::{anyhow, bail, Result};
9+
use anyhow::{anyhow, bail, Context, Result};
1010
use log::{info, warn};
1111
use serde::{Deserialize, Serialize};
1212
use strum::{Display, AsRefStr, EnumString, IntoStaticStr, VariantNames};
@@ -340,8 +340,9 @@ impl ClientFilter {
340340
Ok(Self { operation, kind, flags, targets })
341341
}
342342

343-
pub fn from(operation: String, kind: String, flags: Option<String>, targets: Option<String>) -> Result<Self> {
344-
let flags: ClientFilterFlags = bitflags::parser::from_str_strict(flags.unwrap_or_default().as_str()).map_err(|e| anyhow!("{:?}", e))?;
343+
pub fn from(operation: String, kind: String, flags: Option<u32>, targets: Option<String>) -> Result<Self> {
344+
let flags = flags.unwrap_or_default();
345+
let flags = ClientFilterFlags::from_bits(flags).context("unknown bits are set in client filter flags")?;
345346

346347
let mut clients = if flags.contains(ClientFilterFlags::GlobPattern) {
347348
ClientFilterTargets::Glob(Vec::new())
@@ -1201,7 +1202,7 @@ mod tests {
12011202

12021203
let filter = ClientFilter::from(
12031204
"only".to_string(), "TLSCertSubject".to_string(),
1204-
Some("GlobPattern | CaseInsensitive".to_string()), Some("target1,target2".to_string())
1205+
Some(0b11), Some("target1,target2".to_string())
12051206
).expect("couldn't construct client filter");
12061207

12071208
assert_eq!(*filter.operation(), ClientFilterOperation::Only);

0 commit comments

Comments
 (0)