Assicurarsi che la configurazione di caricamento (non predefinita) sia valida

0

Sto scrivendo un dispositivo Software in cui il dispositivo deve gestire molti dati. Pertanto ha un database, su NV-Ram (memoria non volatile) o su una scheda SD.

Dato che esiste un DB che posso usare, lo uso anche per archiviare configurazioni che dovrebbero sopravvivere a riavvii o perdite di alimentazione.

Fino ad ora tutto funziona bene, ma come posso evitare le configurazioni danneggiate? Usando SQLite3, posso essere relativamente sicuro, che le modifiche non siano state salvate o siano corrette. Ma cosa succede se vengono archiviati dati errati? Questo è uno scenario fattibile.

Quali tecniche sono buone per controllare un insieme di dati per coerenza?

Finora: Con (ri) avvio del dispositivo, controllo se DB detiene una configurazione e, in caso contrario, scrivo la configurazione di default del codificatore nel DB. Ci sono molti problemi con questo, controlla solo se esiste una tabella di configurazione esistente nel DB, ma non se la tabella è valida.

Un'idea che ho avuto fino ad ora, è quella di eseguire iterazioni su default-config e controllare ogni voce in config se ha l'entrie specifica, se sì controllare per datatype, se non lanciare un errore. Tuttavia, ciò non impedirebbe i dati non validi.

Esempio:
Entry "reader-port" (porta hardware su cui è collegato un dispositivo specifico)

Tipo di dati previsti - > String (esempio: "\ ttys \ com2") Dati forniti - > String ("paoghsfodgvfnamox33")

Come puoi immaginare, questo è sbagliato.

Nota: questa domanda non è specifica per la lingua. Ma oltre a questo, sto lavorando con Lua.

    
posta Sempie 12.02.2015 - 07:42
fonte

2 risposte

1

Per proteggersi dall'immissione di dati inutili, è necessario convalidare l'input mentre l'utente lo inserisce. Nella stragrande maggioranza dei casi, il tuo input spazzatura non sarà così male come "paoghsfodgvfnamox33" per una com-port, ma una digitazione piuttosto maldestra, come "\ ttys \ comn2". Se rilevi questi errori il prima possibile, mentre l'utente sta ancora modificando la configurazione, l'utente può immediatamente correggere l'errore.

Per quanto riguarda il database che viene modificato all'esterno dell'applicazione, ci sono due linee di pensiero qui:

  1. L'utente non dovrebbe accedere / modificare direttamente il database. Se lo fanno comunque, hanno rotto il sigillo di garanzia del prodotto (in senso figurato) e sono loro stessi responsabili delle conseguenze.
    Se segui questa linea, tuttavia, non ha senso convalidare la configurazione più di quanto non faccia attualmente, poiché i test hanno dimostrato che i metodi approvati di modifica della configurazione non possono corromperlo.
  2. L'utente è autorizzato a fare tutto ciò che vuole con il database e dobbiamo essere robusti contro di esso.
    Se segui questa linea di pensiero, dovresti adottare misure aggiuntive contro valori di configurazione errati. Questo può essere semplice come provare prima il valore letto dal database e se questo non funziona, ricadere su un valore predefinito hardcoded.
    Oppure puoi aggiungere una colonna checksum alla tabella del database con i valori di configurazione. In questo modo puoi immediatamente rilevare che un valore di configurazione è cambiato fuori dal tuo controllo.
risposta data 12.02.2015 - 09:43
fonte
1

In generale, si può scrivere un checksum con i dati che possono essere ricalcolati al momento della lettura e confrontati con quelli scritti valore. Se non corrispondono, sai che c'è stato un danneggiamento dei dati (o che il tuo checksum è scaduto).

Potresti fare un ulteriore passo avanti e fornire sufficienti informazioni ridondanti per riparare la corruzione ( codici di correzione degli errori ), ma questo potrebbe essere eccessivo nel tuo caso.

Dato che stai usando un database (SQLite), generalmente fornisce i propri checksum e validazione dell'integrità dei dati internamente . Tuttavia, penso che sia improbabile leggere una stringa da esso e vedere dati confusi, come nel tuo esempio. In genere, se un file di database viene danneggiato, anche le informazioni strutturali nel file su cui si basa il database stesso sono danneggiate, quindi il database genererà (nel migliore dei casi) un errore o (nel peggiore dei casi) un arresto anomalo.

    
risposta data 12.02.2015 - 08:06
fonte

Leggi altre domande sui tag