Primi passi: come "mappare" record e puntatori del C

di il
2 risposte

Primi passi: come "mappare" record e puntatori del C

Ciao Forum,

Spesse volte mi verrebbe comodo un database per i piccoli software che mi trovo ogni tanto a scrivere. Trovo molto comodo SQLite perché non ha dipendenze esterne e gcc lo digerisce senza problemi ma credo che la cosa sia ininfluente per quanto vado a chiedere.

Orbene, quello su cui sto lavorando adesso è un programmino che tra le altre cose legge un elenco di files e calcola un valore hash di ciascuno; mi farebbe comodo memorizzare ogni nuovo valore in un database in modo da poter recuperare quelli già calcolati in caso di crash. Le strutture dati sono essenzialmente 1) Una lista di tutte le stringhe dei pathnames non uguali e 2) Una lista di records, uno per ciascun file. Questo record contiene un puntatore alla stringa del pathname.

Ora, non so come organizzare le corrispondenti tabelle del database. Gli esempi che trovo in giro sulle forme normali e cose così non mi aiutano perché con la join e una opportuna query posso sì ottenere il nome file completo di path ma poi dovrei nuovamente scomporlo con le conseguenze del caso. So che è sicuramente possibile fare in modo che una query opportuna mi restituisca l'indice del record del nome del path e forse ne verrei a capo.

Però sono sicuro che sia una soluzione rozza e non è tanto facile fare esperimenti con SQLite, dato che il meccanismo di accesso, con le relative funzioni callback è molto farraginoso alla lettura e comporta una discreta quantità di codice. Per questo chiedo a voi se esistono strade già collaudate per affrontare questo tipo di problema, senza che io reinventi una ruota nemmeno troppo rotonda.

In genere, come si fa in casi come questo? Ovviamente mi interessa ricostruire la struttura dati in RAM e soprattutto poi aggiornare il database con le nuove relazioni e valori. Chiedo solo la metodologia di approccio, poi se mi incasino sui dettagli faccio sempre in tempo a chiedere nuovamente.

Grazie mille per ogni suggerimento

A

2 Risposte

  • Re: Primi passi: come "mappare" record e puntatori del C

    Manca un'informazione fondamentale: di quanti file stai parlando? 1000/100.000?
    Fino a 1000 o anche 10.000 elementi, ti potrebbe bastare un banale file ASCII per la memorizzazione ed una mappa STL come struttura dati per l'interrogazione.

    Un'alternativa e' usare i meccanismi di serializzazione/deserializzazionr di oggetti in memoria

    http://www.boost.org/doc/libs/1_59_0/libs/serialization/doc/index.html

    Quando serve un database relazionale?
    Quando i dati sono talmente tanti da non poter essere contenuti in memoria, ed hai la necessita' di fare delle interrogazioni complicate (e quindi ti servono le relazioni)

    I db relazionali, pero', non sono gli unici db esistenti.
    Nel tuo caso, ad esempio, potrebbe bastarti qualcosa come gdbm o berkley db: sono fondamentalmente delle mappe persistenti

    http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html


    Non esistolo soluzioni standard, perche' ci sono molti fattori da prendere in considerazione.

    Compito di un vero programmatore e non di un mangiatore di ciocori' (vecchia storiella ) e' quello di conoscere n-mila modi per fare qualcosa e scegliere di volta in volta la soluzione piu' adatta alla situazione.
  • Re: Primi passi: come "mappare" record e puntatori del C

    In effetti avevo specificato di dire che i files sono dell'ordine dei 15000 e non ho nessuna interrogazione complessa, anzi, in effetti è molto più un problema di serializzazione. Il fatto è che da bravo pigro, finché le cose non diventano pesanti uso il C++ come il C e tendo a non scrivere costruttori di copia, funzioni di serializzazione e cose così. Pur vero che si possono sempre aggiungere...

    Però direi che a questo punto posso escludere il database e perfezionerò quella parte di codice che già esiste, che usa un file temporaneo binario.

    grazie ancora e a presto!

    A
Devi accedere o registrarti per scrivere nel forum
2 risposte