lib

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

lib.rs (25192B)


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