// sxh-level.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "tdx-level.h"
//#include <boost/unordered_map.hpp>
#include "util.h"
#pragma comment(lib, "libmysql.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
MYSQL *conn;
MYSQL *userinfo_conn;
// 根据UID进行MAP
bmap person_map;
typedef bmap::iterator pm_iter;
unsigned long long MAX_USERID = 0;
char *host = NULL;
char *savepath = NULL;
int saveall = 0;
#define ROOT_DIR "E:\\HierarchicalData"
std::string& trim(std::string &s) {
if (s.empty()) {
return s;
}
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
//动态设置的变量
char *server = NULL ;
char *user = NULL;
char *password = NULL ;//“******”为你设置的密码
char *database = NULL;
static char server_g[30]={0},user_g[30]={0},password_g[30]={0},database_g[30]={0};
void WriteTdxNet() {
LPTSTR lpPath = new char[MAX_PATH];
strcpy(lpPath, "e:\\HierarchicalData\\IniFileInformation.ini");
WritePrivateProfileString("HD_NET", "server", server, lpPath);
WritePrivateProfileString("HD_NET", "user", user, lpPath);
WritePrivateProfileString("HD_NET", "password", password, lpPath);
WritePrivateProfileString("HD_NET", "database", database, lpPath);
delete [] lpPath;
}
void ReadTdxNet() {
LPTSTR lpPath = new char[MAX_PATH];
strcpy(lpPath, "e:\\HierarchicalData\\IniFileInformation.ini");
GetPrivateProfileString("HD_NET", "server", "", server_g, sizeof(server_g), lpPath);
GetPrivateProfileString("HD_NET", "user", "", user_g, sizeof(user_g), lpPath);
GetPrivateProfileString("HD_NET", "password", "", password_g, sizeof(password_g), lpPath);
GetPrivateProfileString("HD_NET", "database", "", database_g, sizeof(database_g), lpPath);
server = server_g;
user = user_g;
password = password_g;
database = database_g;
logInfo("server:%s user:%s password:%s database:%s",server,user,password,database);
delete [] lpPath;
}
int conndb(){
conn = mysql_init(NULL);
if ( host != NULL )
server = host;
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)){
logInfo("connnect db(%s/%s) faild:%s", server, database, (conn));
return -1;
}
else{
logInfo("connect db(%s/%s) succeed", server, database);
}
if ( mysql_set_character_set(conn, "utf8" ) ) {
logInfo ( "err, %s\n" , mysql_error( conn) ) ;
}
return 0;
}
int userinfo_conndb()
{
userinfo_conn = mysql_init(NULL);
if ( host != NULL )
server = host;
if(!mysql_real_connect(userinfo_conn, server, user, password, database, 0, NULL, 0))
logInfo("%s connnect db(%s/%s) faild:%s", __FUNCTION__, server, database, (userinfo_conn));
else
logInfo("%s connect db(%s/%s) succeed", __FUNCTION__, server, database);
if ( mysql_set_character_set(userinfo_conn, "utf8" ) ) {
logInfo ( "%s err, %s\n" , __FUNCTION__, mysql_error(userinfo_conn) ) ;
}
return 0;
}
string& replace_all(string& str,const string& old_value,const string& new_value) {
while(true) {
string::size_type pos(0);
if((pos=str.find(old_value))!=string::npos )
str.replace(pos,old_value.length(),new_value);
else break;
}
return str;
}
string& replace_all_distinct(string& str,const string& old_value,const string& new_value) {
for(string::size_type pos(0); pos!=string::npos; pos+=new_value.length()) {
if( (pos=str.find(old_value,pos))!=string::npos )
str.replace(pos,old_value.length(),new_value);
else break;
}
return str;
}
void query_alluserinfo(char *table){
int classification;
static int count = 0;
MYSQL_RES * result; //保存结果集的
MYSQL_ROW row; //代表的是结果集中的一行
unsigned int user_id = 0;
char query[1024]= {};
//每行10个
_snprintf(query, sizeof(query),
"select id, dailishangjigouhao,tuijianren,refered_id ,dailishangmingcheng,phone,name,registertime from %s", table);//57
if ( mysql_query(userinfo_conn, query) != 0 ){
logInfo("mysql_query failed!%s", query);
return;
}
else{
if ( (result = mysql_store_result(userinfo_conn)) == NULL ){
logInfo("save result set error!%s", query);
return;
}
else{
while ( (row = mysql_fetch_row(result)) != NULL ){
user_id = atoi(row[0]);
person_map[user_id]->per.id = user_id;
if ( user_id == 0 )
continue;
if ( row[1] != NULL ) person_map[user_id]->per.dailishangjigouhao = trim(replace_all((string)row[1], "\"", ""));
if ( row[2] != NULL ) person_map[user_id]->per.tuijianren = trim(replace_all((string)row[2], "\"", ""));
if ( row[3] != NULL ) person_map[user_id]->per.refered_id = atoi(row[3]);
if ( row[4] != NULL ) person_map[user_id]->per.dailishangmingcheng = trim(replace_all((string)row[4], "\"", ""));
if ( row[5] != NULL ) person_map[user_id]->per.phone = trim(replace_all((string)row[5], "\"", ""));
if ( row[6] != NULL ) person_map[user_id]->per.name = trim(replace_all((string)row[6], "\"", ""));
if ( row[7] != NULL ) person_map[user_id]->per.registertime = trim(replace_all((string)row[7], "\"", ""));
static long long j = 0;
++j;
if ( j % 20000 == 0 )
logInfo("%s %d userinfo.userid = %d.", __FUNCTION__, j,user_id);
}
}
}
mysql_free_result(result); //释放结果集
}
DWORD WINAPI query_userinfo_thread( LPVOID lpParam ) {
char table[35];
userinfo_conndb();
if(!GetPrivateProfileString("query_userinfo", "table", "", table, sizeof(table), "e:\\HierarchicalData\\IniFileInformation.ini"))
perror("GetPrivateProfileString");
logInfo("%s begin query query_alluserinfo from %s", __FUNCTION__, table);
query_alluserinfo(table);
logInfo("%s finish query query_alluserinfo", __FUNCTION__);
return 0;
}
void writeFilersInterval(pvap va, FILE *fp){
fprintf(fp, "\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\"\n",
va->per.dailishangjigouhao.c_str() , va->per.tuijianren.c_str(), va->per.dailishangmingcheng.c_str(),va->per.phone.c_str(),va->per.name.c_str(),va->per.registertime.c_str());
}
void echovap(pvap pv, FILE *fp, int *level)
{
int k = 0, pid;
pnode tmp, elt;
char buf[2048];
static int num = 0;
static pvap lpv = pv;
static unsigned long long recursion = 0;
int control_level = 0;
LL_FOREACH_SAFE(pv->levels[k][0], elt, tmp){
pid = person_map[elt->num]->pid;
if ( pid != 0 ){
if ( person_map[pid]->flare.empty() ){
_snprintf(buf, sizeof(buf), "%s[%d].%s[%d]",person_map[pid]->per.dailishangmingcheng.c_str(), pid,
person_map[elt->num]->per.dailishangmingcheng.c_str(), elt->num);
//logInfo("pid!=0情况下。flare是空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
else{
_snprintf(buf, sizeof(buf), "%s.%s[%d]",
person_map[pid]->flare.c_str(),
person_map[elt->num]->per.dailishangmingcheng.c_str(), elt->num);
//logInfo("pid!=0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
//person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
}
else{
_snprintf(buf, sizeof(buf), "%s%s%s[%d]",
person_map[elt->num]->flare.empty() ? "" : person_map[elt->num]->flare.c_str(),
person_map[elt->num]->flare.empty() ? "" : ".",
person_map[elt->num]->per.dailishangmingcheng.c_str(), elt->num);
//logInfo("pid==0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
}
if ( person_map[elt->num]->leves_num > *level )
*level = person_map[elt->num]->leves_num;
control_level = GetPrivateProfileInt("echovap", "control_level", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if( person_map[elt->num]->leves_num <= control_level ){
person_map[elt->num]->flare = buf;
fprintf(fp, "%s\n", person_map[elt->num]->flare.c_str());
//logInfo("buf:%s ", person_map[elt->num]->flare.c_str());
lpv->nums++;
}
++recursion;
//logInfo("recursion 值为 %d",recursion);
echovap(person_map[elt->num], fp, level);
}
// return num;
}
void echoflare(pvap pv, FILE *fp, int *level)
{
int k = 0, pid;
pnode tmp, elt;
char * buf = (char *)malloc(sizeof(char)*1024*10*10+1);
static int num = 0;
static pvap lpv = pv;
static unsigned long long recursion = 0;
int control_level = 0;
pnode no;
bool status = false;
LL_FOREACH_SAFE(pv->levels[k][0], elt, tmp){
pnode tmp2,elt2;
status = false;
//遍历上层链跟下层链是否匹配
LL_FOREACH_SAFE(pv->relationchain[k][0],elt2,tmp2){
if(elt->num == elt2->num){
person_map[elt->num]->is_infiniteloop=true;
person_map[elt->num]->lowerchain_deadid = elt->num;
logInfo(" have infinite loop! id:%d. upchain:%d downchain:%d\n",pv->user_id,elt2->num,elt->num);
status = true;
}
}
if(status)
continue;
pid = person_map[elt->num]->pid;
if ( pid != 0 ){
if ( person_map[pid]->flare.empty() ){
_snprintf(buf, sizeof(char)*1024*10*10+1, "%s[%s].%s[%s]",
person_map[pid]->per.dailishangmingcheng.c_str(), person_map[pid]->per.dailishangjigouhao.c_str(),
person_map[elt->num]->per.dailishangmingcheng.c_str(), person_map[elt->num]->per.dailishangjigouhao.c_str());
//logInfo("pid!=0情况下。flare是空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
else{
_snprintf(buf, sizeof(char)*1024*10*10+1, "%s.%s[%s]",
person_map[pid]->flare.c_str(),
person_map[elt->num]->per.dailishangmingcheng.c_str(), person_map[elt->num]->per.dailishangjigouhao.c_str());
//logInfo("pid!=0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
}
else{
_snprintf(buf, sizeof(char)*1024*10*10+1, "%s%s%s[%s]",
person_map[elt->num]->flare.empty() ? "" : person_map[elt->num]->flare.c_str(),
person_map[elt->num]->flare.empty() ? "" : ".",
person_map[elt->num]->per.dailishangmingcheng.c_str(), person_map[elt->num]->per.dailishangjigouhao.c_str());
//logInfo("pid==0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
}
if ( person_map[elt->num]->leves_num > *level )
*level = person_map[elt->num]->leves_num;
control_level = GetPrivateProfileInt("echovap", "control_level", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if( person_map[elt->num]->leves_num <= control_level ){
person_map[elt->num]->flare = buf;
fprintf(fp, "%s\n", person_map[elt->num]->flare.c_str());
}
++recursion;
//logInfo("recursion 值为 %d",recursion);
echoflare(person_map[elt->num], fp, level);
}
free(buf);
buf = NULL;
// return num;
}
void echovapfile(pvap pv, FILE *fp, int *level){
int k = 0, pid;
pnode tmp, elt;
//char * buf = (char *)malloc(sizeof(char)*1024*10*10+1);
static int num = 0;
static pvap lpv = pv;
static unsigned long long recursion = 0;
int control_level = 0;
bool status = false;
LL_FOREACH_SAFE(pv->levels[k][0], elt, tmp){
pnode tmp2,elt2;
status = false;
//遍历上层链跟下层链是否匹配
LL_FOREACH_SAFE(pv->relationchain[k][0],elt2,tmp2){
if(elt->num == elt2->num){
status = true;
}
}
if(status){
//logInfo(" have infinite loop! id:%d. upchain:%d downchain:%d\n",pv->per.id,elt2->num,elt->num);
continue;
}
pid = person_map[elt->num]->pid;
if ( pid != 0 ){
if ( person_map[pid]->flare.empty() ){
/*_snprintf(buf, sizeof(char)*1024*10*10+1, "%s[%d].%s[%d]",
person_map[pid]->per.law_people_name.c_str(), pid,
person_map[elt->num]->per.law_people_name.c_str(), elt->num);*/
//logInfo("pid!=0情况下。flare是空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
else{
/*_snprintf(buf, sizeof(char)*1024*10*10+1, "%s.%s[%d]",
person_map[pid]->flare.c_str(),
person_map[elt->num]->per.law_people_name.c_str(), elt->num);*/
//logInfo("pid!=0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
person_map[elt->num]->leves_num = person_map[pid]->leves_num + 1;
}
}
else{
/*_snprintf(buf, sizeof(char)*1024*10*10+1, "%s%s%s[%d]",
person_map[elt->num]->flare.empty() ? "" : person_map[elt->num]->flare.c_str(),
person_map[elt->num]->flare.empty() ? "" : ".",
person_map[elt->num]->per.nickname.c_str(), elt->num);*/
//logInfo("pid==0情况下。flare不为空的情况下buf:%s. ID为%d的leves_num+1",buf,elt->num);
}
/* 此处代码可增加指定层级 */
/*if ( person_map[elt->num]->leves_num > *level )
*level = person_map[elt->num]->leves_num;*/
control_level = GetPrivateProfileInt("echovap", "control_level", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if( person_map[elt->num]->leves_num <= control_level ){
writeFilersInterval(person_map[elt->num], fp);
}
//++recursion;
//logInfo("recursion=%d. person_map[%d]->leves_num=%d",recursion,elt->num,*level);
echovapfile(person_map[elt->num], fp, level);
}
//free(buf);
//buf = NULL;
// return num;
}
void writeAllFiler(pvap pv, char *rootpath){
int n = 0, i = 0, j = 0, k = 0;
pnode tmp, elt;
int hvsize;
string strbuf;
char *rootdir = ROOT_DIR;
int level =0;
char *title_gb = "代理商机构号,推荐人,代理商名称,电话号码,姓名,注册时间";
char title[2048];
char buff[256];
if ( savepath != NULL )
rootdir = savepath;
_snprintf(buff, sizeof(buff), "%s\\所有层级下线人员信息.csv", rootpath, pv->user_id);
FILE *fp = fopen(buff, "w+b");
if ( fp == NULL )
{
logInfo("%s fopen %s error", __FUNCTION__, buff);
return;
}
fprintf(fp, "%s\n", gb_to_utf8(title_gb, title, sizeof(title)));
fprintf(fp, "\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\",\"\t%s\t\"\n",
pv->per.dailishangjigouhao.c_str() , pv->per.tuijianren.c_str(), pv->per.dailishangmingcheng.c_str(),pv->per.phone.c_str(),pv->per.name.c_str(),pv->per.registertime.c_str());
echovapfile(pv, fp, &level);
//fprintf(fp, "\nlnum: %d, num:%d", level, pv->nums);
fclose(fp);
}
void writeFile(pvap pv, char *rootpath)
{
int n = 0, i = 0, j = 0, k = 0;
pnode tmp, elt;
int hvsize;
string strbuf;
char *rootdir = ROOT_DIR;
int level =0;
char buff[256];
if ( savepath != NULL )
rootdir = savepath;
_snprintf(buff, sizeof(buff), "%s\\%d.txt",
rootpath, pv->user_id);
FILE *fp = fopen(buff, "w+b");
if ( fp == NULL ){
logInfo("%s fopen %s error", __FUNCTION__, buff);
return;
}
echovap(pv, fp, &level);
//fprintf(fp, "\nlnum: %d, num:%d", level, pv->nums);
fclose(fp);
}
void writeFlare2(pvap pv, char *rootpath){
int n = 0, i = 0, j = 0, k = 0;
pnode tmp, elt;
int hvsize;
string strbuf;
char *rootdir = ROOT_DIR;
int level =0;
char buff[256];
if ( savepath != NULL )
rootdir = savepath;
_snprintf(buff, sizeof(buff), "%s\\%d.csv", rootpath, pv->user_id);
FILE *fp = fopen(buff, "w+b");
if ( fp == NULL ){
logInfo("%s fopen %s error", __FUNCTION__, buff);
return;
}
fprintf(fp, "%s\n", "id,value");
fprintf(fp, "%s[%s],\n", pv->per.dailishangmingcheng.c_str(), pv->per.dailishangjigouhao.c_str());
pv->flare="";
echoflare(pv, fp, &level);
//fprintf(fp, "\nlnum: %d, num:%d", level, pv->nums);
fclose(fp);
}
void WriteFile0(int userid,pvap pv){
char *rootdir = ROOT_DIR;
unsigned int choiceid;
char rootpath[256];
choiceid = GetPrivateProfileInt("WriteFile0", "choiceid", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if ( userid == choiceid ){
_snprintf(rootpath, sizeof(rootpath), "%s\\%d",
rootdir, userid);
if ( !pathExist(rootpath) )
mkpath(rootpath);
//writeFile(pv, rootpath);
writeAllFiler(pv, rootpath);
writeFlare2(pv, rootpath);//输出层级图
}
}
void WriteFile1(int userid,pvap pv){
char *rootdir = ROOT_DIR;
unsigned int Minid = 0,Maxid = 0;
char rootpath[256];
Minid = GetPrivateProfileInt("WriteFile1", "Minid", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
Maxid = GetPrivateProfileInt("WriteFile1", "Maxid", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if ( userid <= Maxid && userid >= Minid ){
_snprintf(rootpath, sizeof(rootpath), "%s\\%d",
rootdir, userid);
if ( !pathExist(rootpath) )
mkpath(rootpath);
logInfo("writeFile begin....\n");
//writeFile(pv, rootpath);
writeAllFiler(pv, rootpath);
writeFlare2(pv, rootpath);//输出层级图
}
}
void WriteFile2(int userid,pvap pv){
char *rootdir = ROOT_DIR;
char rootpath[256];
int all = GetPrivateProfileInt("WriteFile2", "all", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if (all){
_snprintf(rootpath, sizeof(rootpath), "%s\\%d", rootdir, userid);
if ( !pathExist(rootpath) )
mkpath(rootpath);
//writeFile(pv, rootpath);
writeAllFiler(pv, rootpath);
writeFlare2(pv, rootpath);//输出层级图
}
}
void save_deadline(){
//输出死循环的人信息
char buf[256],buff[128];
pvap pverror;
_snprintf(buf, sizeof(buff), "e:\\HierarchicalData\\deadline.csv");
FILE *fp1 = fopen(buf, "w+b");
if ( fp1 == NULL ){
logInfo("%s fopen %s error", __FUNCTION__, buff);
return;
}
char title[100];
char *title_gb = "id,上层链死循环id,下层链死循环id";
char title2[100];
char *title_gb2 = "死循环人数总共:";
int errornumber=0;
fprintf(fp1, "%s\n", gb_to_utf8(title_gb, title, sizeof(title)));
for (pm_iter iterl = person_map.begin(); iterl != person_map.end(); ++iterl)
{
if ( iterl->second->user_id == 0 )
continue;
pverror = iterl->second;
if(pverror->is_infiniteloop){
errornumber++;
fprintf(fp1,"%d,%d,%d \n",pverror->per.id,pverror->upperchain_deadid,pverror->lowerchain_deadid);
}
}
fprintf(fp1,"%s %d\n",gb_to_utf8(title_gb2, title2, sizeof(title2)),errornumber);
fclose(fp1);
fp1=NULL;
}
void save_result()
{
logInfo("%s begin save data to files", __FUNCTION__);
int n = 0, i = 0, j = 0, k = 0;
int hvsize, count = 0;
pvap pv;
char *rootdir = ROOT_DIR, rootpath[256];
int ChoiceFunction ;
void (*func[3])(int , pvap) = {WriteFile0,WriteFile1,WriteFile2};
ChoiceFunction = GetPrivateProfileInt("SavefileMode(0-2)", "ChoiceFunction", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if ( savepath != NULL )
rootdir = savepath;
if ( !pathExist(rootdir) )
CreateDirectory(rootdir, NULL);
for ( pm_iter iter = person_map.begin(); iter != person_map.end(); ++iter )
{
if ( iter->second->user_id == 0 )
continue;
//if ( iter->second->user_id < 400584 )
// continue;
pv = iter->second;
(*func[ChoiceFunction])(iter->second->user_id,pv);
//if ( iter->second->user_id != 272 )
// continue;
//pv = iter->second;
//_snprintf(rootpath, sizeof(rootpath), "%s\\%d",
// rootdir, pv->user_id);
//if ( !pathExist(rootpath) )
// mkpath(rootpath);
//writeFile(pv, rootpath);
++n;
}
save_deadline();
logInfo("%s total save %d file.", __FUNCTION__, n);
}
// Global variable
CRITICAL_SECTION criticalSection;
CRITICAL_SECTION criticalSection_personmap;
//up传进来是自己人
void insert_level(int vuser_id, person &up){
int i = 0, k = 0, hv1;
vap *va;//va是外面人
pnode no;
long long pid;
va = person_map[vuser_id];
va->user_id = vuser_id;
pid = va->pid = up.refered_id;
//va指向父容器
va = person_map[up.refered_id];
if ( va->user_id == 0 )
va->user_id = up.refered_id;
hv1 = 0; //vuser_id % ((va->is_important) ? LEVELS_HASHSZ_MAX : LEVELS_HASHSZ);
//logInfo("进入查找链表阶段........\n");
no = findNode(va->levels[k][hv1], vuser_id);
if ( no == NULL )
{
no = new node;
no->num = vuser_id;
LL_APPEND_VS2008(va->levels[k][hv1], no); //
//logInfo("hv1 = %d\n",hv1);
//if(vuser_id == 400584)
// logInfo("不在链表中,把子:%d 添加到链表父链表:%d",vuser_id,va->user_id);
// 保存下层用户数
//va->nums++;
// 保存最大层级数
//if ( k > va->leves_num )
// va->leves_num = k;
}
/* 此处为调试信息 需要时可加上 */
/*else{
logInfo("存在链表中,子:%d 父链表:%d",vuser_id,va->user_id);
}*/
return;
}
void init_vap(){
int i, j = 0;
vap *va;
unsigned int msz, sz = 0;
logInfo("%u init vap", time(NULL));
MAX_USERID = GetPrivateProfileInt("INIT_VAP", "max_userid", 0, "e:\\HierarchicalData\\IniFileInformation.ini");
if (!MAX_USERID)
perror("GetPrivateProfileInt");
person_map.insert(make_pair(0, new_vap(0)));
for ( i = 0; i < MAX_USERID; i++ )
{
person_map.insert(make_pair(i, new_vap(i)));
if ( ++j % 50000 == 0 )
logInfo("%s %d vap", __FUNCTION__, j);
}
}
void insert_relationchain(unsigned long vuser_id, person &up){
int i = 0, k = 0, hv1=0;
vap *va;//va是外容器
vap *vapid;
pnode no1,no2;
unsigned long long pid;
//va指向了传进来的容器
va = person_map[vuser_id];
if ( person_map[vuser_id]->per.refered_id == 0 ){
//va->user_id = up.agentid;
no1 = new node;
no1->num = vuser_id;
LL_APPEND_VS2008(va->relationchain[k][hv1], no1);
//logInfo("when pid = 0 pid=%d userid= %d", person_map[vuser_id]->per.inviter,person_map[vuser_id]->per.id);
}
else{
unsigned long long tmp = va->per.refered_id;
while (tmp != 0)//结束递归上层链第一条件,父节点等于0
{
vapid = person_map[tmp];
no2 = findNode(va->relationchain[k][hv1], vapid->per.id);
if(NULL == no2){
no2 = new node;
no2->num = vapid->per.id;
LL_PREPEND(va->relationchain[k][hv1], no2);
//遍历上层级,计算出自身所在层级
va->levesnum++;
//logInfo("when pid !=0. id = %d add = %d",va->per.id,no2->num);
}else{
logInfo("Display series of numbers (id=%d : deadid=%d) in an infinite loop.",va->per.id,vapid->per.id);
//标记死循环的变量
va->upperchain_deadid = vapid->per.id;//上层循环死链标记
va->is_infiniteloop = true;
break;//结束递归第二条件,死循环
}
tmp = person_map[tmp]->per.refered_id;
}
}
return;
}
int readdb(){
char query_sql[1024] = {};
char table[100]={};
//const char *query = "select id, inviter from xx_member_sans_bankaccount1 order by id asc";
MYSQL_RES * result;
MYSQL_ROW row;
person per;
unsigned int count = 0;
if(!GetPrivateProfileString("query_userinfo", "table", "", table, sizeof(table), "e:\\HierarchicalData\\IniFileInformation.ini"))
perror("GetPrivateProfileString");
_snprintf(query_sql, sizeof(query_sql),"select id, refered_id from %s order by id asc", table);//57
logInfo("%s query:%s", __FUNCTION__, query_sql);
if ( mysql_query(conn, query_sql) != 0 ){
logInfo("query failed!%s", query_sql);
return 1;
}
else{
if ( (result = mysql_store_result(conn)) == NULL ){
logInfo("save result set error!%s", query_sql);
return 1;
}
else{
logInfo("%u store result succeed, begin fetch data", time(NULL));
//读取结果集中的数据,返回的是下一行。因为保存结果集时,当前的游标在第一行【之前】
while ( (row = mysql_fetch_row(result)) != NULL ) {
if ( row[1] == NULL )
continue;
per.id = atoi(row[0]);
per.refered_id = atoi(row[1]);
insert_level(per.id, per);
}
}
}
mysql_free_result(result);
//pnode tmp, elt;
//LL_FOREACH_SAFE(person_map[0]->levels[0][0], elt, tmp){
// logInfo("%d\n",elt->num);
//}
//save_result();
return 1;
}
void readdb2(){
//改过HierarchicalData的字段ID和匹配reference
//const char *query = "select id, inviter from xx_member_sans_bankaccount1 order by id asc"; //查询语句1
char query_sql[1024] = {};
char table[100]={};
MYSQL_RES * result; //保存结果集的
MYSQL_ROW row; //代表的是结果集中的一行
person per;
unsigned int count = 0;
if(!GetPrivateProfileString("query_userinfo", "table", "", table, sizeof(table), "e:\\HierarchicalData\\IniFileInformation.ini"))
perror("GetPrivateProfileString");
_snprintf(query_sql, sizeof(query_sql),"select id, refered_id from %s order by id asc", table);
logInfo("%s query_sql:%s", __FUNCTION__, query_sql);
if ( mysql_query(conn, query_sql) != 0 ){
logInfo("query failed!%s", query_sql);
return ;
}
else{
if ( (result = mysql_store_result(conn)) == NULL ){
logInfo("save result set error!%s", query_sql);
return ;
}
else{
logInfo("%u store result succeed, begin fetch data", time(NULL));
//读取结果集中的数据,返回的是下一行。因为保存结果集时,当前的游标在第一行【之前】
while ( (row = mysql_fetch_row(result)) != NULL ) {
if ( row[1] == NULL )
continue;
per.id = atoi(row[0]);
per.refered_id = atoi(row[1]);
//person_map[per.userid]->per.userid = per.userid;
//person_map[per.agentid]->per.agentid = per.agentid;
//logInfo("userid = %d agentid = %d",person_map[per.userid]->per.userid,person_map[per.agentid]->per.agentid);
//insert_level(per.userid, per);
insert_relationchain(per.id, per);
}
}
}
logInfo("%s Done.\n",__FUNCTION__);
mysql_free_result(result); //释放结果集
return ;
}
void entry(int argc, char* argv[]){
int i;
logInfo("version: 0.1, compile time: %s %s",__DATE__, __TIME__);
logInfo("%s host:%s, savepath:%s, saveall:%d", __FUNCTION__, host, savepath, saveall);
if ( conndb() == -1 )
return;
InitializeCriticalSection(&criticalSection);
InitializeCriticalSection(&criticalSection_personmap);
init_vap();
DWORD dwThreadId, dwlevThreadId[20];
HANDLE hlevThread[20], hThread;
hThread = CreateThread( NULL,0,query_userinfo_thread,NULL,0,&dwThreadId);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
int result = readdb();
readdb2();
if(result >= 0){
save_result();
}
}
int _tmain(int argc, char* argv[], char* envp[]){
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)){
_tprintf(_T("错误: MFC 初始化失败"));
nRetCode = 1;
}
else{
//WriteTdxNet();
ReadTdxNet();
entry(argc, argv);
}
return nRetCode;
}