@@ -638,10 +638,11 @@
638 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char zEmailSchema[] =
639 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ -- bulk storage is in a separate table. This table can store either
640 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ -- the body of email messages or transcripts of smtp sessions.
641 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TABLE IF NOT EXISTS repository.emailblob(
642 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ emailid INTEGER PRIMARY KEY, -- numeric idea for the entry
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ enref INT, -- Number of references to this blob
643 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ets INT, -- Corresponding transcript, or NULL
644 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ etime INT, -- insertion time, secs since 1970
645 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ etxt TEXT -- content of this entry
646 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
647 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@
@@ -651,11 +652,10 @@
651 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ebid INTEGER PRIMARY KEY, -- Unique id for each mailbox entry
652 653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ euser TEXT, -- User who received this email
653 654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ edate INT, -- Date received. Seconds since 1970
654 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ efrom TEXT, -- Who is the email from
655 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ emsgid INT, -- Raw email text
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ ets INT, -- Transcript of the receiving SMTP session
657 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ estate INT, -- 0: Unread, 1: read, 2: trash 3: sent
658 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ esubject TEXT, -- Subject line for display
659 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ etags TEXT -- zero or more tags
660 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
661 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@
@@ -674,10 +674,29 @@
674 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ectime INT, -- Time enqueued. Seconds since 1970
675 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ emtime INT, -- Time of last send attempt. Sec since 1970
676 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ensend INT, -- Number of send attempts
677 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ets INT -- Transcript of last failed attempt
678 678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ -- Triggers to automatically keep the emailblob.enref field up to date
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ -- as entries in the emailblob, emailbox, and emailoutq tables are
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ -- deleted.
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TRIGGER IF NOT EXISTS repository.emailblob_d1
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ AFTER DELETE ON emailblob BEGIN
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM emailblob WHERE enref<=1 AND emailid=old.ets;
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ UPDATE emailblob SET enref=enref-1 WHERE emailid=old.ets;
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TRIGGER IF NOT EXISTS repository.emailbox_d1
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ AFTER DELETE ON emailbox BEGIN
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM emailblob WHERE enref<=1 AND emailid=old.emsgid;
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ UPDATE emailblob SET enref=enref-1 WHERE emailid=old.emsgid;
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TRIGGER IF NOT EXISTS repository.emailoutq_d1
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ AFTER DELETE ON emailoutq BEGIN
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM emailblob WHERE enref<=1 AND emailid IN (old.ets,old.emsgid);
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ UPDATE emailblob SET enref=enref-1 WHERE emailid IN (old.ets,old.emsgid);
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
679 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
680 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
681 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
682 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Code used to delete the email tables.
683 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -829,10 +848,12 @@
829 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SmtpTo {
830 849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z; /* Address in each RCPT TO line */
831 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int okRemote; /* zTo can be in another domain */
832 851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} *aTo;
833 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 srvrFlags; /* Control flags */
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEts; /* Number of references to the transcript */
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRef; /* Number of references to idMsg */
834 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob msg; /* Content following DATA */
835 856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob transcript; /* Session transcript */
836 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
837 858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
838 859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SMTPSRV_CLEAR_MSG 1 /* smtp_server_clear() last message only */
@@ -1000,10 +1021,11 @@
1000 1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT INTO emailoutq(edomain,efrom,eto,emsgid,ectime,"
1001 1022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"emtime,ensend)"
1002 1023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"VALUES(%Q,%Q,%Q,%lld,now(),0,0)",
1003 1024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zAddr+i+1, p->zFrom, zAddr, p->idMsg
1004 1025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nRef++;
1005 1027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1006 1028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1007 1029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
1008 1030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1009 1031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&policy, zPolicy, -1);
@@ -1014,16 +1036,17 @@
1014 1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(&tail)==0 ) continue;
1015 1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_eq_str(&token, "mbox", 4) ){
1016 1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob subj;
1017 1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
email_header_value(&p->msg, "subject", &subj);
1018 1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
1019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "INSERT INTO emailbox(euser,edate,efrom,emsgid,ets,estate,esubject)"
1020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " VALUES(%Q,now(),%Q,%lld,%lld,0,%Q)",
1021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_str(&tail), p->zFrom, p->idMsg, p->idTranscript,
1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO emailbox(euser,edate,efrom,emsgid,estate,esubject)"
1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(%Q,now(),%Q,%lld,0,%Q)",
1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_str(&tail), p->zFrom, p->idMsg,
1022 1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_str(&subj)
1023 1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1024 1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&subj);
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nRef++;
1025 1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1026 1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_eq_str(&token, "forward", 7) ){
1027 1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
smtp_append_to(p, fossil_strdup(blob_str(&tail)), 1);
1028 1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1029 1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&tail);
@@ -1040,38 +1063,43 @@
1040 1063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->zFrom
1041 1064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& p->nTo
1042 1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& blob_size(&p->msg)
1043 1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (p->srvrFlags & SMTPSRV_DRYRUN)==0
1044 1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_begin_transaction();
1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_write();
1046 1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->idTranscript==0 ) smtp_server_schema(0);
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nRef = 0;
1047 1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&s,
1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "INSERT INTO emailblob(ets,etime,etxt)"
1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " VALUES(:ets,now(),compress(:etxt))"
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO emailblob(ets,etime,etxt,enref)"
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(:ets,now(),compress(:etxt),:enref)"
1050 1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nEts++;
1051 1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !bFinish && p->idTranscript==0 ){
1052 1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_null(&s, ":ets");
1053 1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_null(&s, ":etxt");
1079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_int(&s, ":enref", 0);
1054 1080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&s);
1055 1081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&s);
1056 1082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->idTranscript = db_last_insert_rowid();
1057 1083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( bFinish ){
1058 1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->idTranscript ){
1059 1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
1060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "UPDATE emailblob SET etxt=compress(%Q)"
1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE emailblob SET etxt=compress(%Q), enref=%d"
1061 1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" WHERE emailid=%lld",
1062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_str(&p->transcript), p->idTranscript);
1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_str(&p->transcript), p->nEts, p->idTranscript);
1063 1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1064 1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_null(&s, ":ets");
1065 1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_str(&s, ":etxt", &p->transcript);
1092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_int(&s, ":enref", p->nEts);
1066 1093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&s);
1067 1094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_reset(&s);
1068 1095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->idTranscript = db_last_insert_rowid();
1069 1096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1070 1097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1071 1098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_int64(&s, ":ets", p->idTranscript);
1072 1099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_str(&s, ":etxt", &p->msg);
1100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_int(&s, ":enref", 0);
1073 1101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_step(&s);
1074 1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&s);
1075 1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->idMsg = db_last_insert_rowid();
1076 1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1077 1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* make entries in emailbox and emailoutq */
@@ -1078,16 +1106,92 @@
1078 1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nTo; i++){
1079 1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int okRemote = p->aTo[i].okRemote;
1080 1108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->aTo[i].okRemote = 1;
1081 1109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
smtp_server_send_one_user(p, p->aTo[i].z, okRemote);
1082 1110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Fix up the emailblob.enref field of the email message body */
1113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nRef ){
1114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE emailblob SET enref=%d WHERE emailid=%lld",
1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nRef, p->idMsg
1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM emailblob WHERE emailid=%lld", p->idMsg
1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1083 1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1084 1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Finish the transaction after all changes are implemented */
1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_end_transaction(0);
1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_commit_transaction();
1086 1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1087 1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
smtp_server_clear(p, SMTPSRV_CLEAR_MSG);
1088 1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-emailblob-refcheck
1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-emailblob-refcheck [--repair] [--full]
1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Verify that the emailblob.enref field is correct. Report any errors.
1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the --repair command to fix up the enref field. The --full option
1137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** gives a full report showing the enref value on all entries in the
1138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** emailblob table.
1139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_refcheck_emailblob(void){
1141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int doRepair;
1142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fullReport;
1143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql;
1144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
1145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nErr = 0;
1146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_find_and_open_repository(0, 0);
1147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fullReport = find_option("full",0,0)!=0;
1148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doRepair = find_option("repair",0,0)!=0;
1149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
1150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !db_table_exists("repository","emailblob") ){
1151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("emailblob table is not configured - nothing to check\n");
1152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
1153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TEMP TABLE refcnt(id INTEGER PRIMARY KEY, n);"
1156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT INTO refcnt SELECT ets, count(*) FROM ("
1157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT ets FROM emailblob"
1158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " UNION ALL"
1159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT emsgid FROM emailbox"
1160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " UNION ALL"
1161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT emsgid FROM emailoutq"
1162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ") WHERE ets IS NOT NULL GROUP BY 1;"
1163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "INSERT OR IGNORE INTO refcnt(id,n) SELECT emailid, 0 FROM emailblob;"
1164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( doRepair ){
1166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
1167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "UPDATE emailblob SET enref=(SELECT n FROM refcnt WHERE id=emailid)"
1168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&sql, 0, 0);
1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql,
1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT a.emailid, a.enref, b.n"
1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " FROM emailblob AS a JOIN refcnt AS b ON a.emailid=b.id"
1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fullReport ){
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_sql(&sql, " WHERE a.enref!=b.n");
1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare_blob(&q, &sql);
1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 id = db_column_int64(&q,0);
1182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n1 = db_column_int(&q, 1);
1183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n2 = db_column_int(&q, 2);
1184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n1!=n2 ) nErr++;
1185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%12lld %4d %4d%s\n", id, n1, n2, n1!=n2 ? " ERROR" : "");
1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nErr ){
1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("Number of incorrect emailblob.enref values: %d\n",nErr);
1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1089 1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1090 1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1091 1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: smtpd
1092 1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1093 1197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usage: %fossil smtpd [OPTIONS] REPOSITORY
1094 1198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!