Zackriya-Solutions/meetily · error · anyhow::Error

Failed to query transcript config: {}

Error message

Failed to query transcript config: {}

What it means

The query SELECT provider, model FROM transcript_settings WHERE id = '1' itself errored. A missing row is NOT this error - the None arm handles that by defaulting the model; this error means the query execution failed: no transcript_settings table (schema/migration missing), the database is locked, or the file is corrupt.

Source

Thrown at frontend/src-tauri/src/audio/retranscription.rs:600

    let app_state = app
        .try_state::<AppState>()
        .ok_or_else(|| {
            error!("App state not available");
            anyhow!("App state not available")
        })?;

    debug!("Querying transcript_settings table...");

    // Query the transcript settings from the database - get both provider and model
    let result: Option<(String, String)> = sqlx::query_as(
        "SELECT provider, model FROM transcript_settings WHERE id = '1'"
    )
    .fetch_optional(app_state.db_manager.pool())
    .await
    .map_err(|e| {
        error!("Failed to query transcript config: {}", e);
        anyhow!("Failed to query transcript config: {}", e)
    })?;

    match result {
        Some((provider, model)) => {
            info!("Found transcript config: provider={}, model={}", provider, model);

            // Check if provider is Whisper-based
            if provider == "localWhisper" || provider == "whisper" {
                Ok(model)
            } else {
                error!("Retranscription requires Whisper provider, but configured provider is: {}", provider);
                Err(anyhow!("Retranscription requires Whisper. Current provider '{}' does not support retranscription with language selection.", provider))
            }
        },
        None => {
            // Default to configured Whisper model if no config exists
            warn!("No transcript config found, using default model '{}'", DEFAULT_WHISPER_MODEL);
            Ok(DEFAULT_WHISPER_MODEL.to_string())

View on GitHub (pinned to 0281737d87)

Solutions

  1. Read the inner error: 'no such table: transcript_settings' means run the schema/migrations.
  2. Pass an explicit model argument to start_retranscription - the config lookup is bypassed completely.
  3. Retry when the database is not being written by another operation.
  4. Recreate or restore the database if integrity checks fail.
Defensive patterns

Strategy: validation

Validate before calling

// Check the settings table exists and is readable before the batch job
let exists: i64 = sqlx::query_scalar(
    "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='transcript_settings'"
).fetch_one(pool).await.unwrap_or(0);
if exists == 0 { /* run migrations or pass explicit model */ }

Try / catch

// Distinguish missing schema (fix) from lock (retry)
Err(e) if e.to_string().contains("no such table") => fix_schema(),
Err(e) if is_busy(&e) => retry_later(),
Err(e) => propagate(e),

Prevention

When it happens

Trigger: Database created without running migrations that create transcript_settings; another writer holds the SQLite lock at query time; corrupted DB file.

Common situations: App data directory from an older app version; first-run migration interrupted; a second app instance writing settings concurrently.

Related errors


AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16). Data as JSON: /api/errors/54c29e6660874742. Report an issue: GitHub.