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);


}

  

posted @ 2017-07-10 10:47  never_comparison  阅读(125)  评论(0编辑  收藏  举报