@@ -24,19 +24,126 @@
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Procedures store and retrieve records from the repository
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "content.h"
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Macros for debugging
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define CONTENT_TRACE(X) printf X;
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define CONTENT_TRACE(X)
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The artifact retrival cache
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define MX_CACHE_CNT 50 /* Maximum number of positive cache entries */
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define EXPELL_INTERVAL 5 /* How often to expell from a full cache */
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static struct {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n; /* Current number of positive cache entries */
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nextAge; /* Age counter for implementing LRU */
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int skipCnt; /* Used to limit entries expelled from cache */
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct { /* One instance of this for each cache entry */
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rid; /* Artifact id */
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int age; /* Age. Newer is larger */
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob content; /* Content of the artifact */
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } a[MX_CACHE_CNT]; /* The positive cache */
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The missing artifact cache.
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Artifacts whose record ID are in missingCache cannot be retrieved
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** either because they are phantoms or because they are a delta that
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** depends on a phantom. Artifacts whose content we are certain is
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** available are in availableCache. If an artifact is in neither cache
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then its current availablity is unknown.
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Bag missing; /* Cache of artifacts that are incomplete */
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Bag available; /* Cache of artifacts that are complete */
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } contentCache;
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Clear the content cache.
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void content_clear_cache(void){
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<contentCache.n; i++){
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&contentCache.a[i].content);
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_clear(&contentCache.missing);
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_clear(&contentCache.available);
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.n = 0;
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
29 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
31 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the srcid associated with rid. Or return 0 if rid is
32 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** original content and not a delta.
33 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
34 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int findSrcid(int rid){
35 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int srcid = db_int(0, "SELECT srcid FROM delta WHERE rid=%d", rid);
36 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return srcid;
37 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check to see if content is available for artifact "rid". Return
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** true if it is. Return false if rid is a phantom or depends on
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a phantom.
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int content_is_available(int rid){
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srcid;
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bag_find(&contentCache.missing, rid) ){
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bag_find(&contentCache.available, rid) ){
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_int(-1, "SELECT size FROM blob WHERE rid=%d", rid)<0 ){
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.missing, rid);
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ srcid = findSrcid(rid);
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( srcid==0 ){
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.available, rid);
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( content_is_available(srcid) ){
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.available, rid);
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.missing, rid);
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Mark artifact rid as being available now. Update the cache to
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** show that everything that was formerly unavailable because rid
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** was missing is now available.
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void content_mark_available(int rid){
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Bag pending;
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bag_find(&contentCache.available, rid) ) return;
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_init(&pending);
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&pending, rid);
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (rid = bag_first(&pending))!=0 ){
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_remove(&pending, rid);
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_remove(&contentCache.missing, rid);
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.available, rid);
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT rid FROM delta WHERE srcid=%d", rid);
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nx = db_column_int(&q, 0);
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&pending, nx);
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_clear(&pending);
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
38 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
39 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
40 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Extract the content for ID rid and put it into the
41 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** uninitialized blob. Return 1 on success. If the record
42 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is a phantom, zero pBlob and return 0.
@@ -44,16 +151,46 @@
44 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int content_get(int rid, Blob *pBlob){
45 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
46 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob src;
47 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int srcid;
48 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
49 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static Bag inProcess;
50 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( g.repositoryOpen );
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- srcid = findSrcid(rid);
53 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pBlob);
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Early out if we know the content is not available */
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bag_find(&contentCache.missing, rid) ){
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CONTENT_TRACE(("%*smiss from cache: %d\n",
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_count(&inProcess), "", rid))
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Look for the artifact in the cache first */
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<contentCache.n; i++){
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( contentCache.a[i].rid==rid ){
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pBlob = contentCache.a[i].content;
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&contentCache.a[i].content);
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.n--;
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<contentCache.n ){
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.a[i] = contentCache.a[contentCache.n];
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CONTENT_TRACE(("%*shit cache: %d\n",
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_count(&inProcess), "", rid))
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* See if we need to apply a delta to find this artifact */
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ srcid = findSrcid(rid);
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CONTENT_TRACE(("%*ssearching for %d. Need %d.\n",
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_count(&inProcess), "", rid, srcid))
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
54 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( srcid ){
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Yes, a delta is required */
55 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bag_find(&inProcess, srcid) ){
56 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(
57 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"UPDATE blob SET content=NULL, size=-1 WHERE rid=%d;"
58 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DELETE FROM delta WHERE rid=%d;"
59 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT OR IGNORE INTO phantom VALUES(%d);",
@@ -61,10 +198,11 @@
61 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
62 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pBlob);
63 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
64 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
65 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_insert(&inProcess, srcid);
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
66 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( content_get(srcid, &src) ){
67 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "SELECT content FROM blob WHERE rid=%d AND size>=0", rid);
68 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_step(&q)==SQLITE_ROW ){
69 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob delta;
70 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_ephemeral_blob(&q, 0, &delta);
@@ -73,29 +211,67 @@
73 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_delta_apply(&src, &delta, pBlob);
74 212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&delta);
75 213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
76 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
77 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&src);
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Save the srcid artifact in the cache */
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( contentCache.n<MX_CACHE_CNT ){
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = contentCache.n++;
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( ((contentCache.skipCnt++)%EXPELL_INTERVAL)!=0 ){
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = -1;
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j, best;
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ best = contentCache.nextAge+1;
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = -1;
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<contentCache.n; j++){
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( contentCache.a[j].age<best ){
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = j;
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ best = contentCache.a[j].age;
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CONTENT_TRACE(("%*sexpell %d from cache\n",
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_count(&inProcess), "", contentCache.a[i].rid))
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&contentCache.a[i].content);
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>=0 ){
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.a[i].content = src;
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.a[i].age = contentCache.nextAge++;
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentCache.a[i].rid = srcid;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CONTENT_TRACE(("%*sadd %d to cache\n",
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_count(&inProcess), "", srcid))
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&src);
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
80 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bag_remove(&inProcess, srcid);
81 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* No delta required. Read content directly from the database */
82 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q, "SELECT content FROM blob WHERE rid=%d AND size>=0", rid);
83 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_step(&q)==SQLITE_ROW ){
84 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_ephemeral_blob(&q, 0, pBlob);
85 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_uncompress(pBlob, pBlob);
86 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
87 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
88 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
89 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==0 ){
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.missing, rid);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bag_insert(&contentCache.available, rid);
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
90 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
91 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
92 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
93 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Get the contents of a file within a given revision.
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Get the contents of a file within a given baseline.
95 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int content_get_historical_file(const char *revision, const char *file, Blob *content){
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int content_get_historical_file(
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *revision, /* Name of the baseline containing the file */
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *file, /* Name of the file */
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *content /* Write file content here */
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
97 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob mfile;
98 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Manifest m;
99 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, rid=0;
100 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rid = name_to_rid(revision);
@@ -194,10 +370,11 @@
194 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rid;
195 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt s1;
196 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob cmpr;
197 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob hash;
198 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int markAsUnclustered = 0;
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isDephantomize = 0;
199 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
200 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( g.repositoryOpen );
201 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pBlob && srcId==0 ){
202 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sha1sum_blob(pBlob, &hash);
203 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -249,12 +426,13 @@
249 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
250 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_compress(pBlob, &cmpr);
251 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_bind_blob(&s1, ":data", &cmpr);
252 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_exec(&s1);
253 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("DELETE FROM phantom WHERE rid=%d", rid);
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( srcId==0 || db_int(0, "SELECT size FROM blob WHERE rid=%d", srcId)>0 ){
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- after_dephantomize(rid, 0);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( srcId==0 || content_is_available(srcId) ){
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isDephantomize = 1;
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content_mark_available(rid);
256 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
257 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
258 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We are creating a new entry */
259 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&s1,
260 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT INTO blob(rcvid,size,uuid,content)"
@@ -275,10 +453,17 @@
275 453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the srcId is specified, then the data we just added is
276 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** really a delta. Record this fact in the delta table.
277 455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
278 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( srcId ){
279 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("REPLACE INTO delta(rid,srcid) VALUES(%d,%d)", rid, srcId);
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isDephantomize && bag_find(&contentCache.missing, rid) &&
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (srcId==0 || content_is_available(srcId)) ){
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content_mark_available(rid);
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isDephantomize ){
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ after_dephantomize(rid, 0);
280 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
281 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
282 467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add the element to the unclustered table if has never been
283 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** previously seen.
284 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
285 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!