Struct UpsertRecord
pub struct UpsertRecord<'a, M, PK, I>where
M: 'static,
PK: 'static,{ /* private fields */ }Implementations§
§impl<'a, M, PK, I> UpsertRecord<'a, M, PK, I>where
M: 'static,
PK: 'static,
I: UpsertModelInput<M>,
impl<'a, M, PK, I> UpsertRecord<'a, M, PK, I>where
M: 'static,
PK: 'static,
I: UpsertModelInput<M>,
pub fn on_conflict(self, target: ConflictTarget) -> UpsertRecord<'a, M, PK, I>
pub fn on_conflict(self, target: ConflictTarget) -> UpsertRecord<'a, M, PK, I>
Choose the conflict target. Defaults to the model’s primary
key; pass ConflictTarget::columns to upsert on a composite
unique key instead. The named columns must form a UNIQUE
constraint/index on the target table.
pub fn do_nothing(self) -> UpsertRecordDoNothing<'a, M, PK, I>
pub fn do_nothing(self) -> UpsertRecordDoNothing<'a, M, PK, I>
Switch this call to ON CONFLICT ... DO NOTHING semantics
(cratestack#487), independent of descriptor.upsert_update_columns:
on conflict, leave the existing row completely untouched instead
of merging upsert_update_columns into it. This is the
idempotent-insert shape ledger-style writes need — e.g. a
cash-in claim that inserts a PENDING row and treats a
conflict as “already in flight” must never let a retry’s blank
values overwrite an existing COMPLETED row’s transfer_ref.
Returns a distinct builder type rather than a flag on
UpsertRecord because the return shape genuinely changes: a
real DO NOTHING returns nothing on conflict, so the caller
needs Inserted vs Existing distinguishable in the type
(crate::UpsertOutcome) rather than collapsed into a plain
M the way .run() returns it today. Encoding that as a
separate type also means existing .upsert(..).run(..) callers
keep their Result<M, CratestackError> signature unchanged — this is
purely additive, not a behavior change for the DO UPDATE path.
pub fn preview_sql(&self) -> String
pub fn preview_sql(&self) -> String
Render an approximate SQL preview. The actual upsert wraps a
SELECT … FOR UPDATE around the INSERT … ON CONFLICT, but
this preview returns only the conflict-bearing statement.
Deliberately does NOT call ConflictTarget::validate
(cratestack#741 finding 3) — every other preview_sql() in
this codebase (find_many, create, update, delete, …)
returns a bare String, no Result, so it can never fail;
matching that established shape here means cratestack-studio’s
interactive SQL-preview tooling can keep calling it uniformly
across every builder without a special case for upsert. The
combination this would reject (a predicate on
ConflictTarget::PrimaryKey) is still caught before any SQL
runs — Self::run/Self::run_in_tx call .validate() via
prepare_upsert_insert first — so nothing unsafe executes;
only the preview string itself can show a WHERE clause paired
with a target .validate() would reject. A caller that wants to
know ahead of rendering can call .validate() on the same
ConflictTarget value passed to .on_conflict(..).
pub async fn run(self, ctx: &CratestackContext) -> Result<M, CratestackError>
pub async fn run_in_tx<'tx>(
self,
tx: &mut Transaction<'tx, Postgres>,
ctx: &CratestackContext,
) -> Result<RunInTxOutcome<M>, CratestackError>
pub async fn run_in_tx<'tx>( self, tx: &mut Transaction<'tx, Postgres>, ctx: &CratestackContext, ) -> Result<RunInTxOutcome<M>, CratestackError>
Like Self::run but participates in a caller-supplied
transaction. The conflict probe runs against tx, so the row
lock is held until the caller commits. Neither the event outbox
drain nor the AuditSink fan-out happens here — see
create.rs’s run_in_tx doc comment for the full contract and
how a caller opts into both after their own commit.
Trait Implementations§
§impl<'a, M, PK, I> Clone for UpsertRecord<'a, M, PK, I>
impl<'a, M, PK, I> Clone for UpsertRecord<'a, M, PK, I>
§fn clone(&self) -> UpsertRecord<'a, M, PK, I>
fn clone(&self) -> UpsertRecord<'a, M, PK, I>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<'a, M, PK, I> !RefUnwindSafe for UpsertRecord<'a, M, PK, I>
impl<'a, M, PK, I> !UnwindSafe for UpsertRecord<'a, M, PK, I>
impl<'a, M, PK, I> Freeze for UpsertRecord<'a, M, PK, I>where
I: Freeze,
impl<'a, M, PK, I> Send for UpsertRecord<'a, M, PK, I>where
I: Send,
impl<'a, M, PK, I> Sync for UpsertRecord<'a, M, PK, I>where
I: Sync,
impl<'a, M, PK, I> Unpin for UpsertRecord<'a, M, PK, I>where
I: Unpin,
impl<'a, M, PK, I> UnsafeUnpin for UpsertRecord<'a, M, PK, I>where
I: UnsafeUnpin,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<'src, T> IntoMaybe<'src, T> for Twhere
T: 'src,
impl<T> OrderedSeq<'_, T> for Twhere
T: Clone,
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
§type Iter<'a> = Once<&'a T>
where
T: 'a
type Iter<'a> = Once<&'a T> where T: 'a
§fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
fn contains(&self, val: &T) -> boolwhere
T: PartialEq,
§fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
fn to_maybe_ref<'b>(item: <T as Seq<'p, T>>::Item<'b>) -> Maybe<T, &'p T>where
'p: 'b,
MaybeRef].