国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

resty-mongol3的簡單封裝

SimpleTriangle / 2086人閱讀

摘要:的簡單封裝近期項目中需要用到來操作數據庫,在上面找了給開源的發現支持不了的認證,后來發現對其改進了一下,能夠支持認證,因為業務中經常用到來進行操作,所以參照的方式對其進行了一下簡單的封裝,方便以后使用。

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); 柯里化是函數的一個比較高級的應用,想要...

    kk_miles 評論0 收藏0
  • ajax簡單封裝

    摘要:工作之余簡單封裝了的請求,但是工作中還是用,,內部封裝好了模塊笑。代碼解析參數創建高級瀏覽器和以上連接發送請求頭發送接收完成清除定時器成功超時超時了終止轉 工作之余簡單封裝了ajax的請求,但是工作中還是用jquery,axios,angular內部封裝好了http模塊(笑)。 ajax一般分為簡單的四部: 創建ajax對象(這里兼容ie的話要做一下處理) 連接,即請求對象的open...

    caoym 評論0 收藏0
  • node.js對mysql數據庫封裝庫node-transform-mysql庫 鏈式調用、使用簡單

    摘要:最近我準備寫一個這樣的庫,基于前期自己對的封裝是我使用過的一個框架,對它的模型模塊調用的方式很喜歡因此決定參考其,用實現一次。 在我自己的平常開發中很少有見到javascript對sql的封裝比較好的庫(找了一圈也沒找到、應該是暫時我沒發現),因此前期的項目中根據自己的項目情況實現了一套封裝方法。 最近我準備寫一個這樣的庫,基于前期自己對mysql的封裝(ThinkPHP是我使用過的一...

    Tikitoo 評論0 收藏0
  • js異步從入門到放棄(四)- Generator 封裝異步任務

    摘要:總結本文簡要介紹了函數的一些特性,重點在于說明如何使用函數對異步任務進行封裝,從而能夠讓異步代碼編寫的更加清晰。 在之前的文章介紹了傳統異步的實現方案,本文將介紹ES6中的一種全新的異步方案--Generator函數。 generator簡介 簡單介紹一下generator的原理和語法,(更詳細內容請看ECMAScript 6 入門,本文只介紹和異步相關的核心內容) 基本語法 通過一個...

    jimhs 評論0 收藏0

發表評論

0條評論

SimpleTriangle

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<