mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 12:43:09 +00:00
修复 mongo 游标没有数据 hasNext 返回 true,以及无效关闭游标的问题 (#1653)
Co-authored-by: yy151474 <yy151474@alibaba-inc.com>
This commit is contained in:
@@ -14,6 +14,7 @@ local table = table
|
|||||||
local bson_encode = bson.encode
|
local bson_encode = bson.encode
|
||||||
local bson_encode_order = bson.encode_order
|
local bson_encode_order = bson.encode_order
|
||||||
local bson_decode = bson.decode
|
local bson_decode = bson.decode
|
||||||
|
local bson_int64 = bson.int64
|
||||||
local empty_bson = bson_encode {}
|
local empty_bson = bson_encode {}
|
||||||
|
|
||||||
local mongo = {}
|
local mongo = {}
|
||||||
@@ -489,7 +490,10 @@ end
|
|||||||
|
|
||||||
function mongo_collection:findOne(query, projection)
|
function mongo_collection:findOne(query, projection)
|
||||||
local cursor = self:find(query, projection)
|
local cursor = self:find(query, projection)
|
||||||
return cursor:hasNext() and cursor:next()
|
if cursor:hasNext() then
|
||||||
|
return cursor:next()
|
||||||
|
end
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function mongo_collection:find(query, projection)
|
function mongo_collection:find(query, projection)
|
||||||
@@ -686,7 +690,7 @@ function mongo_cursor:hasNext()
|
|||||||
else
|
else
|
||||||
if self.__cursor and self.__cursor > 0 then
|
if self.__cursor and self.__cursor > 0 then
|
||||||
local name = self.__collection.name
|
local name = self.__collection.name
|
||||||
response = database:runCommand("getMore", bson.int64(self.__cursor), "collection", name, "batchSize", self.__limit)
|
response = database:runCommand("getMore", bson_int64(self.__cursor), "collection", name, "batchSize", self.__limit)
|
||||||
else
|
else
|
||||||
-- no more
|
-- no more
|
||||||
self.__document = nil
|
self.__document = nil
|
||||||
@@ -719,6 +723,10 @@ function mongo_cursor:hasNext()
|
|||||||
self.__limit = limit
|
self.__limit = limit
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if cursor.id == 0 and #self.__document == 0 then -- nomore
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -739,9 +747,9 @@ function mongo_cursor:next()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mongo_cursor:close()
|
function mongo_cursor:close()
|
||||||
if self.__cursor then
|
if self.__cursor and self.__cursor > 0 then
|
||||||
local coll = self.__collection
|
local coll = self.__collection
|
||||||
coll.database:send_command("killCursors", coll.name, "cursors", {self.__cursor})
|
coll.database:send_command("killCursors", coll.name, "cursors", {bson_int64(self.__cursor)})
|
||||||
self.__cursor = nil
|
self.__cursor = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -79,11 +79,20 @@ function test_find_and_remove()
|
|||||||
db.testcoll:dropIndex("*")
|
db.testcoll:dropIndex("*")
|
||||||
db.testcoll:drop()
|
db.testcoll:drop()
|
||||||
|
|
||||||
|
local cursor = db.testcoll:find()
|
||||||
|
assert(cursor:hasNext() == false)
|
||||||
|
|
||||||
db.testcoll:ensureIndex({test_key = 1}, {test_key2 = -1}, {unique = true, name = "test_index"})
|
db.testcoll:ensureIndex({test_key = 1}, {test_key2 = -1}, {unique = true, name = "test_index"})
|
||||||
|
|
||||||
ok, err, ret = db.testcoll:safe_insert({test_key = 1, test_key2 = 1})
|
ok, err, ret = db.testcoll:safe_insert({test_key = 1, test_key2 = 1})
|
||||||
assert(ok and ret and ret.n == 1, err)
|
assert(ok and ret and ret.n == 1, err)
|
||||||
|
|
||||||
|
cursor = db.testcoll:find()
|
||||||
|
assert(cursor:hasNext() == true)
|
||||||
|
local v = cursor:next()
|
||||||
|
assert(v)
|
||||||
|
assert(v.test_key == 1)
|
||||||
|
|
||||||
ok, err, ret = db.testcoll:safe_insert({test_key = 1, test_key2 = 2})
|
ok, err, ret = db.testcoll:safe_insert({test_key = 1, test_key2 = 2})
|
||||||
assert(ok and ret and ret.n == 1, err)
|
assert(ok and ret and ret.n == 1, err)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user