下面这段 C++ 小工具用于从 SQLite 数据库 game.db 中读取三国志项目的游戏数据,并将结果以 Lua 表的形式导出到文件中。代码里包含了道具(goods)、英雄(child)、装备(equipment)和技能(skill)四种数据的提取逻辑,通过注释块切换不同的 SQL 查询和回调处理函数。下面给出的版本当前启用的是装备导出分支。
extern "C"
{
#include "sqlite3.h"
}
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <fstream>
using namespace std;
fstream file;
string db_file = "game.db";
string file_name = "goods.lua";
/*
string sql = "select goods_id,name,descrip,sicon,sort_type from goods where type=0";
int callback(void *p, int count, char** data, char** Colname)
{
string str;
str = "['";
str += data[0];//id
str += "']={";
str += "\n\t['name']='";
str += data[1]; // name
str += "',";
str += "\n\t['brief']='";
str += data[2]; // brief
str += "',";
str += "\n\t['sicon']='icon/goods/";
str += data[3]; // sicon
str += ".png',";
str += "\n\t['sort']='";
str += data[4]; // sort
str += "'},\n";
file.write(str.c_str(), str.length());
return 0;
}
*/
/*
//hero
string sql = "select child_id , name ,descrip ,quality,skill_id,hp,atk,atk,sicon,bicon,camp from child";
int callback(void *p, int count, char** data, char** Colname)
{
string str;
str = "['";
str += data[0];//id
str += "']={";
str += "\n\t['name']='";
str += data[1]; // name
str += "',";
str += "\n\t['brief']='";
str += data[2]; // brief
str += "',";
str += "\n\t['quality']='";
str += data[3]; // quality
str += "',";
str += "\n\t['skill_id']='";
str += data[4]; // skill_id
str += "',";
str += "\n\t['base_hp']='";
str += data[5]; // hp
str += "',";
str += "\n\t['base_attack']='";
str += data[6]; // attack
str += "',";
str += "\n\t['base_speed']='";
str += data[7]; // speed
str += "',";
str += "\n\t['sicon']='icon/hero/";
str += data[8]; // sicon
str += ".png',";
str += "\n\t['bicon']='icon/hero/";
str += data[9]; // bicon
str += ".png',";
str += "\n\t['camp']='";
str += data[10]; // camp
str += "'";
str += "},\n";
file.write(str.c_str(), str.length());
return 0;
}
*/
// equip
string sql = "select equipment_id , name ,descrip ,quality,type,atk,sicon,bicon,hp,hp from equipment";
int callback(void *p, int count, char** data, char** Colname)
{
string str;
str = "['";
str += data[0];//id
str += "']={";
str += "\n\t['name']='";
str += data[1]; // name
str += "',";
str += "\n\t['brief']='";
str += data[2]; // brief
str += "',";
str += "\n\t['quality']='";
str += data[3]; // quality
str += "',";
str += "\n\t['type']='";
str += data[4]; // type
str += "',";
str += "\n\t['attack']='";
str += data[5]; // attack
str += "',";
str += "\n\t['sicon']='icon/equip/";
str += data[6]; // sicon
str += ".png',";
str += "\n\t['bicon']='icon/equip/";
str += data[7]; // bicon
str += ".png',";
str += "\n\t['hp']='";
str += data[8]; // hp
str += "',";
str += "\n\t['speed']='";
str += data[9]; // speed
str += "'";
str += "},\n";
file.write(str.c_str(), str.length());
return 0;
}
/* skill
string sql = "select skill_id,name,descrip,quality,type,atk,sicon,bicon from skill";
int callback(void *p, int count, char** data, char** Colname)
{
string str;
str = "['";
str += data[0];//id
str += "']={";
str += "\n\t['name']='";
str += data[1]; // name
str += "',";
str += "\n\t['brief']='";
str += data[2]; // brief
str += "',";
str += "\n\t['quality']='";
str += data[3]; // quality
str += "',";
str += "\n\t['type']='";
str += data[4]; // type
str += "',";
str += "\n\t['attack']='";
str += data[5]; // attack
str += "',";
str += "\n\t['sicon']='icon/skill/";
str += data[6]; // sicon
str += ".png',";
str += "\n\t['bicon']='icon/skill/";
str += data[7]; // bicon
str += ".png";
str += "'},\n";
file.write(str.c_str(), str.length());
return 0;
}
*/
int main()
{
sqlite3 *db;
int res = sqlite3_open(db_file.c_str(), &db);
if (res)
{
sqlite3_close(db);
return 0;
}
file.open(file_name, ios::out);
char*errorMsg;
string str;
str = "local t={\n";
file.write(str.c_str(), str.length());
sqlite3_exec(db, sql.c_str(), callback, 0, &errorMsg);
str = "}\nreturn t";
file.write(str.c_str(), str.length());
file.flush();
file.close();
//cout << errorMsg << endl;
// system("pause");
return 0;
}