Newsgroup: it.comp.programmare
Titolo: Formato per memorizzare le news

Devo realizzare un newsreader, non so però come memorizzare i
messaggi.
Mi vengono in mente 3 possibili soluzioni:
1 - Utilizzare un vero database, quindi avrei qualcosa di già fatto e
sicuramente con buone prestazioni. Però purtroppo non so niente di
database e l'utilizzo di un vero database aumenterebbe di molto le
dimensioni del programma finale (e io vorrei evitare questo). Forse un
vero database sarebbe anche un po' esagerato per quello che voglio
fare.
2 - Utilizzare il formato mbox, cioè un formato molto diffuso su unix
in cui i messaggi sono memorizzati in formato solo testo separati da
un header From_. Utilizzando questo formato non dovrei complicarmi la
vita inventandomi qualcosa io ed inoltre potrebbe essere utilizzato da
più programmi.
Però utilizzando questo formato se devo cancellare un messaggio devo
per forza riscrivere tutto il file e se nel file sono memorizzati dei
binari ciò significherebbe spostare magari 50 MB di dati.
3 - Crearmi un pseudo-database adatto alle mie esigenze, potrei così
avere un databse che fa esattamente quello che voglio io, niente di
più e niente di meno.
-- 
Marco Barisione (ICQ 84277092)

[...]
Ah dimenticavo, come linguaggio di programmazione userò Python, quindi
sarebbe meglio trovare qualcosa già pronto per questo linguaggio ma se
non è possibile posso comunque scrivermi un'estensione che mi permetta
di usare codice scritto ad esempio in C/C++.


 binari cio` significherebbe spostare magari 50 MB di dati.
Io  sto  cercando  di  fare  cosi`:  quando  si  cancella  il  messaggio
questo rimane  fisicamente al  suo posto,  ma viene  contrassegnato come
cancellabile. All'uscita, riscrivo tutto il  file omettendo gli articoli
che ho segnato come cancellabili. Ok,  la riscrittura va comunque fatta,
ma e` una sola.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non ho ancora capito se il mio cane e` maschio o femmina:
quando fa la pipi` si chiude in bagno

 2 - Utilizzare il formato mbox, cioč un formato molto diffuso su unix
Fossi in te valuterei anche il formato MH, "evoluzione" del mbox che
mette ogni messaggio in un file numerato. Un po' quello che fa(ceva)
INN come /var/spool/news/it/comp/programmare/12345
In questo modo, ordinando in senso inverso i file (non usando l'ordine
alfabetico, pero`) hai anche l'ordine inverso di arrivo, e per
mantenere (per esempio) solo gli  ultimi 100 messaggi in un ng basta
che prendi il numero piu` alto, sottrai 100 e cancelli tutti quelli
inferiori.
Questo ti evita che se per qualche motivo ti si corrompe un msg perdi
tutti i msg del gruppo, e altri problemi tipo che in un msg c'e` la
scritta From_ a inizio riga te lo vede come 2 messaggi distinti e
semplifica la gestione del tutto perche` non devi andare a scrivere su
un file temporaneo quando cancelli i messaggi vecchi per poi cancellare
l'originale e rinominare il temporaneo.
Potrei sbagliarmi, ma l'MH credo sia definito in una RFC. Prova a
cercare un po' in giro.
Bye.

mette ogni messaggio in un file numerato.
Ci avevo pensato, non ho perň specificato che che il programma
nascerebbe soprattutto per windows e non so quanto sarebbe efficiente
su questa piataforma con FAT32, onestamente penso non molto.


ma e` una sola.
Sì, se però il file è di 50 MB rimane comunque un'operazione
abbastanza costosa.
Ma se devo ricostruire i thread come faccio? Leggere tutti gli header
di tutti i file mi sembra un po' troppo lungo, pensavo ad un file
indice esterno in cui memorizzare le informazioni fondamentali sul
newsgroup. Nel file di indice vengono anche memorizzati ultima
modifica del file mbox, se questo poi ha data e ora modificati quando
viene aperto dal mio programma il file di indice viene rigenerato
perché l'archivio è stato modificato da un'altra applicazione.
Un'altra aggiunta possibile potrebbe essere non cancellare
effettivamente i messaggi cancellati ma farlo solo nel momento in cui
lo richiede l'utente (cioè se seleziona la voce di menu "compatta
database" o simile), in questo caso però il file mbox non sarebbe
condivisibile con altre applicazioni (e quindi ci sarebbe un'opzione
tipo "condividi il database con altre applicazioni").
O mi sto complicando la vita inutilmente?


>Ma se devo ricostruire i thread come faccio?
Non aggiungere altro :) c'è un ottimo articolo di Jamie Zawinski 
(programmatore principale di Netscape su Unix, membro dell'Internet 
Group - "quelli delle RFC" - e proprietario del "DNA Lounge", night club 
di San Francisco), su come il threading dei messaggi era gestito in 
Netscape 3 (e su come venne rovinato in Netscape 4):
http://www.jwz.org/doc/threading.html
Buona lettura e buona implementazione
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 dati.
No, ti fai un file "TOC" (tabella dei contenuti) a parte, e cancelli 
realmente i messaggi solo quando l'utente chiede di fare la 
"compattazione" della mailbox. Tutti i programmi fanno cosě


"compattazione" della mailbox. Tutti i programmi fanno così
Già ma se il file viene condiviso con un'altra applicazione (e questo
sarebbe un vantaggio dell'usare il formato mbox) sono costretto a
cancellare fisicamente il messaggio, altrimenti l'altra applicazione
vedrà comunque il messaggio.
Come ho già scritto in un altro messaggio potrei comunque basarmi su
un indice esterno e perché il database sia condivisibile l'utente deve
richiederlo esplicitamente attraverso un'opzione.



http://www.jwz.org/doc/threading.html
Grazie mille sto trovando anche moltissime informazioni utili (da come
generare msg-id alla gestione di mbox), consiglio di frugare in quelle
pagine a chiunque sia interessato a questi argomenti.



http://www.jwz.org/doc/threading.html
Sul sito ho anche trovato informazioni su mbox:
http://home.netscape.com/eng/mozilla/2.0/relnotes/demo/content-length.html
Ma non mi è chiara una cosa:
|In the BSD format, the only safe way to add a message to a file is to
|mangle occurrences of the ``From '' delimiter in the body of messages
|to some other string, usually ``>From ''. This is mangling, not
|quoting, because it's not a reversible process (since ``>From '' is
|not also quoted.)
Quindi se ho un "From " nel mio testo questo verrà trasformato in
">From ".
Ma da altre parti ho trovato il contrario
(
http://www.qmail.org/man/man5/mbox.html
)
|The program then copies the message, applying >From quoting
|to each line.  >From quoting ensures that the resulting
|lines are not From_ lines:  the program prepends a > to any
|From_ line, >From_ line, >>From_ line, >>>From_ line, etc.
Chi ha ragione? Nonostante quello che dice jwz a me sembra meglio la
trasformazione dei ">From " in ">>From ", in particolare non capisco
cosa vuol dire con:
|Yu may think that turning ``>From '' into ``From '' is somehow more
|harmless than turning ``From '' into ``>From '', but I don't see why. 
|
|For example, consider the case of a message with a clear-signed
|cryptographic signature (multipart/signed, say.) Any change to the
|body will cause the signature verification to fail. Now, suppose that
|the software doing the signing, being aware of the prevalence of
|From-mangling, were to do that mangling before signing. This would
|interoperate perfectly with software that did mangling in the
|traditional way (like, say... sendmail, or /bin/Mail).


 Chi ha ragione? 
da man 5 mbox:
       There are two different quoting schemes, the first (mboxo)
       only quotes plain "From " lines in the body by  prepending
       a  '>'  to  the line; the second (mboxrd) also quotes all-
       ready quoted "From "  lines  by  prepending  a  '>'  (i.e.
       ">From  ",  ">>From  ",  ...). The later has the advantage
       that lines like
              >From the command line you can use the '-p' option
       arn't dequoted wrongly as a mboxrd-MDA would turn the line
       into
              >>From the command line you can use the '-p' option
       before storing it.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Ci sono due cose che l'uomo non puo` nascondere:
essere ubriaco ed essere innamorato.

       [...] the second (mboxrd) [...]
Io preferirei usare il secondo i programmi piů diffusi quale usano?


applicazione vedrà comunque il messaggio.
Esegui la compattazione delle mailbox automaticamente ogni volta, prima 
di uscire dal programma, allora
