Diff
Not logged in

Differences From:

File src/manifest.c part of check-in [a9a27f8aaa] - Still more speed improvements to the "rebuild" command. by drh on 2009-08-27 18:56:08. [view]

To:

File src/manifest.c part of check-in [95f5520a09] - Construct event records for tickets correctly even when the ticket change artifacts arrive out of order. by drh on 2009-09-14 14:08:35. [view]

@@ -884,8 +884,107 @@
   manifest_clear(&other);
 }
 
 /*
+** True if manifest_crosslink_begin() has been called but
+** manifest_crosslink_end() is still pending.
+*/
+static int manifest_crosslink_busy = 0;
+
+/*
+** Setup to do multiple manifest_crosslink() calls.
+** This is only required if processing ticket changes.
+*/
+void manifest_crosslink_begin(void){
+  assert( manifest_crosslink_busy==0 );
+  manifest_crosslink_busy = 1;
+  db_begin_transaction();
+  db_multi_exec("CREATE TEMP TABLE pending_tkt(uuid TEXT UNIQUE)");
+}
+
+/*
+** Finish up a sequence of manifest_crosslink calls.
+*/
+void manifest_crosslink_end(void){
+  Stmt q;
+  assert( manifest_crosslink_busy==1 );
+  db_prepare(&q, "SELECT uuid FROM pending_tkt");
+  while( db_step(&q)==SQLITE_ROW ){
+    const char *zUuid = db_column_text(&q, 0);
+    ticket_rebuild_entry(zUuid);
+  }
+  db_finalize(&q);
+  db_end_transaction(0);
+  manifest_crosslink_busy = 0;
+}
+
+/*
+** Make an entry in the event table for a ticket change artifact.
+*/
+void manifest_ticket_event(
+  int rid,                    /* Artifact ID of the change ticket artifact */
+  const Manifest *pManifest,  /* Parsed content of the artifact */
+  int isNew                   /* True if this is the first event */
+){
+  int i;
+  char *zTitle;
+  Blob comment;
+  char *zNewStatus = 0;
+  static char *zTitleExpr = 0;
+  static char *zStatusColumn = 0;
+  static int once = 1;
+
+  blob_zero(&comment);
+  if( once ){
+    once = 0;
+    zTitleExpr = db_get("ticket-title-expr", "title");
+    zStatusColumn = db_get("ticket-status-column", "status");
+  }
+  zTitle = db_text("unknown",
+    "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
+    zTitleExpr, pManifest->zTicketUuid
+  );
+  if( !isNew ){
+    for(i=0; i<pManifest->nField; i++){
+      if( strcmp(pManifest->aField[i].zName, zStatusColumn)==0 ){
+        zNewStatus = pManifest->aField[i].zValue;
+      }
+    }
+    if( zNewStatus ){
+      blob_appendf(&comment, "%h ticket [%.10s]: <i>%h</i>",
+         zNewStatus, pManifest->zTicketUuid, zTitle
+      );
+      if( pManifest->nField>1 ){
+        blob_appendf(&comment, " plus %d other change%s",
+          pManifest->nField-1, pManifest->nField==2 ? "" : "s");
+      }
+    }else{
+      zNewStatus = db_text("unknown",
+         "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
+         zStatusColumn, pManifest->zTicketUuid
+      );
+      blob_appendf(&comment, "Ticket [%.10s] <i>%h</i> status still %h with "
+           "%d other change%s",
+           pManifest->zTicketUuid, zTitle, zNewStatus, pManifest->nField,
+           pManifest->nField==1 ? "" : "s"
+      );
+      free(zNewStatus);
+    }
+  }else{
+    blob_appendf(&comment, "New ticket [%.10s] <i>%h</i>.",
+      pManifest->zTicketUuid, zTitle
+    );
+  }
+  free(zTitle);
+  db_multi_exec(
+    "REPLACE INTO event(type,mtime,objid,user,comment)"
+    "VALUES('t',%.17g,%d,%Q,%Q)",
+    pManifest->rDate, rid, pManifest->zUser, blob_str(&comment)
+  );
+  blob_reset(&comment);
+}
+
+/*
 ** Scan artifact rid/pContent to see if it is a control artifact of
 ** any key:
 **
 **      *  Manifest
@@ -1025,71 +1124,17 @@
     );
     free(zComment);
   }
   if( m.type==CFTYPE_TICKET ){
-    int i;
-    char *zTitle;
     char *zTag;
-    Blob comment;
-    char *zNewStatus = 0;
-    static char *zTitleExpr = 0;
-    static char *zStatusColumn = 0;
-    static int once = 1;
-    int isNew;
 
-    isNew = ticket_insert(&m, 1, 1);
+    assert( manifest_crosslink_busy==1 );
     zTag = mprintf("tkt-%s", m.zTicketUuid);
     tag_insert(zTag, 1, 0, rid, m.rDate, rid);
     free(zTag);
-    blob_zero(&comment);
-    if( once ){
-      once = 0;
-      zTitleExpr = db_get("ticket-title-expr", "title");
-      zStatusColumn = db_get("ticket-status-column", "status");
-    }
-    zTitle = db_text("unknown",
-      "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
-      zTitleExpr, m.zTicketUuid
-    );
-    if( !isNew ){
-      for(i=0; i<m.nField; i++){
-        if( strcmp(m.aField[i].zName, zStatusColumn)==0 ){
-          zNewStatus = m.aField[i].zValue;
-        }
-      }
-      if( zNewStatus ){
-        blob_appendf(&comment, "%h ticket [%.10s]: <i>%h</i>",
-           zNewStatus, m.zTicketUuid, zTitle
-        );
-        if( m.nField>1 ){
-          blob_appendf(&comment, " plus %d other change%s",
-            m.nField-1, m.nField==2 ? "" : "s");
-        }
-      }else{
-        zNewStatus = db_text("unknown",
-           "SELECT %s FROM ticket WHERE tkt_uuid='%s'",
-           zStatusColumn, m.zTicketUuid
-        );
-        blob_appendf(&comment, "Ticket [%.10s] <i>%h</i> status still %h with "
-             "%d other change%s",
-             m.zTicketUuid, zTitle, zNewStatus, m.nField,
-             m.nField==1 ? "" : "s"
-        );
-        free(zNewStatus);
-      }
-    }else{
-      blob_appendf(&comment, "New ticket [%.10s] <i>%h</i>.",
-        m.zTicketUuid, zTitle
-      );
-    }
-    free(zTitle);
-    db_multi_exec(
-      "REPLACE INTO event(type,mtime,objid,user,comment)"
-      "VALUES('t',%.17g,%d,%Q,%Q)",
-      m.rDate, rid, m.zUser, blob_str(&comment)
-    );
-    blob_reset(&comment);
+    db_multi_exec("INSERT OR IGNORE INTO pending_tkt VALUES(%Q)",
+                  m.zTicketUuid);
   }
   db_end_transaction(0);
   manifest_clear(&m);
   return 1;
 }