📄 store.c
字号:
#include "mail.h"/* Store a record in the database. * Return 0 if OK * -1 if messageid is iterate */intmail_store(MAIL *mail, struct message *msg){ int keylen, datlen; off_t ptrval; _mail_gethint(msg); keylen = strlen(msg->messageid)+strlen(hint)+1;/*+1 for seperator*/ datlen = strlen(msg->content) + 1; /* +1 for newline at end */ if (datlen < DATLEN_MIN || datlen > DATLEN_MAX) err_dump("invalid data length"); /* _mail_find() calculates which hash table this new record goes into (mail->chainoff), regardless whether it already exists or not. The calls to _mail_writeptr() below change the hash table entry for this chain to point to the new record. This means the new record is added to the front of the hash chain. */ if (_mail_find(mail, msg->messageid, 1)== 0) return -1; /*record found,messageid has exist*/ else { /* record not found */ /* _mail_find() locked the hash chain for us; read the chain ptr to the first index record on hash chain */ ptrval = _mail_readptr(mail, mail->chainoff); if (_mail_findfree(mail, keylen, datlen) < 0) { /* An empty record of the correct size was not found. We have to append the new record to the ends of the index and data files */ _mail_writedat(mail, msg->content, 0, SEEK_END); _mail_writeidx(mail, msg, 0, SEEK_END, ptrval); /* mail->idxoff was set by _mail_writeidx(). The new record goes to the front of the hash chain. */ _mail_writeptr(mail, mail->chainoff, mail->idxoff); /*mail->cnt_stor1++;*/ } else { /* We can reuse an empty record. _mail_findfree() removed the record from the free list and set both mail->datoff and mail->idxoff. */ _mail_writedat(mail, msg->content, mail->datoff, SEEK_SET); _mail_writeidx(mail, msg, mail->idxoff, SEEK_SET, ptrval); /* reused record goes to the front of the hash chain. */ _mail_writeptr(mail, mail->chainoff, mail->idxoff); /*mail->cnt_stor2++;*/ } } if (un_lock(mail->idxfd, mail->chainoff, SEEK_SET, 1) < 0) err_dump("un_lock error"); return(0);}void _mail_gethint(struct message *msg){ char space[2],*recvtime; space[0]=' '; space[1]='\0'; recvtime=ctime(&msg->recvtime); recvtime[24]=' '; hint=strcat(recvtime,msg->from); strcat(hint,space); strcat(hint,msg->subject);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -