摘要:的簡單封裝近期項目中需要用到來操作數據庫,在上面找了給開源的發現支持不了的認證,后來發現對其改進了一下,能夠支持認證,因為業務中經常用到來進行操作,所以參照的方式對其進行了一下簡單的封裝,方便以后使用。
resty-mongol3的簡單封裝
近期項目中需要用到 openresty 來操作 mongodb 數據庫,在 github 上面找了給開源的 resty-mongol 發現支持不了 mongo3.0 的認證,后來發現 resty-mongol3 對其改進了一下,能夠支持 mongo3.0 認證,因為業務中經常用到 mongo 來進行操作,所以參照 mongo shell 的方式對其進行了一下簡單的封裝,方便以后使用。(因為業務需要,有的方法不要被支持,固沒有封裝)如有 bug ,望大家批評指正。
local mongo = require("resty.mongol") local object_id = require("resty.mongol.object_id") local _M = { _VERSION = "0.0.1" } local metatable = { __index = _M } -- 創建objectId _M.objectId = function(str) local buf = (str:gsub("..", function (cc) return string.char(tonumber(cc, 16)) end)) return object_id.new(buf) end --[[ @desc Creates a MongoClient instance. @params opts @type table @return table @type table A MongoClient instance ]] function _M.new(self, opts) opts = opts or {} local timeout = opts.timeout or 3000 local host = opts.host or "localhost" local port = opts.port or 27017 local passwd = opts.passwd or "" local user = opts.user or "" local database = opts.database or "admin" local keepalive = (opts.keepalive and opts.keepalive * 1000) or 60000 local poolSize = opts.poolSize or 1000 return setmetatable({ timeout = timeout, host = host, port = tostring(port), user = user, passwd = passwd, database = database, keepalive = keepalive, poolSize = poolSize, _db = database, _user = user, _passwd = passwd, _sort = {}, _limit = 100, _skip = 0, }, metatable) end --[[ @desc get mongodb"s connection objects. ]] local function getMgoConn(mgoConfig) -- 獲取連接對象 local mgoConn = mongo:new() if not mgoConn then return nil, "get mongo connection occur error" end -- 設置鏈接超時 mgoConn:set_timeout(mgoConfig.timeout) --獲取連接客戶端 local ok, err =mgoConn:connect(mgoConfig.host, mgoConfig.port) if not ok then return nil, err end return mgoConn, nil end --[[ @desc pack connection commands. ]] local function packConnCmd(self, mgoConn, cmd, ... ) local result, err = mgoConn[cmd](mgoConn, ... ) mgoConn:set_keepalive(self.keepalive, self.poolSize) return result, err end --[[ @desc this is a map of mongol.conn"s command. ]] local connCmd = { isMaster = "ismaster", getPrimary = "getprimary", getReusedTime = "get_reused_times", dbs = "databases", } for k,v in pairs(connCmd) do _M[k] = function (self, ...) --獲取連接客戶端 local mgoConn, err = getMgoConn(self) if not mgoConn then return nil, err end return packConnCmd(self, mgoConn, v, ...) end end --[[ @desc switch db by dbName and auth your id @params @return Returns a database object, or nil. ]] function _M.useDatabase(self, dbName, user, passwd) --獲取連接客戶端 self._db = dbName self._user = user or self._user self._passwd = passwd or self._psswd return string.format("%s %s","current database is", dbName) end function _M.ping( self ) --獲取連接客戶端 local mgoConn, err = getMgoConn(self) if not mgoConn then return nil, err end local db = mgoConn:new_db_handle(self._db) if not db then return nil, "get database occur error" end --用戶授權 local count, err = mgoConn:get_reused_times() if (count == 0) or err then if self._user and self._passwd then local ok, err = db:auth_scram_sha1(self._user, self._passwd) if not ok then return nil, err end end end return "ok", nil end --[[ @desc switch db by self.dbName and auth your id @params dbName @type table @default self.database user @type string @default self.user passwd @type string @default self.passwd @return Returns a database object, or nil. ]] local function getDB(self) --獲取連接客戶端 local mgoConn, err = getMgoConn(self) if not mgoConn then return nil, nil, err end local db = mgoConn:new_db_handle(self._db) if not db then return nil, nil, "get database occur error" end --用戶授權 local count, err = mgoConn:get_reused_times() if (count == 0) or err then if self._user and self._passwd then local ok, err = db:auth_scram_sha1(self._user, self._passwd) if not ok then return nil, nil, err end end end return db, mgoConn, nil end local dbCmd = { addUser = "add_user", -- getColl = "get_col", -- getGrid = "get_grid", dropDatabase = "dropDatabase", } --[[ @desc pack database commands. ]] local function packDBCmd(self, db, mgoConn, cmd, ... ) local result, err = db[cmd](db, ... ) mgoConn:set_keepalive(self.keepalive, self.poolSize) return result, err end for k,v in pairs(dbCmd) do _M[k] = function (self, ...) --獲取連接客戶端 local db, mgoConn, err = getDB(self) if not db then return nil, "get current database occur error " .. err end return packDBCmd(self, db, mgoConn, v, ...) end end function _M.list( self ) --獲取連接客戶端 local db, mgoConn, err = getDB(self) if not db then return nil, "get current database occur error " .. err end -- return packDBCmd(self, db, mgoConn, v, ...) local cursor, err = db:listcollections() if not cursor then return nil, string.format("%s %s %s", "system.namespaces", "find occur error", err) end local results = {} for index, item in cursor:pairs() do table.insert(results, item) end mgoConn:set_keepalive(self.keepalive, self.poolSize) return result, err end function _M.getCollection( self, collName ) self.collName = collName return self end local collCmd = { count = "count", drop = "drop", update = "update", insert = "insert", delete = "delete", } --[[ @desc pack collection"s commands. ]] local function packCollCmd(self, db, mgoConn, cmd, ... ) --獲取集合 local coll = db:get_col(self.collName) if not coll then return nil, "get collection occur error" end local result, err = coll[cmd](coll, ... ) mgoConn:set_keepalive(self.keepalive, self.poolSize) return result, err end for k,v in pairs(collCmd) do _M[k] = function (self, ...) --獲取連接客戶端 local db, mgoConn, err = getDB(self) if not db then return nil, "get current database occur error " .. err end return packCollCmd(self, db, mgoConn, v, ...) end end function _M.sort( self, fields ) self._sort = fields return self end function _M.limit( self, num ) self._limit = num return self end function _M.skip( self, num ) self._skip = num return self end --[[ find 方法要在用戶每次操作后直接幫他關閉鏈接,所以沒有返回游標給用戶,而是自己內部遍歷了下,直接返回結果 ]] function _M.find( self, ... ) --獲取連接客戶端 local db, mgoConn, err = getDB(self) if not db then return nil, "get current database occur error " .. err end --獲取集合 local coll, err = db:get_col(self.collName) if not coll then return nil, "get collection occur error" end local cursor, err = coll["find"](coll, ... ) if not cursor then return nil, string.format("%s %s %s", self.collName, "find occur error", err) end cursor:limit(self._limit) cursor:skip(self._skip) cursor = cursor:sort(self._sort) local results = {} for index, item in cursor:pairs() do table.insert(results, item) end mgoConn:set_keepalive(self.keepalive, self.poolSize) return results, err end return _M
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18988.html
摘要:函數被轉化之后得到柯里化函數,能夠處理的所有剩余參數。因此柯里化也被稱為部分求值。那么函數的柯里化函數則可以如下因此下面的運算方式是等價的。而這里對于函數參數的自由處理,正是柯里化的核心所在。額外知識補充無限參數的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函數的一個比較高級的應用,想要...
摘要:最近我準備寫一個這樣的庫,基于前期自己對的封裝是我使用過的一個框架,對它的模型模塊調用的方式很喜歡因此決定參考其,用實現一次。 在我自己的平常開發中很少有見到javascript對sql的封裝比較好的庫(找了一圈也沒找到、應該是暫時我沒發現),因此前期的項目中根據自己的項目情況實現了一套封裝方法。 最近我準備寫一個這樣的庫,基于前期自己對mysql的封裝(ThinkPHP是我使用過的一...
摘要:總結本文簡要介紹了函數的一些特性,重點在于說明如何使用函數對異步任務進行封裝,從而能夠讓異步代碼編寫的更加清晰。 在之前的文章介紹了傳統異步的實現方案,本文將介紹ES6中的一種全新的異步方案--Generator函數。 generator簡介 簡單介紹一下generator的原理和語法,(更詳細內容請看ECMAScript 6 入門,本文只介紹和異步相關的核心內容) 基本語法 通過一個...
閱讀 1207·2019-08-30 15:55
閱讀 954·2019-08-30 15:55
閱讀 2150·2019-08-30 15:44
閱讀 2880·2019-08-29 14:17
閱讀 1130·2019-08-29 12:45
閱讀 3301·2019-08-26 10:48
閱讀 3133·2019-08-23 18:18
閱讀 2599·2019-08-23 16:47