lua_c module forward with basic framework finished(tested)

This commit is contained in:
lionsoul 2018-10-05 21:39:35 +08:00
parent 57f4fb4383
commit 01ab0a0373
5 changed files with 157 additions and 31 deletions

View File

@ -15,7 +15,7 @@
* *
* @param dbFile path * @param dbFile path
*/ */
IP2R_API uint_t ip2region_create(ip2region_t ip2rObj, char *dbFile) IP2R_API uint_t ip2region_create(ip2region_t ip2rObj, const char *dbFile)
{ {
memset(ip2rObj, 0x00, sizeof(ip2region_entry)); memset(ip2rObj, 0x00, sizeof(ip2region_entry));
ip2rObj->headerLen = 0; ip2rObj->headerLen = 0;
@ -149,7 +149,7 @@ IP2R_API uint_t ip2region_memory_search(ip2region_t ip2rObj, uint_t ip, databloc
return 1; return 1;
} }
IP2R_API uint_t ip2region_memory_search_string(ip2region_t ip2rObj, char *ip, datablock_t datablock) IP2R_API uint_t ip2region_memory_search_string(ip2region_t ip2rObj, const char *ip, datablock_t datablock)
{ {
return ip2region_memory_search(ip2rObj, ip2long(ip), datablock); return ip2region_memory_search(ip2rObj, ip2long(ip), datablock);
} }
@ -226,7 +226,7 @@ IP2R_API uint_t ip2region_binary_search(ip2region_t ip2rObj, uint_t ip, databloc
return 1; return 1;
} }
IP2R_API uint_t ip2region_binary_search_string(ip2region_t ip2rObj, char *ip, datablock_t datablock) IP2R_API uint_t ip2region_binary_search_string(ip2region_t ip2rObj, const char *ip, datablock_t datablock)
{ {
return ip2region_binary_search(ip2rObj, ip2long(ip), datablock); return ip2region_binary_search(ip2rObj, ip2long(ip), datablock);
} }
@ -355,7 +355,7 @@ IP2R_API uint_t ip2region_btree_search(ip2region_t ip2rObj, uint_t ip, datablock
return 1; return 1;
} }
IP2R_API uint_t ip2region_btree_search_string(ip2region_t ip2rObj, char *ip, datablock_t datablock) IP2R_API uint_t ip2region_btree_search_string(ip2region_t ip2rObj, const char *ip, datablock_t datablock)
{ {
return ip2region_btree_search(ip2rObj, ip2long(ip), datablock); return ip2region_btree_search(ip2rObj, ip2long(ip), datablock);
} }
@ -367,7 +367,7 @@ IP2R_API uint_t ip2region_btree_search_string(ip2region_t ip2rObj, char *ip, dat
* @param offset * @param offset
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t getUnsignedInt(char *buffer, int offset) IP2R_API uint_t getUnsignedInt(const char *buffer, int offset)
{ {
return ( return (
((buffer[offset ]) & 0x000000FF) | ((buffer[offset ]) & 0x000000FF) |
@ -383,10 +383,11 @@ IP2R_API uint_t getUnsignedInt(char *buffer, int offset)
* @param ip * @param ip
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t ip2long(char *ip) IP2R_API uint_t ip2long(const char *ip)
{ {
int i = 0, p = 24; int i = 0, p = 24;
char buffer[4], *cs = ip; char buffer[4];
const char *cs = ip;
uint_t ipval = 0; uint_t ipval = 0;
while ( *cs != '\0' ) { while ( *cs != '\0' ) {

View File

@ -80,7 +80,7 @@ typedef datablock_entry * datablock_t;
* @param ip2rObj * @param ip2rObj
* @param dbFile path * @param dbFile path
*/ */
IP2R_API uint_t ip2region_create(ip2region_t, char *); IP2R_API uint_t ip2region_create(ip2region_t, const char *);
/** /**
* destroy the specified ip2region object * destroy the specified ip2region object
@ -98,7 +98,7 @@ IP2R_API uint_t ip2region_destroy(ip2region_t);
* @date 2016/06/30 * @date 2016/06/30
*/ */
IP2R_API uint_t ip2region_memory_search(ip2region_t, uint_t, datablock_t); IP2R_API uint_t ip2region_memory_search(ip2region_t, uint_t, datablock_t);
IP2R_API uint_t ip2region_memory_search_string(ip2region_t, char *, datablock_t); IP2R_API uint_t ip2region_memory_search_string(ip2region_t, const char *, datablock_t);
/** /**
@ -110,7 +110,7 @@ IP2R_API uint_t ip2region_memory_search_string(ip2region_t, char *, datablock_t)
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t ip2region_binary_search(ip2region_t, uint_t, datablock_t); IP2R_API uint_t ip2region_binary_search(ip2region_t, uint_t, datablock_t);
IP2R_API uint_t ip2region_binary_search_string(ip2region_t, char *, datablock_t); IP2R_API uint_t ip2region_binary_search_string(ip2region_t, const char *, datablock_t);
/** /**
* get the region associated with the specified ip address with b-tree algorithm * get the region associated with the specified ip address with b-tree algorithm
@ -121,7 +121,7 @@ IP2R_API uint_t ip2region_binary_search_string(ip2region_t, char *, datablock_t)
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t ip2region_btree_search(ip2region_t, uint_t, datablock_t); IP2R_API uint_t ip2region_btree_search(ip2region_t, uint_t, datablock_t);
IP2R_API uint_t ip2region_btree_search_string(ip2region_t, char *, datablock_t); IP2R_API uint_t ip2region_btree_search_string(ip2region_t, const char *, datablock_t);
/** /**
* get a unsinged long(4bytes) from a specified buffer start from the specified offset * get a unsinged long(4bytes) from a specified buffer start from the specified offset
@ -130,7 +130,7 @@ IP2R_API uint_t ip2region_btree_search_string(ip2region_t, char *, datablock_t);
* @param offset * @param offset
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t getUnsignedInt(char *, int); IP2R_API uint_t getUnsignedInt(const char *, int);
/** /**
* string ip to long * string ip to long
@ -138,7 +138,7 @@ IP2R_API uint_t getUnsignedInt(char *, int);
* @param ip * @param ip
* @return uint_t * @return uint_t
*/ */
IP2R_API uint_t ip2long(char *); IP2R_API uint_t ip2long(const char *);
/** /**
* long to string ip * long to string ip

32
binding/lua_c/Makefile Normal file
View File

@ -0,0 +1,32 @@
# ip2region luc c module Make file
# @author chenxin<chenxin619315@gmail.com>
# @date 2018/10/05
# @Note
# Please modify the LIBS and the LIB_DIR to fit you system
#
VER = 5.2
CC = gcc
LIBS = -I ../c/ -I /usr/include/lua$(VER)/
FFLAGS = -O2 -Wall -fPIC
SO_FILE = Ip2region.so
LIB_DIR = /usr/local/share/lua/$(VER)
all: ../c/ip2region.c ../c/ip2region.h lua_ip2region.c
$(CC) $(FFLAGS) $(LIBS) ../c/ip2region.c lua_ip2region.c -fPIC -shared -o $(SO_FILE)
install:
@if [ -d $(LIB_DIR) ];\
then\
sudo cp $(SO_FILE) $(LIB_DIR);\
echo "install Ip2region successfully.";\
else\
echo "Sorry, $(LIB_DIR) seems not not exits.";\
fi
clean:
find . -name \*.so | xargs rm -f
find . -name \*.o | xargs rm -f
.PHONY: clean

View File

@ -8,17 +8,17 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <lua.h> #include <lua.h>
#include <luaxlib.h> #include <lauxlib.h>
#include "../c/ip2region.h" #include "../c/ip2region.h"
#define L_METATABLE_NAME "ip2region" #define L_METATABLE_NAME "Ip2region"
/** create a new ip2region object with a specified dbFile */ /** create a new ip2region object with a specified dbFile */
static int lua_ip2region_new(lua_State *L) static int lua_ip2region_new(lua_State *L)
{ {
ip2region_entry *self; ip2region_entry *self;
char *dbFile; const char *dbFile;
/* Check the arguments are valid */ /* Check the arguments are valid */
dbFile = luaL_checkstring(L, 1); dbFile = luaL_checkstring(L, 1);
@ -45,7 +45,6 @@ static int lua_ip2region_destroy(lua_State *L)
ip2region_entry *self; ip2region_entry *self;
self = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME); self = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME);
ip2region_destroy(self); ip2region_destroy(self);
&self = NULL;
return 0; return 0;
} }
@ -56,22 +55,22 @@ static int lua_ip2region_destroy(lua_State *L)
do { \ do { \
entry = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME); \ entry = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME); \
ip = luaL_checkstring(L, 2); \ ip = luaL_checkstring(L, 2); \
while (0); } while (0); \
#define set_search_result(data, rptr) \ #define set_search_result(data, rptr) \
do { \ do { \
rptr = (datablock_entry *) lua_newuserdata(L, sizeof(datablock_entry)); \ rptr = (datablock_entry *) lua_newuserdata(L, sizeof(datablock_entry)); \
rptr->city_id = data.city_id; \ rptr->city_id = data.city_id; \
memcpy(rptr->data.region, data.region, strlen(data.region)); \ memcpy(rptr->region, data.region, strlen(data.region)); \
while (0); \ } while (0); \
/** ip2region_memory_search wrapper */ /** ip2region_memory_search wrapper */
static int lua_ip2region_memory_search(lua_State *L) static int lua_ip2region_memory_search(lua_State *L)
{ {
ip2region_entry *self; ip2region_entry *self;
char *addr; const char *addr;
datablock_entry data, *rptr; datablock_entry data, *rptr;
// self = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME); // self = (ip2region_entry *) luaL_checkudata(L, 1, L_METATABLE_NAME);
@ -97,8 +96,8 @@ static int lua_ip2region_memory_search(lua_State *L)
/** ip2region_binary_search wrapper */ /** ip2region_binary_search wrapper */
static int lua_ip2region_binary_search(lua_State *L) static int lua_ip2region_binary_search(lua_State *L)
{ {
ip2region_destroy *self; ip2region_entry *self;
char *addr; const char *addr;
datablock_entry data, *rptr; datablock_entry data, *rptr;
/* Check and get the search parameters */ /* Check and get the search parameters */
@ -119,8 +118,8 @@ static int lua_ip2region_binary_search(lua_State *L)
/** ip2region_btree_search wrapper */ /** ip2region_btree_search wrapper */
static int lua_ip2region_btree_search(lua_State *L) static int lua_ip2region_btree_search(lua_State *L)
{ {
ip2region_destroy *self; ip2region_entry *self;
char *addr; const char *addr;
datablock_entry data, *rptr; datablock_entry data, *rptr;
/* Check and get the search parameters */ /* Check and get the search parameters */
@ -142,10 +141,17 @@ static int lua_ip2region_btree_search(lua_State *L)
/** ip2long wrapper */ /** ip2long wrapper */
static int lua_ip2long(lua_State *L) static int lua_ip2long(lua_State *L)
{ {
char *addr; int argc;
const char *addr;
uint_t ipval; uint_t ipval;
argc = lua_gettop(L);
if ( argc == 1 ) {
addr = luaL_checkstring(L, 1); addr = luaL_checkstring(L, 1);
} else {
luaL_checkudata(L, 1, L_METATABLE_NAME);
addr = luaL_checkstring(L, 2);
}
if ( (ipval = ip2long(addr)) == 0 ) { if ( (ipval = ip2long(addr)) == 0 ) {
lua_pushnil(L); lua_pushnil(L);
@ -164,7 +170,7 @@ static int lua_ip2region_tostring(lua_State *L)
/* Push the string to return to lua */ /* Push the string to return to lua */
lua_pushfstring(L, lua_pushfstring(L,
"dbFile=%s, headerLen=%d, fristIndexPtr=%d, lastIndexPtr=%d, totalBlocks=%d" "dbFile=%s, headerLen=%d, fristIndexPtr=%d, lastIndexPtr=%d, totalBlocks=%d",
self->dbFile, self->headerLen, self->firstIndexPtr, self->dbFile, self->headerLen, self->firstIndexPtr,
self->lastIndexPtr, self->totalBlocks self->lastIndexPtr, self->totalBlocks
); );
@ -179,9 +185,9 @@ static const struct luaL_Reg ip2region_methods[] = {
{ "ip2long", lua_ip2long }, { "ip2long", lua_ip2long },
{ "memorySearch", lua_ip2region_memory_search }, { "memorySearch", lua_ip2region_memory_search },
{ "binarySearch", lua_ip2region_binary_search }, { "binarySearch", lua_ip2region_binary_search },
{ "btreeSerach", lua_ip2region_binary_search }, { "btreeSearch", lua_ip2region_btree_search },
{ "__gc", lua_ip2region_destroy }, { "__gc", lua_ip2region_destroy },
{ "__tostring", ip2region_tostring }, { "__tostring", lua_ip2region_tostring },
{ NULL, NULL }, { NULL, NULL },
}; };
@ -193,7 +199,7 @@ static const struct luaL_Reg ip2region_functions[] = {
/** module open function interface */ /** module open function interface */
int luaopen_ip2region(lua_State *L) int luaopen_Ip2region(lua_State *L)
{ {
/* Create a metatable and push it onto the stack */ /* Create a metatable and push it onto the stack */
luaL_newmetatable(L, L_METATABLE_NAME); luaL_newmetatable(L, L_METATABLE_NAME);
@ -215,4 +221,6 @@ int luaopen_ip2region(lua_State *L)
/* Finally register the object.func functions /* Finally register the object.func functions
* into the table witch at the top of the stack */ * into the table witch at the top of the stack */
luaL_newlib(L, ip2region_functions); luaL_newlib(L, ip2region_functions);
return 1;
} }

View File

@ -0,0 +1,85 @@
--[[
ip2region lua client test script
@author chenxin<chenxin619315@gmail.com>
]]--
-- check the command line arguments
if ( not arg[1] ) then
print([[
Usage: lua testSearcher.lua [ip2region db file] [algorithm]
+-Optional Algorithm: binary, b-tree, memory]]);
os.exit();
end
local Ip2region = require "Ip2region";
-- local cjson = require "cjson";
-- local socket = require "socket";
-- check and parse the dbFile and the method algorithm
-- Create a new ip2region object by the new interface
local ip2region = Ip2region.new(arg[1]);
-- reset the dbFile by the follow two ways:
-- ip2region.dbFile = arg[1];
-- ip2region:setDbFile(arg[1]);
local algorithm = "btree";
if ( arg[2] ~= nil ) then
local arg_2 = string.lower(arg[2]);
if ( arg_2 ~= "binary" and arg_2 ~= "memory" ) then
algorithm = "binary";
elseif ( arg_2 == "memory" ) then
algorithm = "memory";
end
end
-- local data = searcher:memorySearch("120.79.17.142");
-- local data = searcher:binarySearch("120.79.17.142");
-- local data = searcher:btreeSearch("120.79.17.142");
print("initializing " .. algorithm ..[[
+----------------------------------+
| ip2region test script |
| Author: chenxin619315@gmail.com |
| Type 'quit' to exit program |
+----------------------------------+]]
);
while ( true ) do
io.write("ip2region>> ");
io.input(io.stdin);
local line = io.read();
if ( line == nil ) then
-- do nothing
break;
elseif ( line == "quit" ) then
break;
elseif ( ip2region.ip2long(line) == nil ) then
print("Invalid ip address=", line);
else
local data;
local s_time = os.clock();
if ( algorithm == "btree" ) then
data = ip2region:btreeSearch(line);
elseif ( algorithm == "binary" ) then
data = ip2region:binarySearch(line);
elseif ( algorithm == "memory" ) then
data = ip2region:memorySearch(line);
end
local cost_time = (os.clock() - s_time) * 1000; -- to millseconds
if ( data == nil ) then
io.write("Failed for ip=", line, " is it a valid ip address ?");
else
io.write(string.format("%u|%s in %5f millseconds\n", data.city_id, data.region, cost_time));
end
end
end
-- close the object
-- print(ip2region);
ip2region:close();