VIEWDLL.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. VIEWC.DLL - This Module creates Views based on the current Group Map in
  3. SMS
  4. Copyright (c), 1994 by Microsoft Corp.
  5. Modified: 7/11/95 a-cvadai  Added error message messageboxes.
  6.           9/13/95 a-cvadai  Changed outer- to inner-joins on all views
  7. *************************************************************************/
  8. #define DBNTWIN32               // must identify operating system environment
  9. #include "windows.h"
  10. #include <sqlfront.h>
  11. #include <sqldb.h>         // DB-LIB header file (should always be included)
  12. #include <stdio.h>
  13. #include "smsview.h"
  14. #include "viewdlls.h"
  15. int RetCode, CmdComplete;
  16. void ErrorMsg(int ,int);
  17. int GenViews(dbproc,dbprocView,CreateGroupName,DropOnlyFlag,CommandLine)
  18. DBPROCESS *dbproc;
  19. DBPROCESS *dbprocView;
  20. char *CreateGroupName;
  21. int DropOnlyFlag;
  22. int CommandLine;
  23. {
  24.   RETCODE result_code;
  25.   struct VIEWDEF TableDef[MAX_COLUMNS];
  26.   char szTmpText[500];
  27.   char szText[500];
  28.   char szMsgTitle[32];
  29.   // Variables to bind to Group Map select
  30.   char  ViewName[MAX_COLUMN_NAME],
  31.         ArchitectureName[MAX_COLUMN_NAME],
  32.         GroupName[MAX_COLUMN_NAME],
  33.         AttributeName[MAX_COLUMN_NAME],
  34.         ColumnName[MAX_COLUMN_NAME] ,
  35.         CommonTableName[MAX_COLUMN_NAME],
  36.         SpecificTableName[MAX_COLUMN_NAME];
  37.    // Variables to keep Current View Details
  38.    char CurCommonTableName[MAX_COLUMN_NAME],
  39.         CurArchitectureName[MAX_COLUMN_NAME],
  40.         CurSpecificTableName[MAX_COLUMN_NAME];
  41.   int CurKey = 0,
  42.       CurArchitectureKey,
  43.       i= 0, LastMode,
  44.       ViewSuffix = 0;
  45.   int GroupKey,
  46.       ArchitectureKey,
  47.       Mode, 
  48.       CommonSpecificFlag;
  49.       RetCode = SUCCEED;
  50.       CmdComplete=CommandLine;
  51.      dberrhandle((void *)err_handler);
  52.      dbmsghandle((void *)err_handler);
  53.     // Set up a View that we can use to get all the Group Info
  54.     dbcmd (dbproc , (char *) "SELECT AttributeMap.GroupKey,");
  55.     dbcmd (dbproc , (char *) " ArchitectureMap.ArchitectureName, ");
  56.     dbcmd (dbproc , (char *) " GroupMap.ArchitectureKey , ");
  57.     dbcmd (dbproc , (char *) " GroupMap.GroupName,");
  58.     dbcmd (dbproc , (char *) " AttributeMap.AttributeName,");
  59.     dbcmd (dbproc , (char *) " AttributeMap.ColumnName,");
  60.     dbcmd (dbproc , (char *) " AttributeMap.CommonSpecificFlag,");
  61.     dbcmd (dbproc , (char *) " GroupMap.CommonTableName, ");
  62.     dbcmd (dbproc , (char *) " GroupMap.SpecificTableName, ");
  63.     dbcmd (dbproc , (char *) " ArchitectureMap.Mode ");
  64.     dbcmd (dbproc , (char *) " FROM ArchitectureMap ArchitectureMap,");
  65.     dbcmd (dbproc , (char *) " AttributeMap AttributeMap,");
  66.     dbcmd (dbproc , (char *) " GroupMap GroupMap     ");
  67.     dbcmd (dbproc , (char *) " WHERE GroupMap.ArchitectureKey = "
  68.                              "AttributeMap.ArchitectureKey AND ");
  69.     dbcmd (dbproc , (char *) " AttributeMap.ArchitectureKey = "
  70.                              "ArchitectureMap.ArchitectureKey AND ");
  71.     dbcmd (dbproc , (char *) " AttributeMap.GroupKey = GroupMap.GroupKey");
  72.     // Check if only specific group's selected
  73.     if (strlen(CreateGroupName) != 0) {
  74.         dbcmd (dbproc , (char *) " AND GroupMap.GroupName ='");
  75.         dbcmd (dbproc , (char *) CreateGroupName );
  76.         dbcmd (dbproc,  (char *) "'");
  77.     }
  78.     dbcmd (dbproc , (char *) " ORDER BY ");
  79.     dbcmd (dbproc , (char *) " ArchitectureMap.ArchitectureKey ,");
  80.     dbcmd (dbproc , (char *) " AttributeMap.GroupKey");
  81.     dbsqlexec (dbproc);
  82.     // now check the results from the SQL server
  83.     while ((result_code = dbresults(dbproc)) != NO_MORE_RESULTS) {
  84.         if (result_code == SUCCEED) {
  85.             dbbind(dbproc, 1, INTBIND, (DBINT) MAX_COLUMN_NAME,
  86.                   (char *)&GroupKey);
  87.             dbbind(dbproc, 2, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  88.                    (char *)ArchitectureName);
  89.             dbbind(dbproc, 3, INTBIND, (DBINT) MAX_COLUMN_NAME,
  90.                    (char *)&ArchitectureKey);
  91.             dbbind(dbproc, 4, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  92.                   (char *)GroupName);
  93.             dbbind(dbproc, 5, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  94.                    (char *)AttributeName);
  95.             dbbind(dbproc, 6, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  96.                    (char *)ColumnName);
  97.             dbbind(dbproc, 7, INTBIND, (DBINT) MAX_COLUMN_NAME,
  98.                    (char *)&CommonSpecificFlag);
  99.             dbbind(dbproc, 8, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  100.                    (char *)CommonTableName);
  101.             dbbind(dbproc, 9, NTBSTRINGBIND, (DBINT) MAX_COLUMN_NAME,
  102.                    (char *)SpecificTableName);
  103.             dbbind(dbproc, 10, INTBIND, (DBINT) MAX_COLUMN_NAME,
  104.                   (char *)&Mode);
  105.             // Loop through all the groups Breaking when a Arctecture , Group Changes
  106.             CurKey = -1;
  107.             i = 0;
  108.             ViewSuffix = 0;
  109.             while (dbnextrow(dbproc) != NO_MORE_ROWS ) {
  110.                 if ( ((CurKey != GroupKey || CurArchitectureKey != ArchitectureKey) && CurKey != -1)
  111.                      || (i == MAX_COLUMNS) ) {
  112.                     if (CreateV(ViewName, &TableDef[0],dbprocView,i,
  113.                             CurArchitectureKey, CurKey, CurCommonTableName,
  114.                             CurSpecificTableName, ViewSuffix,
  115.                             CurArchitectureName, DropOnlyFlag, LastMode) == FAIL) {
  116.                         LoadString(hInst, IDS_ERR_BADGROUP, szTmpText, 500);
  117.                         LoadString(hInst, IDS_MSC_DBERROR, szMsgTitle, 32);
  118.                         sprintf(szText, (const char *)szTmpText, ViewName);
  119.                         MessageBox(NULL, szText, szMsgTitle, MB_ICONSTOP);
  120.                     }
  121.                     if ( i == MAX_COLUMNS && CurKey == GroupKey)
  122.                         ViewSuffix++;
  123.                     else
  124.                         ViewSuffix = 0;
  125.                     i = 0;
  126.                 }      // End if
  127.                 strcpy(ViewName, GroupName);
  128.                 strcpy(TableDef[i].ColName,ColumnName);
  129.                 TableDef[i].ComSpec = CommonSpecificFlag;
  130.                 CurArchitectureKey = ArchitectureKey;
  131.                 CurKey = GroupKey;
  132.                 strcpy(CurCommonTableName,CommonTableName);
  133.                 strcpy(CurSpecificTableName,SpecificTableName);
  134.                 strcpy(CurArchitectureName,ArchitectureName);
  135.                 LastMode = Mode;
  136.                 i++;
  137.             }
  138.             // Make sure we Create a view for the last group
  139.             if (CreateV(ViewName,TableDef,dbprocView,i,CurArchitectureKey,
  140.                     CurKey, CurCommonTableName, CurSpecificTableName,
  141.                     ViewSuffix, CurArchitectureName, DropOnlyFlag, LastMode) == FAIL) {
  142.                 
  143.                     LoadString(hInst, IDS_ERR_BADGROUP, szTmpText, 500);
  144.                     LoadString(hInst, IDS_MSC_DBERROR, szMsgTitle, 32);
  145.                     sprintf(szText, (const char *)szTmpText, ViewName);
  146.                     MessageBox(NULL, szText, szMsgTitle, MB_ICONSTOP);
  147.             }
  148.             DropView(dbproc,"SNMP_Varbinds");
  149.             DropView(dbproc,"GroupNames");
  150.             if (!DropOnlyFlag) {
  151.                 CreateSNMPVarbindsView(dbprocView);
  152.                 CreateGroupView(dbprocView);
  153.             }
  154.         }
  155.         else {
  156.             return(FAIL);
  157.             break;
  158.         }
  159.     } // while (TRUE)
  160.     return(RetCode);
  161. }
  162. /******************************************************************************
  163. Create a View that will logicaly represent the DataBase
  164. Typical View Of the Disk Group would be
  165. Create View SMS_Disk as select dwMachineID,
  166.              Disk_COMM.Disk_Index0 , Disk_COMM.File_System0 ,
  167.              Disk_COMM.Storage_Type0 , Disk_SPEC.Volume_Name0 ,
  168.              Disk_SPEC.Serial_Number0 ,Disk_SPEC.Heads0 ,
  169.              Disk_SPEC.Sectors0 , Disk_SPEC.Cylinders0 ,
  170.              Disk_SPEC.__Disk_Full0 , Disk_SPEC.Free_Storage__MByte_0 ,
  171.              Disk_SPEC.Storage_Size__MByte_0 , Disk_SPEC.Storage_Used__MByte_0
  172.         from Disk_COMM  , Disk_SPEC, MachineDataTable
  173.         where Disk_COMM.key =* CommonKey and Disk_SPEC.key =* SpecificKey
  174.          and ArchitectureKey = 5 and GroupKey = 5
  175. *****************************************************************************/
  176. int CreateV(ViewName, TableDef,dbproc,NoCols,ArchitectureKey,GroupKey ,
  177.         CurCommonTableName , CurSpecificTableName,ViewSuffix,
  178.         CurArchitectureName,DropOnlyFlag, Mode)
  179. char * ViewName;
  180. struct VIEWDEF * TableDef;
  181. DBPROCESS * dbproc;
  182. int NoCols,
  183.     ArchitectureKey ,
  184.     GroupKey;
  185. char * CurCommonTableName ,
  186.      * CurSpecificTableName;
  187. int ViewSuffix;
  188. char * CurArchitectureName;
  189. int DropOnlyFlag;
  190. {
  191.     int i ;
  192.     char TableName[MAX_COLUMN_NAME];
  193.     int CommonFlag = FALSE,
  194.     SpecFlag = FALSE;
  195.     BOOL bDirect = FALSE;
  196.     char cmd[MAX_COLUMN_NAME];
  197.     if (Mode == 1) {
  198.         bDirect = TRUE;
  199.     }
  200.     for ( i= 0; ViewName[i]; i++)  // Change all Spaces to _ to derive Table Name
  201.         if (ViewName[i] == ' ')
  202.             ViewName[i] = '_';
  203.     MakeUName(ViewName, CurSpecificTableName, CurCommonTableName);
  204.     if (ViewSuffix) // If this is not the first view
  205.         sprintf(ViewName,"%s%d",ViewName,ViewSuffix);
  206.     DropView ( dbproc,ViewName);
  207.     if( DropOnlyFlag )
  208.         return(SUCCEED);
  209.     // 9/13/1995 a-cvadai
  210.     // First, make sure there is a 0-datakey row in each table
  211.     // so the views can use inner-joins.
  212.     // =======================================================
  213.     if (!bDirect) {
  214.     
  215.         if (strlen(CurSpecificTableName) > 0) {
  216.             dbcmd (dbproc, (char *) " IF NOT EXISTS (select * from ");
  217.             dbcmd (dbproc, (char *) CurSpecificTableName);
  218.             dbcmd (dbproc, (char *) " where datakey = 0) INSERT ");
  219.             dbcmd (dbproc, (char *) CurSpecificTableName);
  220.             dbcmd (dbproc, (char *) " (datakey) values (0)");
  221.             dbsqlexec (dbproc);
  222.             dbresults(dbproc); 
  223.             do {
  224.                 while (dbnextrow(dbproc) == REG_ROW) {
  225.                     ;
  226.                 }
  227.             } while (dbresults(dbproc) == SUCCEED);
  228.         }
  229.    
  230.         if (strlen(CurCommonTableName) > 0) {
  231.             dbcmd (dbproc, (char *) " IF NOT EXISTS (select * from ");
  232.             dbcmd (dbproc, (char *) CurCommonTableName);
  233.             dbcmd (dbproc, (char *) " where datakey = 0) INSERT ");
  234.             dbcmd (dbproc, (char *) CurCommonTableName);
  235.             dbcmd (dbproc, (char *) " (datakey) values (0)"); 
  236.             dbsqlexec (dbproc);
  237.             dbresults(dbproc);
  238.             do {
  239.                 while (dbnextrow(dbproc) == REG_ROW) {
  240.                     ;
  241.                 }
  242.             } while (dbresults(dbproc) == SUCCEED);
  243.         }
  244.     }
  245.     dbcmd (dbproc , (char *) "Create View ");
  246.     dbcmd (dbproc , (char *) PREFIX);
  247.     dbcmd (dbproc , (char *) ViewName);
  248.     dbcmd (dbproc , (char *) " as select ");
  249.     if (!bDirect) {
  250.         dbcmd (dbproc ,(char *) "dwMachineID , ");
  251.     }
  252.     else {
  253.         dbcmd (dbproc ,(char *) "MachineID , ");
  254.     }
  255.     for ( i = 0; i < NoCols;i++) {
  256.          // Check if this attribute is in the COMM or SPEC tables
  257.         if (TableDef[i].ComSpec == COMMON)
  258.             strcpy(TableName,CurCommonTableName);
  259.         else
  260.             strcpy(TableName,CurSpecificTableName);
  261.         if (i)    // We need a , after the first Table name
  262.             dbcmd(dbproc,(char *) " , ");
  263.             dbcmd(dbproc,(char *) TableName); // Append the Table Name eg DISK_COMM
  264.             dbcmd(dbproc,(char *) ".");
  265.             dbcmd(dbproc,(char *) TableDef[i].ColName);
  266.     } // End For
  267.     dbcmd (dbproc,(char *)" from ");
  268.     
  269.     if (!bDirect) {
  270.         dbcmd (dbproc,(char *)" MachineDataTable ");
  271.         if (strlen (CurCommonTableName) != 0) {
  272.             dbcmd (dbproc,(char *)" ,");
  273.             // Append the Table Name eg DISK_COMM
  274.             dbcmd(dbproc,(char *) CurCommonTableName);
  275.             dbcmd(dbproc,(char *) "  ");
  276.         }
  277.     }
  278.     if ( strlen (CurSpecificTableName) != 0) {
  279.         if (!bDirect) {
  280.             dbcmd (dbproc,(char *)" , ");
  281.         }
  282.         // Append the Table Name eg DISK_SPEC
  283.         dbcmd(dbproc,(char *) CurSpecificTableName);
  284.         dbcmd(dbproc,(char *) " ");
  285.     }
  286.     if (!bDirect) {
  287.         dbcmd(dbproc ,(char *) "where " );
  288.         if (strlen (CurCommonTableName) != 0) {
  289.             dbcmd(dbproc ,(char *) CurCommonTableName);
  290.             dbcmd(dbproc ,(char *) ".datakey = ");
  291.             dbcmd(dbproc ,(char *) " CommonKey and ");
  292.         }
  293.         if ( strlen (CurSpecificTableName) != 0) {
  294.             dbcmd(dbproc ,(char *) CurSpecificTableName);
  295.             dbcmd(dbproc ,(char *) ".datakey = ");
  296.             dbcmd(dbproc ,(char *) "SpecificKey and ");
  297.         }
  298.         dbcmd(dbproc ,(char *) "ArchitectureKey = ");
  299.         sprintf(cmd,"%d", ArchitectureKey);
  300.         dbcmd(dbproc ,(char *) cmd);
  301.         dbcmd(dbproc ,(char *) " and GroupKey = ");
  302.         sprintf(cmd,"%d", GroupKey);
  303.         dbcmd(dbproc ,(char *) cmd);
  304.     }
  305.     dbsqlexec (dbproc);
  306.     return ( CheckSQLReturn(dbproc, "Create View"));
  307. }
  308. DropView(DBPROCESS *dbproc, char * ViewName)
  309. {
  310.     // Check if View already exists and if so Drop it
  311.     dbcmd (dbproc ,(char *) "IF EXISTS (SELECT * FROM sysobjects ");
  312.     dbcmd (dbproc ,(char *) " WHERE id = object_id('dbo.");
  313.     dbcmd (dbproc ,(char *) PREFIX);
  314.     dbcmd (dbproc ,(char *) ViewName);
  315.     dbcmd (dbproc ,(char *) "'))");
  316.     dbcmd (dbproc ,(char *) " DROP view dbo.");
  317.     dbcmd (dbproc ,(char *) PREFIX);
  318.     dbcmd (dbproc ,(char *) ViewName);
  319.     dbsqlexec (dbproc);
  320.     return( CheckSQLReturn(dbproc, "Drop View"));
  321. }
  322. // Create a View of all the groups that have been made into Views
  323. CreateGroupView(DBPROCESS * dbproc)
  324. {
  325.     dbcmd (dbproc , (char *) "Create View ");
  326.     dbcmd (dbproc , (char *) PREFIX);
  327.     dbcmd (dbproc , (char *) "GroupNames");
  328.     dbcmd (dbproc , (char *) " as select ");
  329.     dbcmd (dbproc , (char *) " GM.GroupName  ");
  330.     dbcmd (dbproc , (char *) " FROM ArchitectureMap AM,");
  331.     dbcmd (dbproc , (char *) " GroupMap GM ");
  332.     dbcmd (dbproc , (char *) " WHERE ");
  333.     dbcmd (dbproc , (char *) " GM.ArchitectureKey = AM.ArchitectureKey ");
  334.     dbsqlexec (dbproc);
  335.     return ( CheckSQLReturn(dbproc, "Create Group View"));
  336. }
  337. CreateSNMPVarbindsView(DBPROCESS * dbproc)
  338. {
  339.     dbcmd (dbproc , (char *) "Create View ");
  340.     dbcmd (dbproc , (char *) PREFIX);
  341.     dbcmd (dbproc , (char *) "SNMP_Varbinds");
  342.     dbcmd (dbproc , (char *) " as select ");
  343.     dbcmd (dbproc , (char *) " MachineID, Variable, ObjectIdentifier, DataType, Data1, Data2, Data3, Data4, Data5, Data6 ");
  344.     dbcmd (dbproc , (char *) " FROM SNMP_Varbinds");
  345.     dbsqlexec (dbproc);
  346.     return ( CheckSQLReturn(dbproc, "Create Group View"));
  347. }
  348. //Make UniqueName
  349. void MakeUName(vName,uName,cName)
  350.     char * vName ,
  351.          * uName , * cName;
  352. {
  353.     char p1[MAX_COLUMNS] = "";
  354.     char p2[MAX_COLUMNS] = "";
  355.     char commstr[] = "_COMM";
  356.     char specstr[] = "_SPEC";
  357.     char *psearch;
  358.     int  lenp1;
  359.     if ( strlen (uName) != 0) {
  360.         if ((psearch = strstr(uName,specstr)) == NULL)
  361.         strcpy(vName,uName);
  362.     else {
  363.         lenp1 = psearch-uName;
  364.         strncpy (p1,uName,lenp1);
  365.         strcpy (p2,psearch+5);
  366.         sprintf(vName,"%s%s",p1,p2);
  367.         }
  368.     }
  369.     else {
  370.         if ((psearch = strstr(cName,commstr)) == NULL)
  371.         strcpy(vName,cName);
  372.     else {
  373.         lenp1 = psearch-cName;
  374.         strncpy (p1,cName,lenp1);
  375.         strcpy (p2,psearch+5);
  376.         sprintf(vName,"%s%s",p1,p2);
  377.         }
  378.     }
  379. }
  380. //     Check SQL return and empty return buffer
  381. CheckSQLReturn(DBPROCESS * dbproc, char *Action)
  382. {
  383.     RETCODE result_code;
  384.     int iResult = FAIL;
  385.     
  386.     while ((result_code = dbresults(dbproc)) != NO_MORE_RESULTS) {
  387.         if (result_code == SUCCEED) {
  388.             iResult = SUCCEED;
  389.             while (dbnextrow(dbproc) != NO_MORE_ROWS)
  390.                 ;  /* do nothing */
  391.         }
  392.         else {
  393.              return(FAIL);
  394.              break;
  395.         }
  396.     }
  397.     return (iResult);
  398. }
  399. //
  400. int err_handler(DBPROCESS * dbproc, int severity, int dberr, int oserr,
  401.                 char * dberrstr, char * oserrstr)
  402. {
  403.     char    szString[512];
  404.     char    szMsgTitle[32];
  405.     int     iString;
  406.     // Ignore any 'Changed context' errors.
  407.     if (dberr == 5701 || dberr == 5703) {
  408.         return 0;
  409.     }
  410.     LoadString(hInst, IDS_ERR_SQL_ERROR, szString, MAX_PATH);
  411.     LoadString(hInst, IDS_MSC_DBERROR, szMsgTitle, 32);
  412.     iString = sizeof(szString) - strlen(szString);
  413.     if (dberrstr != NULL) {
  414.         strncpy(szString, dberrstr, iString);
  415.     }
  416.     else if (oserr != DBNOERR && oserrstr != NULL) {
  417.         strncpy(szString, oserrstr, iString);
  418.     }
  419.     szString[sizeof(szString)-1] = 0;
  420.     if (strstr(szString, "General SQL Server") == NULL) {
  421.         MessageBox(NULL, szString, szMsgTitle, MB_ICONSTOP);    
  422.     }
  423.     return(INT_CANCEL);
  424. }