NTree N叉树金字塔结构遍历以提取下线(1)

// 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值