sqlite网盘数据解析
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <dirent.h> #include <unistd.h> #include <iconv.h> #include <mysql/mysql.h> #include "sqlite3.h" void getDiskFile(MYSQL *con, char *rtdir,char* fname,long id); int creatfile(char *path) { int fd; if((fd=open(path,O_CREAT|O_RDWR))== -1) { perror("open fail"); return 0; } close(fd); return 1; } int CreateDir(const char *sPathName) { char DirName[256]; strcpy(DirName, sPathName); int i,len = strlen(DirName); if(DirName[len-1]!='/') strcat(DirName, "/"); len = strlen(DirName); for(i=1; i<len; i++) { if(DirName[i]=='/') { DirName[i] = 0; if(access(DirName, NULL)!=0 ) { if(mkdir(DirName, 0755)==-1) { perror("mkdir error"); return -1; } } DirName[i] = '/'; } } return 0; } // make the directory // rootpath is the root directory you want to generate the directory // dbName is the database name ,parent means parent id // rtdir is the sourcedir void makedir(char *rootpath,char *dbName,int parent, char *rtdir,MYSQL *con) { sqlite3 *db; sqlite3_stmt * stmt = NULL; const char *zTail; char SQL[256]; printf("dbname==%s\n",dbName); sprintf(SQL,"SELECT id,name,filenum FROM folder where parent=%d;",parent); printf("SELECT id,name,filenum FROM folder where parent=%d\n;",parent); int r =sqlite3_open(dbName,&db); if (sqlite3_prepare_v2(db, SQL, -1, &stmt, &zTail) ==SQLITE_OK) { while( sqlite3_step(stmt) ==SQLITE_ROW ) { int id =sqlite3_column_int( stmt, 0); const unsigned char *foldername = sqlite3_column_text(stmt,1); int filenum = sqlite3_column_int(stmt,2); printf("ID = %d\n,name=%s\n,filenumber=%d\n",id,foldername,filenum); char sql[256]; if(filenum>0) { sqlite3_stmt *filestmt =NULL; char sql[256]; sprintf(sql,"SELECT name,attid FROM file where folder = %d;",id); if (sqlite3_prepare_v2(db, sql, -1, &filestmt, &zTail) ==SQLITE_OK) { while( sqlite3_step(filestmt) ==SQLITE_ROW ) { const unsigned char *name= sqlite3_column_text(filestmt,0); long attid = sqlite3_column_int(filestmt,1); printf("filename = %s\n",name); char path[1024]; //creatfile if(rootpath) sprintf(path,"%s/%s",rootpath,foldername); else sprintf(path,"%s",foldername); CreateDir(path); char tempfile[1024]; sprintf(tempfile,"%s/%s",path,name); creatfile(tempfile); //write data into file getDiskFile(con,rtdir,tempfile,attid); } } sqlite3_finalize(filestmt); }else { //creat son folders char path[1024]; if(rootpath) sprintf(path,"%s/%s",rootpath,foldername); else sprintf(path,"%s",foldername); printf("folderpath = %s\n",path); CreateDir(path); //creatdir } char path[1024]; if(rootpath) sprintf(path,"%s/%s",rootpath,foldername); else sprintf(path,"%s",foldername); printf("recursion path = %s\n",path ); makedir(path,dbName,id,rtdir,con); printf("creat parent = %s\n",path); } } sqlite3_finalize(stmt); sqlite3_close(db); return; } /* get netdisk files */ void getDiskFile( MYSQL *con, char *rtdir,char* fname,long id) { char buf[500]; sprintf(buf, "select boxid, apos, filelen from attlist where id = %d", id); if (mysql_query(con, buf ) != 0) { printf("db query failed: %s\n", buf); exit(1); } MYSQL_RES* att_res = mysql_store_result(con); if(att_res == NULL) { printf("store result failed\n"); exit(1); } MYSQL_ROW att_row = mysql_fetch_row(att_res); if(att_row) { /* get box file through boxid */ sprintf(buf, "select boxfile from mail_boxs where id = %s", att_row[0]); if (mysql_query(con, buf ) != 0) { printf("db query failed: %s\n", buf); exit(1); } MYSQL_RES* box_res = mysql_store_result(con); if(box_res == NULL) { printf("store result failed\n"); exit(1); } MYSQL_ROW box_row = mysql_fetch_row(box_res); if(box_row) { sprintf(buf, "%s/%s", rtdir, box_row[0]); int bfd = open(buf, O_RDONLY); if(bfd != -1) { int dfd = creat(fname, 0766); if(dfd != -1) { /* read data from box file */ lseek(bfd, atoi(att_row[1]), SEEK_SET); int len = atoi(att_row[2]); char *dskdata =(char*)malloc(len+1); if(!dskdata) { printf("malloc failed\n"); exit(1); } int num, off; off = 0; while(len > 0) { num = read(bfd, dskdata+off, len); if(num < 0) { printf("read netdisk data failed\n"); exit(1); } len -= num; off += num; } /* write data to netdisk file */ len = atoi(att_row[2]); off = 0; while(len > 0) { num = write(dfd, dskdata+off, len); if(num < 0) { printf("write netdisk failed\n"); exit(1); } len -= num; off += num; } free(dskdata); close(dfd); } close(bfd); } } mysql_free_result(box_res); } mysql_free_result(att_res); } int main(int argc, char **argv) { if(argc < 7) { printf("usage: %s srcdir dstdir dbuser dbpass dbname ldapfile\n", argv[0]); exit(1); } int fd = open(argv[6], O_RDONLY); if(fd == -1) { printf("cannot open %s\n",argv[6]); return 1; } int len = lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); char *ldapdata; if((ldapdata =(char*)malloc(len + 1)) == NULL) { printf("malloc failed\n"); exit(1); } int off = 0, num = 0; while(off < len) { num = read(fd, ldapdata+off, len-off); if(num < 0) { printf("read %s failed\n", argv[6]); exit(1); } off += num; } *(ldapdata+len) = 0; close(fd); MYSQL* con = mysql_init(NULL); if (con == NULL) { printf("init mysql failed\n"); exit(1); } if (mysql_real_connect(con, "127.0.0.1", argv[3], argv[4], argv[5], 3306, NULL, 0) == NULL) { printf("connect to db failed\n"); exit(1); } char diskdir[300]; sprintf(diskdir, "%s/mail/userindex", argv[1]); /* open data directoty */ DIR *dirp = opendir(diskdir); if(!dirp) { printf("cannot access %s\n", diskdir); exit(1); } struct dirent *dent; /* get domain info */ while((dent = readdir(dirp))) { if(dent->d_type != DT_DIR || *dent->d_name == '.' || (strcmp(dent->d_name, "chinamil.com.cn") && strcmp(dent->d_name, "plapic.com.cn"))) continue; char dmname[1024]; sprintf(dmname, "%s/%s", diskdir, dent->d_name); DIR *dmnp = opendir(dmname); if(!dmnp) { printf("cannot access %s\n", dmname); exit(1); } struct dirent *orgdent; /* get org names */ while((orgdent = readdir(dmnp))) { if(orgdent->d_type != DT_DIR || *orgdent->d_name == '.') continue; char orgname[1024]; sprintf(orgname, "%s/%s", dmname, orgdent->d_name); DIR *orgp = opendir(orgname); if(!orgp) { printf("cannot access %s\n", orgname); exit(1); } struct dirent *userdent; /* get user accounts */ while((userdent = readdir(orgp))) { if(userdent->d_type != DT_DIR || *userdent->d_name == '.') continue; char destname[1024]; char diskname[1024]; char cmdstr[1024]; char storeid[300]; char account[300]; char *pt, *qt; sprintf(storeid, "dn: storeid=%s,", userdent->d_name); pt = strstr(ldapdata, storeid); if(!pt) { printf("the user id %s isn't found\n", userdent->d_name); continue; } pt = strstr(pt, "mail:"); if(!pt) { printf("mail address isn't found\n"); exit(1); } pt += strlen("mail:"); while(*pt == ' ') pt++; qt = pt; while(*qt != '\r' && *qt != '\n') qt++; memcpy(account, pt, qt-pt); account[qt-pt] = 0; sprintf(destname, "%s/%s", argv[2], account); sprintf(diskname, "%s/%s/netdisk.db", orgname, userdent->d_name); if(access(diskname, F_OK) == -1) continue; makedir(destname, diskname,0,argv[1],con); } closedir(orgp); } closedir(dmnp); } closedir(dirp); free(ldapdata); }