コード例 #1
0
// 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);
            });

        });
    });

}
コード例 #2
0
// 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);
                    });
                });

            }
        );

    });

}