home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sysmgmt / sms / smsview / nt / viewdll / viewdll.c < prev    next >
C/C++ Source or Header  |  1996-10-15  |  18KB  |  545 lines

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