Skip to main content

UpsertSpec

Struct UpsertSpec 

Source
pub struct UpsertSpec {
    pub table: &'static str,
    pub rows: Vec<Row>,
    pub conflict_key: Option<&'static str>,
    pub exclude_from_update: Vec<&'static str>,
    pub update_guard: Option<UpsertGuard>,
    pub version_column: Option<&'static str>,
}
Expand description

BatchUpsert 规格

§MAJ-5 修复

table 和 conflict_key 改为 &'static str,消除热路径的运行时 String 分配。 表名和冲突键都是编译期已知的常量(示例 “message”、“temporary_id”——core 不解释含义), "message".to_string() 每次消息落库都产生一次堆分配,改为静态引用零成本。

注意:conflict_key 的具体值(如 "temporary_id")由 ACL-1 在 helix-im 侧提供, helix-core 只传递字符串,不理解其含义。

Fields§

§table: &'static str

目标表名(编译期常量,如 “message”)

§rows: Vec<Row>§conflict_key: Option<&'static str>

ON CONFLICT 的列名(如 ACL-1 提供 “temporary_id”;core 不知道含义)

§exclude_from_update: Vec<&'static str>

冲突时不更新的列(INSERT 仍写其字面值,ON CONFLICT DO UPDATE 排除它们)。

用途:守卫列 / 本地维护列——新行用提供的字面值,但已存在的行保留既有值 (“server 缺省 → 回退本地“语义在 upsert 层表达,无需先读后写)。列名编译期常量, driver 不解释含义(守 HX-C001)。空 = 旧行为(除 conflict_key 外全列更新)。

默认空:用 UpsertSpec::new(...) 构造可零改动迁移既有调用方。

§update_guard: Option<UpsertGuard>

可选的冲突行更新守卫;仅原行该列 IS expected 时允许 DO UPDATE。

守卫值走绑定参数,不进入 SQL 文本。缺行时仍按普通 INSERT 处理,因此调用方可用 SqlValue::Null 表达“没有旧版本”的并发插入守卫。带守卫的规格只允许一个 row。

§version_column: Option<&'static str>

Optional orderable column: skip conflicting rows whose stored version is greater. Values must have a consistent SQL type; missing/NULL stored versions admit initialization. With an update_guard, a skipped row instead returns a conflict and rolls back the transaction.

Implementations§

Source§

impl UpsertSpec

Source

pub fn new( table: &'static str, rows: Vec<Row>, conflict_key: Option<&'static str>, ) -> Self

便捷构造(无排除列,旧默认行为)——既有调用方零改动迁移点。

Trait Implementations§

Source§

impl Clone for UpsertSpec

Source§

fn clone(&self) -> UpsertSpec

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UpsertSpec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<T> MaybeSync for T
where T: Sync,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more