Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/io.js

Issue 29348062: Issue 4023 - The logic for splitting up storage.local into 1MB chunks does not work (Closed)
Patch Set: Created July 20, 2016, 11:31 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | metadata.common » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/io.js
diff --git a/lib/io.js b/lib/io.js
index 62d5f30ed1941a6d88c1b29afff9a714f938278f..2334ca3e94488e18bc3240f0e918af3b14c1ff42 100644
--- a/lib/io.js
+++ b/lib/io.js
@@ -23,14 +23,14 @@ function fileToKey(file, chunk)
{
let key = keyPrefix;
+ if (typeof file == "string")
+ return file;
+
if (file instanceof FakeFile)
key += file.path;
else
key += file.spec;
- if (typeof chunk != "undefined")
- key += ":" + chunk;
-
return key;
}
@@ -42,6 +42,19 @@ function loadFile(file)
ext.storage.get([key], items =>
{
let entry = items[key];
+ if (entry && entry.isSplit)
+ {
+ // Load both left and right parts and combine them
+ return Promise.all([loadFile(key + "_l"), loadFile(key + "_r")]).
+ then(values =>
+ {
+ entry.content = values[0].content.concat(values[1].content);
+ resolve(entry);
+ }).catch(() =>
+ {
+ reject(new Error("File doesn't exist"));
+ });
+ }
if (entry)
resolve(entry);
else
@@ -65,26 +78,8 @@ exports.IO =
{
for (let line of entry.content)
listener.process(line);
-
- listener.process(null);
- callback(null);
- }
- else
- {
- let keys = [];
- for (let i = 0; i < entry.chunks; i++)
- keys.push(fileToKey(file, i));
-
- ext.storage.get(keys, items =>
- {
- for (let key of keys)
- for (let line of items[key])
- listener.process(line);
-
- listener.process(null);
- callback(null);
- });
}
+ callback(null);
}
loadFile(file).then(onLoaded, callback);
@@ -92,47 +87,24 @@ exports.IO =
writeToFile: function(file, data, callback)
{
- let items = {};
- let entry = items[fileToKey(file)] = {lastModified: Date.now()};
-
- if (typeof browser == "object")
+ let entry = {};
+ var key = fileToKey(file);
+ entry[key] = {lastModified: Date.now(), content: data};
+ try
{
- loadFile(file).catch(() => null)
- .then(oldEntry =>
- {
- let quota = 1024 * 1024 / 2 - 1000;
- let chunks = [];
- let chunk = [];
- let chunkSize = 0;
-
- for (let line of data)
- {
- if (line.length + chunkSize > quota)
- {
- chunks.push(chunk);
- chunk = [];
- chunkSize = 0;
- }
-
- chunk.push(line);
- chunkSize += line.length;
- }
- chunks.push(chunk);
-
- for (let i = 0; i < chunks.length; i++)
- items[fileToKey(file, i)] = chunks[i];
- entry.chunks = chunks.length;
- ext.storage.set(items, callback);
-
- if (oldEntry && "chunks" in oldEntry)
- for (let i = entry.chunks; i < oldEntry.chunks; i++)
- ext.storage.remove(fileToKey(file, i));
- });
+ ext.storage.set(entry, callback);
}
- else
+ catch(e)
{
- entry.content = data;
- ext.storage.set(items, callback);
+ // Edge throws an exception when trying to write files larger than 1Mb.
+ // Split the file in halfs and write them.
+ var leftPart = data.slice(0, data.length / 2);
+ var rightPart = data.slice(data.length / 2, data.length);
+ exports.IO.writeToFile(key + "_l", leftPart);
+ exports.IO.writeToFile(key + "_r", rightPart);
+ entry[key].content = null;
+ entry[key].isSplit = true;
+ ext.storage.set(entry, callback);
}
},
« no previous file with comments | « no previous file | metadata.common » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld