You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.3 KiB
Lua
58 lines
1.3 KiB
Lua
local cbson = require("cbson")
|
|
local gfsfile = require("resty.moongoo.gridfs.file")
|
|
|
|
local _M = {}
|
|
|
|
local mt = { __index = _M }
|
|
|
|
function _M.new(db, name)
|
|
local name = name or 'fs'
|
|
return setmetatable(
|
|
{
|
|
_db = db,
|
|
_name = name,
|
|
_files = db:collection(name .. '.files'),
|
|
_chunks = db:collection(name .. '.chunks')
|
|
},
|
|
mt)
|
|
end
|
|
|
|
function _M.list(self)
|
|
return self._files:find({}):distinct('filename')
|
|
end
|
|
|
|
function _M.remove(self, id)
|
|
local r,err = self._files:remove({_id = cbson.oid(id)})
|
|
if not r then
|
|
return nil, "Failed to remove file metadata: "..err
|
|
end
|
|
r,err = self._chunks:remove({files_id = cbson.oid(id)});
|
|
if not r then
|
|
return nil, "Failed to remove file chunks: "..err
|
|
end
|
|
return r
|
|
end
|
|
|
|
function _M.find_version(self, name, version)
|
|
-- Positive numbers are absolute and negative ones relative
|
|
local cursor = self._files:find({filename = name}, {_id = 1}):limit(-1)
|
|
cursor:sort({uploadDate = (version < 0) and cbson.int(-1) or cbson.int(1)}):skip(version < 0 and (math.abs(version) - 1) or version)
|
|
local doc, err = cursor:next()
|
|
if not doc then
|
|
return nil, "No such file/version"
|
|
end
|
|
return doc._id
|
|
end
|
|
|
|
function _M.open(self, id)
|
|
return gfsfile.open(self, id)
|
|
end
|
|
|
|
|
|
function _M.create(self, name, opts, safe)
|
|
return gfsfile.new(self, name, opts, safe)
|
|
end
|
|
|
|
return _M
|
|
|