diff --git a/binding/lua/Ip2region.lua b/binding/lua/Ip2region.lua index 7eb8ae5..fd32c66 100644 --- a/binding/lua/Ip2region.lua +++ b/binding/lua/Ip2region.lua @@ -11,10 +11,10 @@ local INDEX_BLOCK_LENGTH = 12; local TOTAL_HEADER_LENGTH = 8192; local _M = { dbFile = "", - dbFileHandler = nil, + dbFileHandler = "", dbBinStr = "", - HeaderSip = nil, - HeaderPtr = nil, + HeaderSip = "", + HeaderPtr = "", headerLen = 0, firstIndexPtr = 0, lastIndexPtr = 0, @@ -22,12 +22,35 @@ local _M = { }; _G["Ip2region"] = _M; --- function _M:new(obj) --- obj = obj or {}; --- setmetatable(obj, {__index = self}); --- return obj; --- end +-- set the __index to itself +_M.__index = _M; + +-- set the print meta-method +_M.__tostring = function(table) + local t = { + "dbFile=" .. table.dbFile, + "dbFileHandler=" .. table.dbFileHandler, + "headerLen=" .. table.headerLen, + "firstIndexPtr" .. table.firstIndexPtr, + "lastIndexPtr" .. table.lastIndexPtr, + "totalBlocks" .. table.totalBlocks + }; + + return table.concat(t, ","); +end + +--[[ +construct method + +@param obj +@return Ip2region object +--]] +function _M:new(obj) + obj = obj or {}; + setmetatable(obj, _M); + return obj; +end --[[ @@ -203,11 +226,9 @@ function _M:binarySearch(ip) if ( self.totalBlocks == 0 ) then -- check and open the original db file - if ( self.dbFileHandler == nil ) then - self.dbFileHandler = io.open(self.dbFile, "r"); - if ( not self.dbFileHandler ) then - return nil; - end + self.dbFileHandler = io.open(self.dbFile, "r"); + if ( not self.dbFileHandler ) then + return nil; end self.dbFileHandler:seek("set", 0); @@ -278,11 +299,9 @@ function _M:btreeSearch(ip) -- check and load the header if ( self.headerLen == 0 ) then -- check and open the original db file - if ( self.dbFileHandler == nil ) then - self.dbFileHandler = io.open(self.dbFile, 'r'); - if ( not self.dbFileHandler ) then - return nil; - end + self.dbFileHandler = io.open(self.dbFile, 'r'); + if ( not self.dbFileHandler ) then + return nil; end self.dbFileHandler:seek("set", 8); @@ -400,4 +419,18 @@ function _M:btreeSearch(ip) end +--[[ +close the object and do the basic gc +]]-- +function _M.close(self) + if ( self.dbFileHandler ~= "" ) then + self.dbFileHandler:close(); + end + + if ( self.dbBinStr ~= "" ) then + self.dbBinStr = nil; + end +end + + return _M; diff --git a/binding/lua/README.md b/binding/lua/README.md index 8f4becd..d682691 100644 --- a/binding/lua/README.md +++ b/binding/lua/README.md @@ -27,15 +27,20 @@ ip2region>> * 2, 通过如下流程在你的lua程序中使用 ```lua -- 包含模块 -local ip2region = require "Ip2region"; +require "Ip2region"; -- 创建查询对象 -- 设置ip2region.db的文件地址,dbFile表示ip2region.db数据库文件的地址 --- 或者通过设置属性,ip2region.dbFile = "ip2region.db file path"; -ip2region:setDbFile("ip2region.db file path"); +local ip2region = Ip2region:new({dbFile = "ip2region.db file path"}); + +-- 也可以通过如下方式设置dbFile +-- ip2region.dbFile = "ip2region.db file path"; +-- ip2region.setDbFile("ip2region.db file path"); + + local data; --- 查询,备注请使用“:”调用方法,不要使用“.” +-- 查询,备注,尽量请使用“:”调用方法,使用“.”需要主动传递ip2region对象参数 -- 1,binary查询 data = ip2region:binarySearch("101.233.153.103"); diff --git a/binding/lua/testSearcher.lua b/binding/lua/testSearcher.lua index e7c4831..ce4d759 100644 --- a/binding/lua/testSearcher.lua +++ b/binding/lua/testSearcher.lua @@ -12,15 +12,20 @@ Usage: lua testSearcher.lua [ip2region db file] [algorithm] os.exit(); end -local ip2region = require "Ip2region"; +require "Ip2region"; -- local cjson = require "cjson"; -- local socket = require "socket"; -- check and parse the dbFile and the method algorithm --- set the dbFile +-- Create a new ip2region object by the new interface +local ip2region = Ip2region:new({dbFile = arg[1]}); + +-- reset the dbFile by the follow two ways: -- ip2region.dbFile = arg[1]; -ip2region:setDbFile(arg[1]); +-- ip2region:setDbFile(arg[1]); + + local algorithm = "btree"; if ( arg[2] ~= nil ) then local arg_2 = string.lower(arg[2]); @@ -74,3 +79,7 @@ while ( true ) do end end end + +-- close the object +-- print(ip2region); +ip2region:close();