Fix reverse boundary check

This commit is contained in:
Mark Nadal 2021-06-07 07:47:25 -07:00
parent 8b299a03e2
commit 972221972a
2 changed files with 59 additions and 35 deletions

View File

@ -17,10 +17,10 @@
opt.jsonify = true;
function ename(t){ return encodeURIComponent(t).replace(/\*/g, '%2A') }
function ename(t){ return encodeURIComponent(t).replace(/\*/g, '%2A') } // TODO: Hash this also, but allow migration!
function atomic(v){ return u !== v && (!v || 'object' != typeof v) }
var timediate = (typeof setImmediate === "undefined")? setTimeout : setImmediate;
var puff = setTimeout.puff || timediate;
var timediate = (''+u === typeof setImmediate)? setTimeout : setImmediate;
var puff = setTimeout.turn || timediate, u;
var map = Radix.object;
var ST = 0;
@ -37,6 +37,9 @@
//opt.log("WARNING: `store.list` interface might be needed!");
}
if(''+u != typeof require){ require('./yson') }
var parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }
var json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }
/*
Any and all storage adapters should...
1. Because writing to disk takes time, we should batch data to disk. This improves performance, and reduces potential disk corruption.
@ -286,8 +289,8 @@
DBG && (DBG.rl = +new Date);
if(!o.next){ o.more = 0 }
if(o.next){
if(!o.reverse && (key < o.next && 0 != o.next.indexOf(key)) || (u !== o.end && (o.end || '\uffff') < o.next)){ o.more = 0 }
if(o.reverse && (key > o.next && 0 != key.indexOf(o.next)) || (u !== o.start && (o.start || '') > o.next)){ o.more = 0 }
if(!o.reverse && ((key < o.next && 0 != o.next.indexOf(key)) || (u !== o.end && (o.end || '\uffff') < o.next))){ o.more = 0 }
if(o.reverse && ((key > o.next && 0 != key.indexOf(o.next)) || ((u !== o.start && (o.start || '') > o.next && file <= o.start)))){ o.more = 0 }
}
if(!o.more){ cb(g.err, data, o); return }
if(data){ cb(g.err, data, o) }
@ -345,8 +348,11 @@
p.read = function(err, data){ var tmp;
DBG && (DBG.rpg = +new Date);
console.STAT && console.STAT(S, +new Date - S, 'read disk', JSON.stringify(file), ++RPC, 'total all parses.');
delete Q[file];
if((p.err = err) || (p.not = !data)){ p.map(q, p.ack); return }
if((p.err = err) || (p.not = !data)){
delete Q[file];
p.map(q, p.ack);
return;
}
if('string' !== typeof data){
try{
if(opt.pack <= data.length){
@ -355,30 +361,39 @@
data = data.toString(); // If it crashes, it crashes here. How!?? We check size first!
}
}catch(e){ p.err = e }
if(p.err){ p.map(q, p.ack); return }
if(p.err){
delete Q[file];
p.map(q, p.ack);
return;
}
}
info.parsed = data.length;
DBG && (DBG.rpl = info.parsed);
DBG && (DBG.rpa = q.length);
S = +new Date;
if(opt.jsonify || '{' === data[0]){
try{
var json = JSON.parse(data); // TODO: this caused a out-of-memory crash!
p.disk.$ = json;
if(!(opt.jsonify || '{' === data[0])){
p.radec(err, data);
return;
}
parse(data, function(err, tree){
if(!err){
delete Q[file];
p.disk.$ = tree;
console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'rad parsed JSON');
DBG && (DBG.rpd = +new Date);
p.map(q, p.ack); // hmmm, v8 profiler can't see into this cause of try/catch?
return;
}catch(e){ tmp = e }
}
if('{' === data[0]){
delete Q[file];
p.err = tmp || "JSON error!";
p.map(q, p.ack);
return;
}
}
p.radec(err, data);
p.radec(err, data);
});
}
p.map = function(){
p.map = function(){ // switch to setTimeout.each now?
if(!q || !q.length){ return }
//var i = 0, l = q.length, ack;
var S = +new Date;
@ -398,6 +413,7 @@
cb(u, p.disk, info);
}
p.radec = function(err, data){
delete Q[file];
S = +new Date;
var tmp = p.split(data), pre = [], i, k, v;
if(!tmp || 0 !== tmp[1]){

View File

@ -27,15 +27,7 @@ var Gun;
;(function(){
Gun = root.Gun
if(Gun.window && !Gun.window.RindexedDB){ return }
var opt = {};
opt.file = 'radatatest';
var Radisk = (Gun.window && Gun.window.Radisk) || require('../../lib/radisk');
opt.store = ((Gun.window && Gun.window.RindexedDB) || require('../../lib/rfs'))(opt);
opt.chunk = 1000;
var Radix = Radisk.Radix;
var rad = Radisk(opt), esc = String.fromCharCode(27);
var Radix = (Gun.window && Gun.window.Radix) || require('../../lib/radix3');
describe('RAD', function(){
@ -157,6 +149,15 @@ var names = ["Adalard","Adora","Aia","Albertina","Alfie","Allyn","Amabil","Ammam
});
});
if(Gun.window && !Gun.window.RindexedDB){ return }
var opt = {};
opt.file = 'radatatest';
var Radisk = (Gun.window && Gun.window.Radisk) || require('../../lib/radisk');
opt.store = ((Gun.window && Gun.window.RindexedDB) || require('../../lib/rfs'))(opt);
opt.chunk = 1000;
var rad = Radisk(opt), esc = String.fromCharCode(27);
describe('Radisk', function(){
/*it('parse', function(done){
@ -184,24 +185,30 @@ var names = ["Adalard","Adora","Aia","Albertina","Alfie","Allyn","Amabil","Ammam
})
});
/*it('read contacts reverse', function(done){
it('read contacts reverse', function(done){
var opt = {};
opt.reverse = true;
opt.end = 'nothing';
opt.start = 'marcy';
opt.start = 'keeley';
var first, last;
var all = {}, start = opt.start.toLowerCase(), end = opt.end.toLowerCase();
names.forEach(function(v,i){
v = v.toLowerCase();
if(v < start){ return }
if(end < v){ return }
//console.log(v, i);
all[v] = v;
//rad(v, i)
});
rad('', function(err, data){
console.log("???", err, data);
return;
Radix.map(data, function(v,k){
console.log(k, v);
//delete all[find+k];
//console.log(k, v);
delete all[k];
});
//if(!Object.empty(all)){ return }
//done();
if(!Object.empty(all)){ return }
done();
}, opt);
});
console.log("UNDO THIS RETURN!!!");return;*/
it('read contacts start end', function(done){
var opt = {};
@ -277,13 +284,14 @@ var names = ["Adalard","Adora","Aia","Albertina","Alfie","Allyn","Amabil","Ammam
});
});
return;
var ntmp = names;
describe('RAD + GUN', function(){
var ochunk = 1000;
var gun = Gun({chunk: ochunk});
it.only('write same', function(done){
it('write same', function(done){
var all = {}, to, start, tmp;
var names = [], c = 285;
while(--c){ names.push('bob') }