lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

lib.rs (26268B)


      1 use radroots_replica_schema::ReplicaSchemaError;
      2 pub use radroots_sql_core::error::SqlError;
      3 pub use radroots_sql_core::{ExecOutcome, SqlExecutor};
      4 
      5 use radroots_replica_schema::farm::{
      6     IFarmCreate, IFarmCreateResolve, IFarmDelete, IFarmDeleteResolve, IFarmFindMany,
      7     IFarmFindManyResolve, IFarmFindOne, IFarmFindOneResolve, IFarmUpdate, IFarmUpdateResolve,
      8 };
      9 
     10 use radroots_replica_schema::farm_gcs_location::{
     11     IFarmGcsLocationCreate, IFarmGcsLocationCreateResolve, IFarmGcsLocationDelete,
     12     IFarmGcsLocationDeleteResolve, IFarmGcsLocationFindMany, IFarmGcsLocationFindManyResolve,
     13     IFarmGcsLocationFindOne, IFarmGcsLocationFindOneResolve, IFarmGcsLocationUpdate,
     14     IFarmGcsLocationUpdateResolve,
     15 };
     16 
     17 use radroots_replica_schema::farm_member::{
     18     IFarmMemberCreate, IFarmMemberCreateResolve, IFarmMemberDelete, IFarmMemberDeleteResolve,
     19     IFarmMemberFindMany, IFarmMemberFindManyResolve, IFarmMemberFindOne, IFarmMemberFindOneResolve,
     20     IFarmMemberUpdate, IFarmMemberUpdateResolve,
     21 };
     22 
     23 use radroots_replica_schema::farm_member_claim::{
     24     IFarmMemberClaimCreate, IFarmMemberClaimCreateResolve, IFarmMemberClaimDelete,
     25     IFarmMemberClaimDeleteResolve, IFarmMemberClaimFindMany, IFarmMemberClaimFindManyResolve,
     26     IFarmMemberClaimFindOne, IFarmMemberClaimFindOneResolve, IFarmMemberClaimUpdate,
     27     IFarmMemberClaimUpdateResolve,
     28 };
     29 
     30 use radroots_replica_schema::farm_tag::{
     31     IFarmTagCreate, IFarmTagCreateResolve, IFarmTagDelete, IFarmTagDeleteResolve, IFarmTagFindMany,
     32     IFarmTagFindManyResolve, IFarmTagFindOne, IFarmTagFindOneResolve, IFarmTagUpdate,
     33     IFarmTagUpdateResolve,
     34 };
     35 
     36 use radroots_replica_schema::gcs_location::{
     37     IGcsLocationCreate, IGcsLocationCreateResolve, IGcsLocationDelete, IGcsLocationDeleteResolve,
     38     IGcsLocationFindMany, IGcsLocationFindManyResolve, IGcsLocationFindOne,
     39     IGcsLocationFindOneResolve, IGcsLocationUpdate, IGcsLocationUpdateResolve,
     40 };
     41 
     42 use radroots_replica_schema::log_error::{
     43     ILogErrorCreate, ILogErrorCreateResolve, ILogErrorDelete, ILogErrorDeleteResolve,
     44     ILogErrorFindMany, ILogErrorFindManyResolve, ILogErrorFindOne, ILogErrorFindOneResolve,
     45     ILogErrorUpdate, ILogErrorUpdateResolve,
     46 };
     47 
     48 use radroots_replica_schema::media_image::{
     49     IMediaImageCreate, IMediaImageCreateResolve, IMediaImageDelete, IMediaImageDeleteResolve,
     50     IMediaImageFindMany, IMediaImageFindManyResolve, IMediaImageFindOne, IMediaImageFindOneResolve,
     51     IMediaImageUpdate, IMediaImageUpdateResolve,
     52 };
     53 
     54 use radroots_replica_schema::nostr_profile::{
     55     INostrProfileCreate, INostrProfileCreateResolve, INostrProfileDelete,
     56     INostrProfileDeleteResolve, INostrProfileFindMany, INostrProfileFindManyResolve,
     57     INostrProfileFindOne, INostrProfileFindOneResolve, INostrProfileUpdate,
     58     INostrProfileUpdateResolve,
     59 };
     60 
     61 use radroots_replica_schema::nostr_event_head::{
     62     INostrEventHeadCreate, INostrEventHeadCreateResolve, INostrEventHeadDelete,
     63     INostrEventHeadDeleteResolve, INostrEventHeadFindMany, INostrEventHeadFindManyResolve,
     64     INostrEventHeadFindOne, INostrEventHeadFindOneResolve, INostrEventHeadUpdate,
     65     INostrEventHeadUpdateResolve,
     66 };
     67 
     68 use radroots_replica_schema::nostr_relay::{
     69     INostrRelayCreate, INostrRelayCreateResolve, INostrRelayDelete, INostrRelayDeleteResolve,
     70     INostrRelayFindMany, INostrRelayFindManyResolve, INostrRelayFindOne, INostrRelayFindOneResolve,
     71     INostrRelayUpdate, INostrRelayUpdateResolve,
     72 };
     73 
     74 use radroots_replica_schema::trade_product::{
     75     ITradeProductCreate, ITradeProductCreateResolve, ITradeProductDelete,
     76     ITradeProductDeleteResolve, ITradeProductFindMany, ITradeProductFindManyResolve,
     77     ITradeProductFindOne, ITradeProductFindOneResolve, ITradeProductUpdate,
     78     ITradeProductUpdateResolve,
     79 };
     80 
     81 use radroots_replica_schema::plot::{
     82     IPlotCreate, IPlotCreateResolve, IPlotDelete, IPlotDeleteResolve, IPlotFindMany,
     83     IPlotFindManyResolve, IPlotFindOne, IPlotFindOneResolve, IPlotUpdate, IPlotUpdateResolve,
     84 };
     85 
     86 use radroots_replica_schema::plot_gcs_location::{
     87     IPlotGcsLocationCreate, IPlotGcsLocationCreateResolve, IPlotGcsLocationDelete,
     88     IPlotGcsLocationDeleteResolve, IPlotGcsLocationFindMany, IPlotGcsLocationFindManyResolve,
     89     IPlotGcsLocationFindOne, IPlotGcsLocationFindOneResolve, IPlotGcsLocationUpdate,
     90     IPlotGcsLocationUpdateResolve,
     91 };
     92 
     93 use radroots_replica_schema::plot_tag::{
     94     IPlotTagCreate, IPlotTagCreateResolve, IPlotTagDelete, IPlotTagDeleteResolve, IPlotTagFindMany,
     95     IPlotTagFindManyResolve, IPlotTagFindOne, IPlotTagFindOneResolve, IPlotTagUpdate,
     96     IPlotTagUpdateResolve,
     97 };
     98 
     99 use radroots_replica_schema::nostr_profile_relay::{
    100     INostrProfileRelayRelation, INostrProfileRelayResolve,
    101 };
    102 
    103 use radroots_replica_schema::trade_product_location::{
    104     ITradeProductLocationRelation, ITradeProductLocationResolve,
    105 };
    106 
    107 use radroots_replica_schema::trade_product_media::{
    108     ITradeProductMediaRelation, ITradeProductMediaResolve,
    109 };
    110 
    111 pub mod backup;
    112 pub mod export;
    113 pub mod migrations;
    114 pub mod models;
    115 pub mod query;
    116 pub use backup::{DatabaseBackup, MigrationBackup, SchemaEntry};
    117 pub use export::{
    118     REPLICA_STORE_EXPORT_VERSION, ReplicaStoreExportManifestRs, TableCount, export_manifest,
    119 };
    120 pub use models::*;
    121 pub use query::ReplicaTradeProductSummaryRow;
    122 
    123 pub struct ReplicaSql<E: SqlExecutor> {
    124     executor: E,
    125 }
    126 
    127 impl<E: SqlExecutor> ReplicaSql<E> {
    128     pub fn coverage_branch_probe(enabled: bool) -> &'static str {
    129         if enabled { "enabled" } else { "disabled" }
    130     }
    131 }
    132 
    133 impl<E: SqlExecutor> ReplicaSql<E> {
    134     pub fn new(executor: E) -> Self {
    135         Self { executor }
    136     }
    137 
    138     pub fn executor(&self) -> &E {
    139         &self.executor
    140     }
    141 
    142     pub fn migrate_up(&self) -> Result<(), SqlError> {
    143         crate::migrations::run_all_up(self.executor())
    144     }
    145 
    146     pub fn migrate_down(&self) -> Result<(), SqlError> {
    147         crate::migrations::run_all_down(self.executor())
    148     }
    149 
    150     pub fn backup_database(&self) -> Result<DatabaseBackup, SqlError> {
    151         crate::backup::export_database_backup(self.executor())
    152     }
    153 
    154     pub fn backup_database_json(&self) -> Result<String, SqlError> {
    155         crate::backup::export_database_backup_json(self.executor())
    156     }
    157 
    158     pub fn restore_database(&self, backup: &DatabaseBackup) -> Result<(), SqlError> {
    159         crate::backup::restore_database_backup(self.executor(), backup)
    160     }
    161 
    162     pub fn restore_database_json(&self, backup_json: &str) -> Result<(), SqlError> {
    163         crate::backup::restore_database_backup_json(self.executor(), backup_json)
    164     }
    165 
    166     pub fn farm_create(
    167         &self,
    168         opts: &IFarmCreate,
    169     ) -> Result<IFarmCreateResolve, ReplicaSchemaError<SqlError>> {
    170         models::farm::create(self.executor(), opts)
    171     }
    172 
    173     pub fn farm_find_many(
    174         &self,
    175         opts: &IFarmFindMany,
    176     ) -> Result<IFarmFindManyResolve, ReplicaSchemaError<SqlError>> {
    177         models::farm::find_many(self.executor(), opts)
    178     }
    179 
    180     pub fn farm_find_one(
    181         &self,
    182         opts: &IFarmFindOne,
    183     ) -> Result<IFarmFindOneResolve, ReplicaSchemaError<SqlError>> {
    184         models::farm::find_one(self.executor(), opts)
    185     }
    186 
    187     pub fn farm_update(
    188         &self,
    189         opts: &IFarmUpdate,
    190     ) -> Result<IFarmUpdateResolve, ReplicaSchemaError<SqlError>> {
    191         models::farm::update(self.executor(), opts)
    192     }
    193 
    194     pub fn farm_delete(
    195         &self,
    196         opts: &IFarmDelete,
    197     ) -> Result<IFarmDeleteResolve, ReplicaSchemaError<SqlError>> {
    198         models::farm::delete(self.executor(), opts)
    199     }
    200 
    201     pub fn plot_create(
    202         &self,
    203         opts: &IPlotCreate,
    204     ) -> Result<IPlotCreateResolve, ReplicaSchemaError<SqlError>> {
    205         models::plot::create(self.executor(), opts)
    206     }
    207 
    208     pub fn plot_find_many(
    209         &self,
    210         opts: &IPlotFindMany,
    211     ) -> Result<IPlotFindManyResolve, ReplicaSchemaError<SqlError>> {
    212         models::plot::find_many(self.executor(), opts)
    213     }
    214 
    215     pub fn plot_find_one(
    216         &self,
    217         opts: &IPlotFindOne,
    218     ) -> Result<IPlotFindOneResolve, ReplicaSchemaError<SqlError>> {
    219         models::plot::find_one(self.executor(), opts)
    220     }
    221 
    222     pub fn plot_update(
    223         &self,
    224         opts: &IPlotUpdate,
    225     ) -> Result<IPlotUpdateResolve, ReplicaSchemaError<SqlError>> {
    226         models::plot::update(self.executor(), opts)
    227     }
    228 
    229     pub fn plot_delete(
    230         &self,
    231         opts: &IPlotDelete,
    232     ) -> Result<IPlotDeleteResolve, ReplicaSchemaError<SqlError>> {
    233         models::plot::delete(self.executor(), opts)
    234     }
    235 
    236     pub fn gcs_location_create(
    237         &self,
    238         opts: &IGcsLocationCreate,
    239     ) -> Result<IGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> {
    240         models::gcs_location::create(self.executor(), opts)
    241     }
    242 
    243     pub fn gcs_location_find_many(
    244         &self,
    245         opts: &IGcsLocationFindMany,
    246     ) -> Result<IGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> {
    247         models::gcs_location::find_many(self.executor(), opts)
    248     }
    249 
    250     pub fn gcs_location_find_one(
    251         &self,
    252         opts: &IGcsLocationFindOne,
    253     ) -> Result<IGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> {
    254         models::gcs_location::find_one(self.executor(), opts)
    255     }
    256 
    257     pub fn gcs_location_update(
    258         &self,
    259         opts: &IGcsLocationUpdate,
    260     ) -> Result<IGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> {
    261         models::gcs_location::update(self.executor(), opts)
    262     }
    263 
    264     pub fn gcs_location_delete(
    265         &self,
    266         opts: &IGcsLocationDelete,
    267     ) -> Result<IGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> {
    268         models::gcs_location::delete(self.executor(), opts)
    269     }
    270 
    271     pub fn farm_gcs_location_create(
    272         &self,
    273         opts: &IFarmGcsLocationCreate,
    274     ) -> Result<IFarmGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> {
    275         models::farm_gcs_location::create(self.executor(), opts)
    276     }
    277 
    278     pub fn farm_gcs_location_find_many(
    279         &self,
    280         opts: &IFarmGcsLocationFindMany,
    281     ) -> Result<IFarmGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> {
    282         models::farm_gcs_location::find_many(self.executor(), opts)
    283     }
    284 
    285     pub fn farm_gcs_location_find_one(
    286         &self,
    287         opts: &IFarmGcsLocationFindOne,
    288     ) -> Result<IFarmGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> {
    289         models::farm_gcs_location::find_one(self.executor(), opts)
    290     }
    291 
    292     pub fn farm_gcs_location_update(
    293         &self,
    294         opts: &IFarmGcsLocationUpdate,
    295     ) -> Result<IFarmGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> {
    296         models::farm_gcs_location::update(self.executor(), opts)
    297     }
    298 
    299     pub fn farm_gcs_location_delete(
    300         &self,
    301         opts: &IFarmGcsLocationDelete,
    302     ) -> Result<IFarmGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> {
    303         models::farm_gcs_location::delete(self.executor(), opts)
    304     }
    305 
    306     pub fn plot_gcs_location_create(
    307         &self,
    308         opts: &IPlotGcsLocationCreate,
    309     ) -> Result<IPlotGcsLocationCreateResolve, ReplicaSchemaError<SqlError>> {
    310         models::plot_gcs_location::create(self.executor(), opts)
    311     }
    312 
    313     pub fn plot_gcs_location_find_many(
    314         &self,
    315         opts: &IPlotGcsLocationFindMany,
    316     ) -> Result<IPlotGcsLocationFindManyResolve, ReplicaSchemaError<SqlError>> {
    317         models::plot_gcs_location::find_many(self.executor(), opts)
    318     }
    319 
    320     pub fn plot_gcs_location_find_one(
    321         &self,
    322         opts: &IPlotGcsLocationFindOne,
    323     ) -> Result<IPlotGcsLocationFindOneResolve, ReplicaSchemaError<SqlError>> {
    324         models::plot_gcs_location::find_one(self.executor(), opts)
    325     }
    326 
    327     pub fn plot_gcs_location_update(
    328         &self,
    329         opts: &IPlotGcsLocationUpdate,
    330     ) -> Result<IPlotGcsLocationUpdateResolve, ReplicaSchemaError<SqlError>> {
    331         models::plot_gcs_location::update(self.executor(), opts)
    332     }
    333 
    334     pub fn plot_gcs_location_delete(
    335         &self,
    336         opts: &IPlotGcsLocationDelete,
    337     ) -> Result<IPlotGcsLocationDeleteResolve, ReplicaSchemaError<SqlError>> {
    338         models::plot_gcs_location::delete(self.executor(), opts)
    339     }
    340 
    341     pub fn farm_tag_create(
    342         &self,
    343         opts: &IFarmTagCreate,
    344     ) -> Result<IFarmTagCreateResolve, ReplicaSchemaError<SqlError>> {
    345         models::farm_tag::create(self.executor(), opts)
    346     }
    347 
    348     pub fn farm_tag_find_many(
    349         &self,
    350         opts: &IFarmTagFindMany,
    351     ) -> Result<IFarmTagFindManyResolve, ReplicaSchemaError<SqlError>> {
    352         models::farm_tag::find_many(self.executor(), opts)
    353     }
    354 
    355     pub fn farm_tag_find_one(
    356         &self,
    357         opts: &IFarmTagFindOne,
    358     ) -> Result<IFarmTagFindOneResolve, ReplicaSchemaError<SqlError>> {
    359         models::farm_tag::find_one(self.executor(), opts)
    360     }
    361 
    362     pub fn farm_tag_update(
    363         &self,
    364         opts: &IFarmTagUpdate,
    365     ) -> Result<IFarmTagUpdateResolve, ReplicaSchemaError<SqlError>> {
    366         models::farm_tag::update(self.executor(), opts)
    367     }
    368 
    369     pub fn farm_tag_delete(
    370         &self,
    371         opts: &IFarmTagDelete,
    372     ) -> Result<IFarmTagDeleteResolve, ReplicaSchemaError<SqlError>> {
    373         models::farm_tag::delete(self.executor(), opts)
    374     }
    375 
    376     pub fn plot_tag_create(
    377         &self,
    378         opts: &IPlotTagCreate,
    379     ) -> Result<IPlotTagCreateResolve, ReplicaSchemaError<SqlError>> {
    380         models::plot_tag::create(self.executor(), opts)
    381     }
    382 
    383     pub fn plot_tag_find_many(
    384         &self,
    385         opts: &IPlotTagFindMany,
    386     ) -> Result<IPlotTagFindManyResolve, ReplicaSchemaError<SqlError>> {
    387         models::plot_tag::find_many(self.executor(), opts)
    388     }
    389 
    390     pub fn plot_tag_find_one(
    391         &self,
    392         opts: &IPlotTagFindOne,
    393     ) -> Result<IPlotTagFindOneResolve, ReplicaSchemaError<SqlError>> {
    394         models::plot_tag::find_one(self.executor(), opts)
    395     }
    396 
    397     pub fn plot_tag_update(
    398         &self,
    399         opts: &IPlotTagUpdate,
    400     ) -> Result<IPlotTagUpdateResolve, ReplicaSchemaError<SqlError>> {
    401         models::plot_tag::update(self.executor(), opts)
    402     }
    403 
    404     pub fn plot_tag_delete(
    405         &self,
    406         opts: &IPlotTagDelete,
    407     ) -> Result<IPlotTagDeleteResolve, ReplicaSchemaError<SqlError>> {
    408         models::plot_tag::delete(self.executor(), opts)
    409     }
    410 
    411     pub fn farm_member_create(
    412         &self,
    413         opts: &IFarmMemberCreate,
    414     ) -> Result<IFarmMemberCreateResolve, ReplicaSchemaError<SqlError>> {
    415         models::farm_member::create(self.executor(), opts)
    416     }
    417 
    418     pub fn farm_member_find_many(
    419         &self,
    420         opts: &IFarmMemberFindMany,
    421     ) -> Result<IFarmMemberFindManyResolve, ReplicaSchemaError<SqlError>> {
    422         models::farm_member::find_many(self.executor(), opts)
    423     }
    424 
    425     pub fn farm_member_find_one(
    426         &self,
    427         opts: &IFarmMemberFindOne,
    428     ) -> Result<IFarmMemberFindOneResolve, ReplicaSchemaError<SqlError>> {
    429         models::farm_member::find_one(self.executor(), opts)
    430     }
    431 
    432     pub fn farm_member_update(
    433         &self,
    434         opts: &IFarmMemberUpdate,
    435     ) -> Result<IFarmMemberUpdateResolve, ReplicaSchemaError<SqlError>> {
    436         models::farm_member::update(self.executor(), opts)
    437     }
    438 
    439     pub fn farm_member_delete(
    440         &self,
    441         opts: &IFarmMemberDelete,
    442     ) -> Result<IFarmMemberDeleteResolve, ReplicaSchemaError<SqlError>> {
    443         models::farm_member::delete(self.executor(), opts)
    444     }
    445 
    446     pub fn farm_member_claim_create(
    447         &self,
    448         opts: &IFarmMemberClaimCreate,
    449     ) -> Result<IFarmMemberClaimCreateResolve, ReplicaSchemaError<SqlError>> {
    450         models::farm_member_claim::create(self.executor(), opts)
    451     }
    452 
    453     pub fn farm_member_claim_find_many(
    454         &self,
    455         opts: &IFarmMemberClaimFindMany,
    456     ) -> Result<IFarmMemberClaimFindManyResolve, ReplicaSchemaError<SqlError>> {
    457         models::farm_member_claim::find_many(self.executor(), opts)
    458     }
    459 
    460     pub fn farm_member_claim_find_one(
    461         &self,
    462         opts: &IFarmMemberClaimFindOne,
    463     ) -> Result<IFarmMemberClaimFindOneResolve, ReplicaSchemaError<SqlError>> {
    464         models::farm_member_claim::find_one(self.executor(), opts)
    465     }
    466 
    467     pub fn farm_member_claim_update(
    468         &self,
    469         opts: &IFarmMemberClaimUpdate,
    470     ) -> Result<IFarmMemberClaimUpdateResolve, ReplicaSchemaError<SqlError>> {
    471         models::farm_member_claim::update(self.executor(), opts)
    472     }
    473 
    474     pub fn farm_member_claim_delete(
    475         &self,
    476         opts: &IFarmMemberClaimDelete,
    477     ) -> Result<IFarmMemberClaimDeleteResolve, ReplicaSchemaError<SqlError>> {
    478         models::farm_member_claim::delete(self.executor(), opts)
    479     }
    480 
    481     pub fn log_error_create(
    482         &self,
    483         opts: &ILogErrorCreate,
    484     ) -> Result<ILogErrorCreateResolve, ReplicaSchemaError<SqlError>> {
    485         models::log_error::create(self.executor(), opts)
    486     }
    487 
    488     pub fn log_error_find_many(
    489         &self,
    490         opts: &ILogErrorFindMany,
    491     ) -> Result<ILogErrorFindManyResolve, ReplicaSchemaError<SqlError>> {
    492         models::log_error::find_many(self.executor(), opts)
    493     }
    494 
    495     pub fn log_error_find_one(
    496         &self,
    497         opts: &ILogErrorFindOne,
    498     ) -> Result<ILogErrorFindOneResolve, ReplicaSchemaError<SqlError>> {
    499         models::log_error::find_one(self.executor(), opts)
    500     }
    501 
    502     pub fn log_error_update(
    503         &self,
    504         opts: &ILogErrorUpdate,
    505     ) -> Result<ILogErrorUpdateResolve, ReplicaSchemaError<SqlError>> {
    506         models::log_error::update(self.executor(), opts)
    507     }
    508 
    509     pub fn log_error_delete(
    510         &self,
    511         opts: &ILogErrorDelete,
    512     ) -> Result<ILogErrorDeleteResolve, ReplicaSchemaError<SqlError>> {
    513         models::log_error::delete(self.executor(), opts)
    514     }
    515 
    516     pub fn media_image_create(
    517         &self,
    518         opts: &IMediaImageCreate,
    519     ) -> Result<IMediaImageCreateResolve, ReplicaSchemaError<SqlError>> {
    520         models::media_image::create(self.executor(), opts)
    521     }
    522 
    523     pub fn media_image_find_many(
    524         &self,
    525         opts: &IMediaImageFindMany,
    526     ) -> Result<IMediaImageFindManyResolve, ReplicaSchemaError<SqlError>> {
    527         models::media_image::find_many(self.executor(), opts)
    528     }
    529 
    530     pub fn media_image_find_one(
    531         &self,
    532         opts: &IMediaImageFindOne,
    533     ) -> Result<IMediaImageFindOneResolve, ReplicaSchemaError<SqlError>> {
    534         models::media_image::find_one(self.executor(), opts)
    535     }
    536 
    537     pub fn media_image_update(
    538         &self,
    539         opts: &IMediaImageUpdate,
    540     ) -> Result<IMediaImageUpdateResolve, ReplicaSchemaError<SqlError>> {
    541         models::media_image::update(self.executor(), opts)
    542     }
    543 
    544     pub fn media_image_delete(
    545         &self,
    546         opts: &IMediaImageDelete,
    547     ) -> Result<IMediaImageDeleteResolve, ReplicaSchemaError<SqlError>> {
    548         models::media_image::delete(self.executor(), opts)
    549     }
    550 
    551     pub fn nostr_profile_create(
    552         &self,
    553         opts: &INostrProfileCreate,
    554     ) -> Result<INostrProfileCreateResolve, ReplicaSchemaError<SqlError>> {
    555         models::nostr_profile::create(self.executor(), opts)
    556     }
    557 
    558     pub fn nostr_profile_find_many(
    559         &self,
    560         opts: &INostrProfileFindMany,
    561     ) -> Result<INostrProfileFindManyResolve, ReplicaSchemaError<SqlError>> {
    562         models::nostr_profile::find_many(self.executor(), opts)
    563     }
    564 
    565     pub fn nostr_profile_find_one(
    566         &self,
    567         opts: &INostrProfileFindOne,
    568     ) -> Result<INostrProfileFindOneResolve, ReplicaSchemaError<SqlError>> {
    569         models::nostr_profile::find_one(self.executor(), opts)
    570     }
    571 
    572     pub fn nostr_profile_update(
    573         &self,
    574         opts: &INostrProfileUpdate,
    575     ) -> Result<INostrProfileUpdateResolve, ReplicaSchemaError<SqlError>> {
    576         models::nostr_profile::update(self.executor(), opts)
    577     }
    578 
    579     pub fn nostr_profile_delete(
    580         &self,
    581         opts: &INostrProfileDelete,
    582     ) -> Result<INostrProfileDeleteResolve, ReplicaSchemaError<SqlError>> {
    583         models::nostr_profile::delete(self.executor(), opts)
    584     }
    585 
    586     pub fn nostr_event_head_create(
    587         &self,
    588         opts: &INostrEventHeadCreate,
    589     ) -> Result<INostrEventHeadCreateResolve, ReplicaSchemaError<SqlError>> {
    590         models::nostr_event_head::create(self.executor(), opts)
    591     }
    592 
    593     pub fn nostr_event_head_find_many(
    594         &self,
    595         opts: &INostrEventHeadFindMany,
    596     ) -> Result<INostrEventHeadFindManyResolve, ReplicaSchemaError<SqlError>> {
    597         models::nostr_event_head::find_many(self.executor(), opts)
    598     }
    599 
    600     pub fn nostr_event_head_find_one(
    601         &self,
    602         opts: &INostrEventHeadFindOne,
    603     ) -> Result<INostrEventHeadFindOneResolve, ReplicaSchemaError<SqlError>> {
    604         models::nostr_event_head::find_one(self.executor(), opts)
    605     }
    606 
    607     pub fn nostr_event_head_update(
    608         &self,
    609         opts: &INostrEventHeadUpdate,
    610     ) -> Result<INostrEventHeadUpdateResolve, ReplicaSchemaError<SqlError>> {
    611         models::nostr_event_head::update(self.executor(), opts)
    612     }
    613 
    614     pub fn nostr_event_head_delete(
    615         &self,
    616         opts: &INostrEventHeadDelete,
    617     ) -> Result<INostrEventHeadDeleteResolve, ReplicaSchemaError<SqlError>> {
    618         models::nostr_event_head::delete(self.executor(), opts)
    619     }
    620 
    621     pub fn nostr_relay_create(
    622         &self,
    623         opts: &INostrRelayCreate,
    624     ) -> Result<INostrRelayCreateResolve, ReplicaSchemaError<SqlError>> {
    625         models::nostr_relay::create(self.executor(), opts)
    626     }
    627 
    628     pub fn nostr_relay_find_many(
    629         &self,
    630         opts: &INostrRelayFindMany,
    631     ) -> Result<INostrRelayFindManyResolve, ReplicaSchemaError<SqlError>> {
    632         models::nostr_relay::find_many(self.executor(), opts)
    633     }
    634 
    635     pub fn nostr_relay_find_one(
    636         &self,
    637         opts: &INostrRelayFindOne,
    638     ) -> Result<INostrRelayFindOneResolve, ReplicaSchemaError<SqlError>> {
    639         models::nostr_relay::find_one(self.executor(), opts)
    640     }
    641 
    642     pub fn nostr_relay_update(
    643         &self,
    644         opts: &INostrRelayUpdate,
    645     ) -> Result<INostrRelayUpdateResolve, ReplicaSchemaError<SqlError>> {
    646         models::nostr_relay::update(self.executor(), opts)
    647     }
    648 
    649     pub fn nostr_relay_delete(
    650         &self,
    651         opts: &INostrRelayDelete,
    652     ) -> Result<INostrRelayDeleteResolve, ReplicaSchemaError<SqlError>> {
    653         models::nostr_relay::delete(self.executor(), opts)
    654     }
    655 
    656     pub fn trade_product_create(
    657         &self,
    658         opts: &ITradeProductCreate,
    659     ) -> Result<ITradeProductCreateResolve, ReplicaSchemaError<SqlError>> {
    660         models::trade_product::create(self.executor(), opts)
    661     }
    662 
    663     pub fn trade_product_find_many(
    664         &self,
    665         opts: &ITradeProductFindMany,
    666     ) -> Result<ITradeProductFindManyResolve, ReplicaSchemaError<SqlError>> {
    667         models::trade_product::find_many(self.executor(), opts)
    668     }
    669 
    670     pub fn trade_product_find_one(
    671         &self,
    672         opts: &ITradeProductFindOne,
    673     ) -> Result<ITradeProductFindOneResolve, ReplicaSchemaError<SqlError>> {
    674         models::trade_product::find_one(self.executor(), opts)
    675     }
    676 
    677     pub fn trade_product_update(
    678         &self,
    679         opts: &ITradeProductUpdate,
    680     ) -> Result<ITradeProductUpdateResolve, ReplicaSchemaError<SqlError>> {
    681         models::trade_product::update(self.executor(), opts)
    682     }
    683 
    684     pub fn trade_product_delete(
    685         &self,
    686         opts: &ITradeProductDelete,
    687     ) -> Result<ITradeProductDeleteResolve, ReplicaSchemaError<SqlError>> {
    688         models::trade_product::delete(self.executor(), opts)
    689     }
    690 
    691     pub fn nostr_profile_relay_set(
    692         &self,
    693         opts: &INostrProfileRelayRelation,
    694     ) -> Result<INostrProfileRelayResolve, ReplicaSchemaError<SqlError>> {
    695         models::nostr_profile_relay::set(self.executor(), opts)
    696     }
    697 
    698     pub fn nostr_profile_relay_unset(
    699         &self,
    700         opts: &INostrProfileRelayRelation,
    701     ) -> Result<INostrProfileRelayResolve, ReplicaSchemaError<SqlError>> {
    702         models::nostr_profile_relay::unset(self.executor(), opts)
    703     }
    704 
    705     pub fn trade_product_location_set(
    706         &self,
    707         opts: &ITradeProductLocationRelation,
    708     ) -> Result<ITradeProductLocationResolve, ReplicaSchemaError<SqlError>> {
    709         models::trade_product_location::set(self.executor(), opts)
    710     }
    711 
    712     pub fn trade_product_location_unset(
    713         &self,
    714         opts: &ITradeProductLocationRelation,
    715     ) -> Result<ITradeProductLocationResolve, ReplicaSchemaError<SqlError>> {
    716         models::trade_product_location::unset(self.executor(), opts)
    717     }
    718 
    719     pub fn trade_product_media_set(
    720         &self,
    721         opts: &ITradeProductMediaRelation,
    722     ) -> Result<ITradeProductMediaResolve, ReplicaSchemaError<SqlError>> {
    723         models::trade_product_media::set(self.executor(), opts)
    724     }
    725 
    726     pub fn trade_product_media_unset(
    727         &self,
    728         opts: &ITradeProductMediaRelation,
    729     ) -> Result<ITradeProductMediaResolve, ReplicaSchemaError<SqlError>> {
    730         models::trade_product_media::unset(self.executor(), opts)
    731     }
    732 }
    733 
    734 #[cfg(test)]
    735 mod tests {
    736     use super::ReplicaSql;
    737     use radroots_sql_core::{ExecOutcome, SqlError, SqlExecutor};
    738 
    739     struct ProbeExecutor;
    740 
    741     impl SqlExecutor for ProbeExecutor {
    742         fn exec(&self, _sql: &str, _params_json: &str) -> Result<ExecOutcome, SqlError> {
    743             Ok(ExecOutcome {
    744                 changes: 0,
    745                 last_insert_id: 0,
    746             })
    747         }
    748 
    749         fn query_raw(&self, _sql: &str, _params_json: &str) -> Result<String, SqlError> {
    750             Ok("[]".to_string())
    751         }
    752 
    753         fn begin(&self) -> Result<(), SqlError> {
    754             Ok(())
    755         }
    756 
    757         fn commit(&self) -> Result<(), SqlError> {
    758             Ok(())
    759         }
    760 
    761         fn rollback(&self) -> Result<(), SqlError> {
    762             Ok(())
    763         }
    764     }
    765 
    766     #[test]
    767     fn replica_sql_constructor_and_executor_access_are_supported() {
    768         let db = ReplicaSql::new(ProbeExecutor);
    769         let exec = db.executor();
    770         assert!(exec.exec("select 1", "[]").is_ok());
    771         assert!(exec.query_raw("select 1", "[]").is_ok());
    772         assert!(exec.begin().is_ok());
    773         assert!(exec.commit().is_ok());
    774         assert!(exec.rollback().is_ok());
    775         assert_eq!(
    776             ReplicaSql::<ProbeExecutor>::coverage_branch_probe(true),
    777             "enabled"
    778         );
    779         assert_eq!(
    780             ReplicaSql::<ProbeExecutor>::coverage_branch_probe(false),
    781             "disabled"
    782         );
    783     }
    784 }