LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 635|回复: 4

一个函数的代码片段

[复制链接]
发表于 2010-4-22 21:28:53 | 显示全部楼层 |阅读模式
/* 根据XDataDesc生成DB信息及Ident */
UINT32  SetDescToDBMAP(XDataDesc* lpDesc, XDataDesc* lpPrimayKey ,DESC_TO_DB_MAP *pstDescToDbMap)
{
    UINT32 i, j, nCount, nSplit, nNum, nFld;

    XDataDesc* lpTemp;
    XTabDesc*  lpTabDesc;
   
    XDataDesc* lpCopyPk;

    /* 校验参数是否正确 */
    if ((NULL == lpDesc)||
        (NULL == lpPrimayKey)||
        (NULL == pstDescToDbMap)||
        (NULL == pstDescToDbMap->pfTabToDb)||
        (NULL == pstDescToDbMap->pfDescToMapId)||
        (NULL == pstDescToDbMap->pfDescToTabName)||
        (NULL == pstDescToDbMap->pfDescToFldName)||
        (NULL == pstDescToDbMap->pfDescToPkFldName)||
        (NULL == pstDescToDbMap->pfGetTabSplitUnit))
    {
        return 0xFFFFFFFF;
    }

    /* 优先进行递归调用自定义生成DBMAP的函数,同时统计XDataDesc中非自定义格式的个数 */
    i = 0;
    lpTemp = lpDesc;
    while(NULL != lpTemp)
    {
        lpTemp = lpTemp->lpNext;
        if ((lpTemp->nType >= DATA_TYPE_BUTT)||
                (NULL == x_stDescMap[lpTemp->nType].pfDescToDbMap))
        {
            i++;
        }
        else
        {
            if (lpTemp->nType < DATA_TYPE_BUTT)
            {
                nCount = (*(x_stDescMap[lpTemp->nType].pfDescToDbMap))(lpTemp, lpPrimayKey, pstDescToDbMap);
                if (0!= nCount)
                {
                    return nCount;
                }
            }
        }
    }

    /* 获取对表进行分割的单位 */
    nSplit = (*(pstDescToDbMap->pfGetTabSplitUnit))(pstDescToDbMap->lpGetTabSplitUnit);

    /* 获取表的主键个数 */
    nCount = 0;
    lpTemp = lpPrimayKey;
    while(NULL != lpTemp)
    {
        lpTemp = lpTemp->lpNext;
        nCount++;
    }

    /* 主键个数不能大于表分割的最小单位,大于就无法分割了 */
    if (nCount >= nSplit)
    {
        return 0xFFFFFFFF;
    }

    /* 至少一个字段数 */
    if (nCount + i == 0)  /* 大于某个数值,也可以设置为非法 */
    {
        return 0xFFFFFFFF;
    }

    /* 计算需要分割成几张表,允许全是主键 */
    nNum = (i / (nSplit - nCount)) + 1;
    /* 对于余数为0的情况,需要减一 */
    if (( 0 != i )&&( 0 == (i % (nSplit - nCount)) ))
    {
        nNum --;
    }
 楼主| 发表于 2010-4-22 21:29:33 | 显示全部楼层
/* 拷贝主键 */
    lpCopyPk = MallocDataDesc();
    if (NULL == lpCopyPk)
    {
        return 0xFFFFFFFF;
    }        
    if (0 != CopyDataDesc(lpPrimayKey, lpCopyPk))
    {
        return 0xFFFFFFFF;
    }
    /* 生成主键的字段名,因为主键只需要生成一次即可 */
    lpTemp = lpCopyPk;
    while(NULL != lpTemp)
    {
        /* 如果主键的名字为空 */
        if ('\0' == lpTemp->lpFldName[0])
        {
            /* 不需要管字段名偏移从哪里开始,依次生成即可 */
            if (0 != (*(pstDescToDbMap->pfDescToPkFldName))(pstDescToDbMap->lpGenPkFldName, i, lpTemp->lpFldName))
            {
                return 0xFFFFFFFF;
            }

            i ++;
        }

        /* 如果ID不为NULL_DWORD,则也需要分配一个 */
        if (0xFFFFFFFF == lpTemp->nIdent)
        {
            if (0 != (*(pstDescToDbMap->pfDescToMapId))(pstDescToDbMap->lpFldToMap, lpTemp, &(lpTemp->nIdent)))
            {
            }
        }

        lpTemp = lpTemp->lpNext;
    }

    /* 分配表名及相应字段空间 */
    lpTemp = lpDesc;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-22 21:30:20 | 显示全部楼层
for(i = 0; i < nNum; i++)
    {
        /* 计算当前表的字段个数 */
        if ((nNum == i + 1)&&( 0 != (i % (nSplit - nCount)) ))
        {
            nFld = i % (nSplit - nCount);
        }
        else
        {
            nFld = nSplit;
        }
        
        /* 分配字段 */
        lpTabDesc = _AllocTabDesc(nFld);

        /* 如果只有一张表,则支持默认表名 */
        if ((1 == nNum)&&('\0' != lpDesc->lpTabName))
        {
            lstrcpyn(lpTabDesc->x_lpTabName, lpDesc->lpTabName, XDATADESC_NAMELEN);
        }
        /* 否则必须要求生成表名 */
        else
        {
            if (0 != (*(pstDescToDbMap->pfDescToTabName))(pstDescToDbMap->lpGenTabName, lpTabDesc->x_lpTabName))
            {
                return 0xFFFFFFFF;
            }
        }

        /* 再生成各个字段名 */
        j = 0;
        while(NULL != lpTemp && j < nFld)
        {
            /* 如果主键的名字为空 */
            if ('\0' == lpTemp->lpFldName[0])
            {
                /* 不需要管字段名偏移从哪里开始,依次生成即可 */
                if (0 != (*(pstDescToDbMap->pfDescToFldName))(pstDescToDbMap->lpGenFldName, j, lpTemp->lpFldName))
                {
                    return 0xFFFFFFFF;
                }
        
                j++;
            }
        
            /* 如果ID不为NULL_DWORD,则也需要分配一个 */
            if (0xFFFFFFFF == lpTemp->nIdent)
            {
                if (0 != (*(pstDescToDbMap->pfDescToMapId))(pstDescToDbMap->lpFldToMap, lpTemp, &(lpTemp->nIdent)))
                {
                }
            }

            /* 复制一下表名 */
            lstrcpyn(lpTemp->lpTabName, lpTabDesc->x_lpTabName, XDATADESC_NAMELEN);
        
            lpTemp = lpTemp->lpNext;
        }

        /* 将主键的表名处理一下 */

        /* 调用设置接口设置到DBMAP中去 */
    }

    return 0;
}
回复 支持 反对

使用道具 举报

发表于 2010-4-23 00:32:22 | 显示全部楼层
windows only的程序吧。
回复 支持 反对

使用道具 举报

发表于 2010-4-23 04:33:40 | 显示全部楼层
匈牙利命名法就是脱了裤子放屁,你不加lp难道别人就不知道那是个指针了?

要说程序员不知道,VS 2005以上版本的代码定义窗口,sourceinsight的Context Window是干什么用的?光标放上去就显示定义部分的源码出来了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表