//包含mongodb驱动程序
var mongodb = require("mongodb");
//uscookie = require('./us.cookie.js'); //javascript处理Cookie.此处没带命名空间，好像nodejs后台是独立的，主文件usmain.js带了命名空间，以后再考虑。
//mongodb安装位置
var server = new mongodb.Server('192.168.100.71', 27017, { auto_reconnect: true });
//var server = new mongodb.Server('121.37.60.186', 14072, { auto_reconnect: true });
//指定数据库
var db = new mongodb.Db('UseStudio_Develop', server, { safe: true });

//打开数据库,console.log('connect');输出调试信息到控制台
db.open(function (err, db) { if (!err) { console.log('connect'); } else { console.log(err); } });



//尝试写一个通用存储过程。这样后台代码可以极度简单。pArr为参数数组。尝试成功
//以后做后台数据库操作，凡是调用存储过程的，都可以使用统一的解决方案，节约编码，更好控制参数。极度简单编程，
exports.US_CommonPro = function (req, uscookie, pArr, callback) {
    var i;//定义循环变量
    for (i = 0; i < pArr.length; i++) { pArr[i] = decodeURIComponent(pArr[i]); }//解密中文字符串。
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    var _islogin = uscookie.IsloginId(req, pArr[1]); //得到用户是否已经认证的标识。
    //所有传递进来的参数后面加一个是否已经登录的标识，由于js参数任意，不会报错，可以省略很多逻辑,在数据库中可以更好发挥作用，比如选取用户，已经登录的选取不了则自动创建。
    pArr.push(_islogin); //重要,向数据库追加一个认证参数，有些地方需要使用到，可以节约编码。
    //拼凑参数方法
    var _pro = "" + pArr[0] + "('"; //命令拼凑
    for (i = 1; i < pArr.length; i++) { _pro += pArr[i]; if (i < pArr.length - 1) _pro += "','"; } //拼凑参数
    _pro += "')"; //拼凑结束。
    console.log(_pro);
    //是否有权限执行数据库后续操作
    if (US_DB_Pri(req, uscookie, pArr)) {
        //console.log(_pro); console.log("" + pArr[0] + "('" + pArr[1] + "')");比较拼凑结果
        //db.eval("" + pArr[0] + "('" + pArr[1] + "')", function (err, _json) {   //元素调用方法
        db.eval(_pro, function (err, _json) {  //拼凑调用方法
            console.log("US_CommonPro ......");
            console.log(_json);
            callback(JSON.stringify(_json));
        });
    }
}

//有些操作需要判断用户登录Cookie.此处作为局部变量还是全局变量？？？？？？暂时不管了，以后再看
var _noPri = ["Select_OneUserByID"];//无需判断权限的操作
var _yesPri = ["Add_Folder", "Add_File", "Delete_Folder", "Update_Folder", "Update_FileContent"]; //需要判断Cookie是否有权限的操作。
//参数C为传递进来的存储过程名字，有些存储过程需要权限，有些不需要。
//pArr[0]为存储过程名字，pArr[1]为未认证userid。
//参数req为前台传递进来的请求，参数uscookie为前台传进来的Cookie类。
US_DB_Pri = function (req, uscookie, pArr) {
    var i;
    //普通选取操作，无需权限。
    for (i = 0; i < _noPri.length; i++) if (pArr[0] == _noPri[i]) return true; //无需权限的操作
    //需要权限的操作，比如增删改。
    for (i = 0; i < _yesPri.length; i++) {
        if (pArr[0] == _yesPri[i]) {
            if (pArr[pArr.length - 1]) return true; //如果Cookie值匹配，则赋予权限,pArr[pArr.length-1]保存了Cookie值是否匹配的返回值。
            else return false; //如果Cookie值不匹配，不赋予权限
        }
    }
    return false;//默认返回没有权限。
}



//-------------------------------------------------------------数据库操作已经封装，以下所有代码无用了，仅仅做为参考------------------------------


//选取数据的示例
exports.select = function (sql, callback) {
    db.collection('Develop', { safe: true }, function (err, collection) {
        //为啥monogodb返回多条数据不是Json。有点想不通，要先转数组，再转json。而选取一条数据好像不用
        //collection.find(function (err, _json) { callback(_json); });
        //查找所有数据。
        //console.log(collection);
        collection.find().toArray(function (err, _json) { callback(JSON.stringify(_json)); })
        //根据条件选取数据
        //collection.find({ "UserDirectoryName": "自然岩壁" }).toArray(function (err, _json) { callback(JSON.stringify(_json)); })
        //根据条件只选取一条数据。为啥取出来的还不是json，还需要转换为json?mongdb需要改写。
        //collection.findOne({ "UserDirectoryName": "自然岩壁" }, function (err, _json) { callback(JSON.stringify(_json)); })
    });
}
//选取一个指定用户id的用户
exports.SelectOneUserByID = function (sql, userid, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    //db.eval("testparam('自然岩壁')", function (err, _json) {
    db.eval("Select_OneUserByID('" + userid + "')", function (err, _json) {
        console.log("SelectOneUserByID ......");
        console.log(_json);
        callback(JSON.stringify(_json));
    });
}
//创建一个项目或者文件夹。
exports.Add_Folder = function (sql, userid, parentid, parentdeep, folderid, foldername, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    //db.eval("testparam('自然岩壁')", function (err, _json) {
    db.eval("Add_Folder('" + userid + "','" + parentid + "','" + parentdeep + "','" + folderid + "','" + foldername + "')", function (err, _json) {
        console.log("Add_Folder ......");
        callback(JSON.stringify(_json));
    });
}
//创建一个文件
exports.Add_File = function (sql, userid, parentid, parentdeep, fileid, filename, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    //db.eval("testparam('自然岩壁')", function (err, _json) {
    db.eval("Add_File('" + userid + "','" + parentid + "','" + parentdeep + "','" + fileid + "','" + filename + "')", function (err, _json) {
        console.log("Add_File ......");
        callback(JSON.stringify(_json));
    });
}
//删除一个项目或者文件夹
exports.Delete_Folder = function (sql, userid, parentdeep, folderid, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    db.eval("Delete_Folder('" + userid + "','" + parentdeep + "','" + folderid + "')", function (err, _json) {
        console.log("Delete_Folder ......");
        callback(JSON.stringify(_json));
    });
}
//更新一个项目或者文件夹
exports.Update_Folder = function (sql, userid, parentdeep, folderid, foldername, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    db.eval("Update_Folder('" + userid + "','" + parentdeep + "','" + folderid + "','" + foldername + "')", function (err, _json) {
        console.log("Update_Folder ......");
        callback(JSON.stringify(_json));
    });
}
//更新一个文件的内容
exports.Update_FileContent = function (sql, userid, parentdeep, fileid, filecontent, callback) {
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    db.eval("Update_FileContent('" + userid + "','" + parentdeep + "','" + fileid + "','" + filecontent + "')", function (err, _json) {
        console.log("Update_FileContent ......");
        console.log(_json);
        callback(JSON.stringify(_json));
    });
}







exports.Operating = function (ele, callback) {
    db.eval('Operating("' + ele + '")', function (err, _json) {
        console.log(_json);
        console.log(err);
        callback(JSON.stringify(_json));
    });
}
//存储过程示例，带参数
exports.testparam = function (sql, callback) {
    var _param = "自然岩壁";
    console.log(_param);
    //eval的参数传递要注意，传递字符用单引号。传递字符变量用'"++"'。有点纠结。不用单引号eval出来是个对象。所以一定要单引号
    //db.eval("testparam('自然岩壁')", function (err, _json) {
    db.eval("testparam('"+_param+"')", function (err, _json) {
        console.log(_json);
        callback(JSON.stringify(_json));
    });
}

exports.Modify = function (ele, callback) {
    console.log(ele);
    db.eval('DOP_modifyedit("' + ele + '")', function (err, _json) {
        console.log(_json);
        console.log(err);
        callback(JSON.stringify(_json));
        callback(JSON.stringify(err));
    });
}




//封装数据库连接，暂时不做。以后再看
/*BlogProvider = function (host, port, database) {
    //指定服务器
    this.server = new mongodb.Server(host, port, { safe: false }, { auto_reconnect: true }, {});
    //指定数据库
    this.db = new mongodb.Db(database, this.server);
    //打开连接
    this.db.open(function (err, db) { if (!err) { console.log('connect'); } else { console.log(err); } });
}
BlogProvider.prototype.proselect = function (sql, callback) {
db.eval("testpro()", function (err, _json) {console.log(_json);callback(JSON.stringify(_json));});}
exports.BlogProvider = BlogProvider;*/



