sui_indexer/store/
package_resolver.rs1use std::sync::Arc;
5
6use crate::database::ConnectionPool;
7use crate::schema::objects;
8use anyhow::anyhow;
9use async_trait::async_trait;
10use diesel::ExpressionMethods;
11use diesel::QueryDsl;
12use diesel_async::RunQueryDsl;
13use move_core_types::account_address::AccountAddress;
14use sui_package_resolver::{Package, PackageStore, error::Error as PackageResolverError};
15use sui_types::object::Object;
16
17#[derive(Clone)]
19pub struct IndexerStorePackageResolver {
20 pool: ConnectionPool,
21}
22
23impl IndexerStorePackageResolver {
24 pub fn new(pool: ConnectionPool) -> Self {
25 Self { pool }
26 }
27}
28
29#[async_trait]
30impl PackageStore for IndexerStorePackageResolver {
31 async fn fetch(&self, id: AccountAddress) -> Result<Arc<Package>, PackageResolverError> {
32 let pkg = self
33 .get_package_from_db(id)
34 .await
35 .map_err(|e| PackageResolverError::Store {
36 store: "PostgresDB",
37 error: e.to_string(),
38 })?;
39 Ok(Arc::new(pkg))
40 }
41}
42
43impl IndexerStorePackageResolver {
44 async fn get_package_from_db(&self, id: AccountAddress) -> Result<Package, anyhow::Error> {
45 let mut connection = self.pool.get().await?;
46
47 let bcs = objects::dsl::objects
48 .select(objects::dsl::serialized_object)
49 .filter(objects::dsl::object_id.eq(id.to_vec()))
50 .get_result::<Vec<u8>>(&mut connection)
51 .await
52 .map_err(|e| anyhow!("Package not found in DB: {e}"))?;
53
54 let object = bcs::from_bytes::<Object>(&bcs)?;
55 Package::read_from_object(&object)
56 .map_err(|e| anyhow!("Failed parsing object to package: {e}"))
57 }
58}