backbeat_sdk 0.5.0-beta

The library for interfacing with Backbeat.
use backbeat_core::AssetId;

use crate::Result;
use crate::store::{Backbeat, StoreError};
use crate::util::BLOCK;

pub fn store_asset_unchecked(store: &Backbeat, asset: AssetId, data: &[u8]) -> Result<()> {
	BLOCK(store_asset_unchecked_async(store, asset, data))
}

async fn store_asset_unchecked_async(store: &Backbeat, asset: AssetId, data: &[u8]) -> Result<()> {
	let size = data.len() as i64;
	let inline = store
		.config
		.read()
		.store
		.inline
		.as_usize()
		.map_err(|_| StoreError::Corrupt("store.inline exceeds platform limit".into()))?;

	if data.len() <= inline {
		sqlx::query!(
			"INSERT OR IGNORE INTO downloaded_asset (sha256, size, inline_data) VALUES (?1, ?2, ?3)",
			asset,
			size,
			data,
		)
		.execute(&store.pool)
		.await?;
	} else {
		store.assets.store(asset, data)?;
		sqlx::query!(
			"INSERT OR IGNORE INTO downloaded_asset (sha256, size, inline_data) VALUES (?1, ?2, NULL)",
			asset,
			size,
		)
		.execute(&store.pool)
		.await?;
	}

	Ok(())
}