Check-in [18b1f6788d]
Not logged in
Overview

SHA1 Hash:18b1f6788d2b5ba4ba53f0bf3c1eb99706c5a477
Date: 2007-08-28 03:04:09
User: drh
Comment:Make sure the same manifest never gets inserted into the metadata tables twice - resulting in duplicate timeline entries.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/manifest.c from [02dabff247] to [bf7dfee62a].

@@ -301,28 +301,30 @@
 
   if( manifest_parse(&m, pContent)==0 ){
     return 0;
   }
   db_begin_transaction();
-  for(i=0; i<m.nParent; i++){
-    int pid = uuid_to_rid(m.azParent[i], 1);
-    db_multi_exec("INSERT OR IGNORE INTO plink(pid, cid, isprim, mtime)"
-                  "VALUES(%d, %d, %d, %.17g)", pid, rid, i==0, m.rDate);
-    if( i==0 ){
-      add_mlink(pid, 0, rid, &m);
+  if( !db_exists("SELECT 1 FROM mlink WHERE mid=%d", rid) ){
+    for(i=0; i<m.nParent; i++){
+      int pid = uuid_to_rid(m.azParent[i], 1);
+      db_multi_exec("INSERT OR IGNORE INTO plink(pid, cid, isprim, mtime)"
+                    "VALUES(%d, %d, %d, %.17g)", pid, rid, i==0, m.rDate);
+      if( i==0 ){
+        add_mlink(pid, 0, rid, &m);
+      }
+    }
+    db_prepare(&q, "SELECT cid FROM plink WHERE pid=%d AND isprim", rid);
+    while( db_step(&q)==SQLITE_ROW ){
+      int cid = db_column_int(&q, 0);
+      add_mlink(rid, &m, cid, 0);
     }
-  }
-  db_prepare(&q, "SELECT cid FROM plink WHERE pid=%d AND isprim", rid);
-  while( db_step(&q)==SQLITE_ROW ){
-    int cid = db_column_int(&q, 0);
-    add_mlink(rid, &m, cid, 0);
-  }
-  db_finalize(&q);
-  db_multi_exec(
-    "INSERT INTO event(type,mtime,objid,user,comment)"
-    "VALUES('ci',%.17g,%d,%Q,%Q)",
-    m.rDate, rid, m.zUser, m.zComment
-  );
+    db_finalize(&q);
+    db_multi_exec(
+      "INSERT INTO event(type,mtime,objid,user,comment)"
+      "VALUES('ci',%.17g,%d,%Q,%Q)",
+      m.rDate, rid, m.zUser, m.zComment
+    );
+  }
   db_end_transaction(0);
   manifest_clear(&m);
   return 1;
 }