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 }