// Write to the journal file function _journalWrite(str,handler) { var self = this, b = new Buffer(str+"\n\0"); return fnlock.lock('journalWrite',function(release){ return fs.write(self._j,b,0,b.length,self._jPos,function(err){ if ( err ) { _debug("ERROR:\tError writting to the journal file: ",err); return handler(err,null); } // Seek to the right position self._jPos += b.length-1; // Sync with the disk return fs.fsync(self._j,function(err){ if ( err ) { _debug("ERROR:\tError syncing journal to the disk: ",err); return handler(err,null); } // Release the lock release(); // Done return handler(null,true); }); }); }); }
// For for N id's for a specific key function bizAskIDs(key,n,handler) { var self = this, opts = (self._opts.keyOptions && typeof self._opts.keyOptions[key] == "object") ? self._opts.keyOptions[key] : self._opts, lastID; // Lock return fnlock.lock("ask_"+key,function(release){ // Do we need to GET the key ? return _if ( !self._idMap[key], function(next){ self.get(key,function(err,value){ if ( err ) { _debug("ERROR:\tError getting value for key '"+key+"': ",err); release(); return handler({code: "EGET", description: "Error getting value for key '"+key+"'.", details: err.toString()}); } self._idMap[key] = value; return next(); }); }, function() { // No value ? if ( !self._idMap[key] ) { self._idMap[key] = self._bizFirstID(key); self._changed[key] = true; } // Generate the id's return self._bizAskIDs(key,n,opts,function(err,ids){ if ( err ) { _debug("ERROR:\tError asking for "+n+" ids for '"+key+"': ",err); release(); return handler(err,null); } lastID = ids[ids.length-1]; // Store return self._journalWrite(key+"\r"+lastID,function(err,ok){ if ( err ) { _debug("ERROR\tError writting to journal file: ",err); release(); return handler({code: "EJOUWR", description: "Error writting to the journal file", detail: err.toString() }); } // Replace on the id map if ( ids.length > 0 ) { self._idMap[key] = ids[ids.length-1]; self._changed[key] = true; } // Release release(); // Sent to user return handler(null,ids); }); }); } ); }); }