rootslab/syllabus

View on GitHub
lib/commands/keys.js

Summary

Maintainability
F
4 days
Test Coverage
/*
 * KEYS mix-ins.
 */

exports.commands = function ( encode, error ) {
    var Abaco = require( 'abaco' )
        , parseIntArray = Abaco.parseIntArray
        , Bolgia = require( 'bolgia' )
        , doString = Bolgia.doString
        , ooo = Bolgia.circles
        , onul = ooo.nul
        , ound = ooo.und
        , oobj = ooo.obj
        , oarr = ooo.arr
        , ostr = ooo.str
        , onum = ooo.num
        , isArray = Array.isArray
        ;

    return {

        del : function ( keys, cback ) {
            if ( ! keys ) return error( 'DEL', arguments );
            if ( isArray( keys ) ) return encode( 'DEL', keys[ 0 ], keys.slice( 1 ), parseIntArray, cback );
            return encode( 'DEL', keys, parseIntArray, cback );
        }

        , dump : function ( key, cback ) {
            if ( key === undefined )  return error( 'DUMP', arguments );
            return encode( 'DUMP', key, null, cback );
        }

        , exists : function ( key, cback ) {
            if ( key === undefined )  return error( 'DUMP', arguments );
            return encode( 'EXISTS', key, parseIntArray, cback );
        }

        , expire : function ( key, seconds, cback ) {
            if ( key === undefined )  return error( 'EXPIRE', arguments );
            return encode( 'EXPIRE', key, + seconds, parseIntArray, cback );
        }

        , expireat : function ( key, unixtime, cback ) {
            var tstamp = null
                ;
            if ( key === undefined )  return error( 'EXPIREAT', arguments );
            if ( + unixtime ) tstamp = ( + unixtime / 1000 ).toFixed( 0 );
            return encode( 'EXPIREAT', key, tstamp, parseIntArray, cback );
        }

        , keys : function ( pattern, cback ) {
            if ( ! pattern ) return error( 'KEYS', arguments );
            return encode( 'KEYS', pattern, null, cback );
        }

        , migrate : function ( key, opt, cback ) {
            var list = null
                ;

            if ( key === undefined )  return error( 'MIGRATE', arguments );
            
            switch ( doString( opt ) ) {
                case oarr:
                    if ( opt.length < 5 ) return error( 'MIGRATE', arguments );
                    // orig args -> host port key destination-db timeout [COPY] [REPLACE]
                    list = opt.slice( 0, 2 ).concat( key ).concat( opt.slice( 2 ) );
                    return encode( 'MIGRATE', list, null, cback );
                case oobj:
                    list = [ opt.port, key, opt.db, opt.timeout, opt.action ];
                    return encode( 'MIGRATE', opt.host, list, null, cback );
                default:
                    return error( 'MIGRATE', arguments );
            }
        }

        , move : function ( key, db, cback ) {
            if ( key === undefined )  return error( 'MOVE', arguments );
            return encode( 'MOVE', key, db, parseIntArray, cback );
        }

        , object : {

            refcount : function ( key, cback ) {
                if ( key === undefined )  return error( 'OBJECT REFCOUNT', arguments ); 
                return encode( 'OBJECT', 'REFCOUNT', key, parseIntArray, cback );
            }

            , encoding : function ( key, cback ) {
                if ( key === undefined )  return error( 'OBJECT ENCODING', arguments );
                return encode( 'OBJECT', 'ENCODING', key, null, cback );
            }

            , idletime : function ( key, cback ) {
                if ( key === undefined )  return error( 'OBJECT IDLETIME', arguments );
                return encode( 'OBJECT', 'IDLETIME', key, parseIntArray, cback );
            }

        }

        , persist : function ( key, cback ) {
            if ( key === undefined )  return error( 'PERSIST', arguments );
            return encode( 'PERSIST', key, parseIntArray, cback );
        }

        , pexpire : function ( key, millis, cback ) {
            if ( key === undefined )  return error( 'PEXPIRE', arguments );
            return encode( 'PEXPIRE', key, millis, parseIntArray, cback );
        }

        , pexpireat : function ( key, unixtime, cback ) {
            if ( key === undefined )  return error( 'PEXPIREAT', arguments );
            return encode( 'PEXPIREAT', key, unixtime, parseIntArray, cback );
        }

        , pttl : function ( key, cback ) {
            if ( key === undefined )  return error( 'PTTL', arguments );
            return encode( 'PTTL', key, parseIntArray, cback );
        }
        , randomkey : function ( cback ) {
            return encode( 'RANDOMKEY', null, cback );
        }

        , rename : function ( key, name, cback ) {
            if ( key === undefined )  return error( 'RENAME', arguments );
            return encode( 'RENAME', key, name, parseIntArray, cback );
        }

        , renamenx : function ( key, name, cback ) {
            if ( key === undefined )  return error( 'RENAMENX', arguments );
            return encode( 'RENAMENX', key, name, parseIntArray, cback );
        }

        , restore : function ( key, ttl, buffer, cback ) {
            if ( key === undefined )  return error( 'RESTORE', arguments );
            return encode( 'RESTORE', key, [ ttl, buffer ], null, cback );
        }

        , scan : function ( cursor, opt, cback ) {
            var list = null
                , match = null
                , count = null
                , ctype = null
                ;

            if ( isNaN( + cursor ) ) return error( 'SCAN', arguments );

            switch ( doString( opt ) ) {
                case oobj:
                    list = [];
                    match = opt.match;
                    count = opt.count;
                    ctype = doString( count );
                    if ( doString( match ) === ostr ) list.push( 'MATCH', match );
                    if ( ctype === ostr || ctype === onum ) list.push( 'COUNT', count );
                case oarr:
                    return encode( 'SCAN', cursor, list || opt, null, cback );
                case onul:
                case ound:
                    return encode( 'SCAN', cursor, [], null, cback );
                default:
                    return error( 'SCAN', arguments );
            }
        }

        , sort : function ( key, opt, cback ) {
            var list = opt
                , order = null
                , limit = null
                , by = null
                , get = null
                , store = null
                , len = 0
                , el = null
                , i = 0
                ;

            if ( key === undefined )  return error( 'SORT', arguments );

            switch ( doString( opt ) ) {
                case oobj:
                    // shortcuts
                    order = opt.order;
                    limit = opt.limit;
                    by = opt.by;
                    get = opt.get;
                    store = opt.store;
                    list = [];
                    // check properties
                    if ( doString( order ) === ostr ) {
                        if ( /^ALPHA|ASC|DESC$/i.test( order ) ) list.push( order );
                    }
                    if ( doString( limit ) === oarr ) {
                        if ( limit.length >> 1 ) list.push( 'LIMIT', limit[ 0 ], limit[ 1 ] );
                    }
                    if ( doString( by ) === ostr ) list.push( 'BY', by );
                    if ( doString( get ) === oarr ) {
                        len = get.length;
                        for ( ; i < len; ) {
                            el = get[ i++ ];
                            if ( doString( el ) === ostr ) list.push( 'GET', el );
                        }
                    }
                    if ( doString( store ) === ostr ) list.push( 'STORE', store );
                case oarr:
                    return encode( 'SORT', key, list, null, cback );
                default:
                    return error( 'SORT', arguments );
            }
        }

        , ttl : function ( key, cback ) {
            if ( key === undefined )  return error( 'TTL', arguments );
            return encode( 'TTL', key, parseIntArray, cback );
        }

        , type : function ( key, cback ) {
            if ( key === undefined )  return error( 'TYPE', arguments );
            return encode( 'TYPE', key, null, cback );
        }

        , touch : function ( keys, cback ) {
            if ( ! keys ) return error( 'TOUCH', arguments );
            if ( isArray( keys ) ) return encode( 'TOUCH', keys[ 0 ], keys.slice( 1 ), parseIntArray, cback );
            return encode( 'TOUCH', keys, parseIntArray, cback );
        }

        , unlink : function ( keys, cback ) {
            if ( ! keys ) return error( 'UNLINK', arguments );
            if ( isArray( keys ) ) return encode( 'UNLINK', keys[ 0 ], keys.slice( 1 ), parseIntArray, cback );
            return encode( 'UNLINK', keys, parseIntArray, cback );
        }

        , wait : function ( key, timeout, cback ) {
            if ( key === undefined )  return error( 'WAIT', arguments );
            return encode( 'WAIT', key, + timeout, parseIntArray, cback );
        }

    };

};