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

Windows编程

开发平台:

Visual C++

  1. // ===========================================================================
  2. // Copyright (C) 1995 by Microsoft Corporation.
  3. //
  4. //  File: deljob.cpp
  5. //
  6. //  This program illustrates how to use the SMS SDK to delete an SMS
  7. //  job.
  8. //
  9. //  Author: Larry A. French
  10. //
  11. // ===========================================================================
  12. // ====================================================================
  13. //  Includes.
  14. // ====================================================================
  15. #include <afx.h>
  16. #include <stdlib.h>                 // for itoa
  17. #include <smsapi.h>                 // Header for the APIs.
  18. #include <time.h>                   // for time functions.
  19. // Include the GetStatusName function.
  20. // -------------------------------------
  21. #include "..commonstatus.inc"
  22. // ====================================================================
  23. //      Defines.
  24. // ====================================================================
  25. #define CCH_MAXSTRING   256
  26. #define MAX_CREATE      100
  27. // ====================================================================
  28. //  Local prototypes.
  29. // ====================================================================
  30. const char *GetStatusName( SMS_STATUS stat );
  31. void DisplaySmsError(const char* pszMessage, SMS_STATUS stat);
  32. BOOL DidRequestHelp(int argc, char** argv);
  33. HANDLE ConnectToDatasource();
  34. void DisplayHelp();
  35. void InputString(const char* pszMessage, char* pszResult);
  36. void DisplayGreeting();
  37. BOOL UserSaysYes(const char* pszPrompt);
  38. // ====================================================================
  39. //  Structs.
  40. // ====================================================================
  41. // This struct holds a folder handle and its ID.
  42. typedef struct _FOLDERREC {
  43.     HANDLE hFolder;                     // Handle to a folder.
  44.     char szID[SMS_DATA_BUFF_SIZE+1];    // Its ID.
  45.     BOOL bDeleted;                      // marked as deleted in this program.
  46. } FOLDERREC;
  47. // ====================================================================
  48. //  The work starts here.
  49. // ====================================================================
  50. void main(int argc, char** argv)
  51. {
  52.     // Check to see if this is a request to display the help
  53.     // screen.  If so, display it. Otherwise, display a greeting
  54.     // banner.
  55.     //=========================================================
  56.     if (DidRequestHelp(argc, argv)) {
  57.         DisplayHelp();
  58.         return;
  59.     }
  60.     else {
  61.         DisplayGreeting();
  62.     }
  63.     SMS_STATUS stat;
  64.     HANDLE hConnect;
  65.     HANDLE hContainerJob;
  66.     char szJobID[SMS_DATA_BUFF_SIZE + 1];
  67.     char szPrompt[CCH_MAXSTRING];
  68.     // Connect to the data source. If the connect fails, give up.
  69.     // Note a message will have already been displayed by
  70.     // ConnectToDatasource.
  71.     //===========================================================
  72.     hConnect = ConnectToDatasource();
  73.     if (hConnect == NULL) {
  74.         return;
  75.     }
  76.     // Open package container.
  77.     // =======================
  78.     stat = SmsOpenContainer( C_JOB, hConnect, &hContainerJob );
  79.     if (stat != SMS_OK) {
  80.         printf("SmsOpenContainer failed: %dn", stat);
  81.         SmsDataSourceDisconnect( hConnect );
  82.         return;
  83.     }
  84.     // Select all folders (no filters.)
  85.     // ================================
  86.     stat = SmsPopulate( hContainerJob, POP_SYNC, NULL);
  87.     if (!(stat == SMS_OK || stat==SMS_EMPTY)) {
  88.         printf("Bad return from SmsPopulate: %dn", stat);
  89.         SmsCloseContainer( hContainerJob );
  90.         SmsDataSourceDisconnect( hConnect );
  91.         return;
  92.     }
  93.     FOLDERREC *paFolderRec = NULL;
  94.     // Get count of folders in container, allocate memory.
  95.     // ===================================================
  96.     DWORD ctFolders;
  97.     SmsGetFolderCount( hContainerJob, F_ANY, &ctFolders );
  98.     paFolderRec = (FOLDERREC *)malloc( ctFolders * sizeof(FOLDERREC) );
  99.     // Retrieve all the jobs and store their handles and IDs.
  100.     // ======================================================
  101.     for (DWORD dwI = 0; dwI < ctFolders; dwI++) {
  102.         SmsGetNextFolder( hContainerJob, F_ANY, &(paFolderRec[dwI].hFolder) );
  103.         SmsGetFolderID( paFolderRec[dwI].hFolder, paFolderRec[dwI].szID );
  104.         paFolderRec[dwI].bDeleted = FALSE;
  105.     }
  106.     
  107.     BOOL bDidDeleteFolder;
  108. AGAIN:
  109.     
  110.     // The bDidDelete flag is used to indicate whether or not
  111.     // the folder deletion was successful.  We assume that something
  112.     // will go wrong until we have proven otherwise and know that
  113.     // the folder was in fact deleted.
  114.     //=============================================================
  115.     bDidDeleteFolder = FALSE;
  116.     printf("**************************************************n");
  117.     printf("* Please enter the ID of the job that you wish   *n");
  118.     printf("* to delete.                                     *n");
  119.     printf("* Available jobs are:                            *n");
  120.     printf("**************************************************n");
  121.     // Display the job IDs.
  122.     // ====================
  123.     for (dwI = 0; dwI < ctFolders; dwI++) {
  124.         if (!paFolderRec[dwI].bDeleted) {
  125.             printf("[%d] %sn", dwI, paFolderRec[dwI].szID);
  126.         }
  127.     }
  128.     printf("n");
  129.     InputString("Job ID", szJobID);
  130.     sprintf(szPrompt, "Delete job "%s"", szJobID);
  131.     if (UserSaysYes(szPrompt)) {
  132.         // Control comes here if the user has given the OK to delete
  133.         // the specified job. To delete the job, we first get its
  134.         // its folder handle, unlink the folder, and then commit it.
  135.         // Note that SmsGetFolderByID doesn't work on containers.
  136.         //
  137.         // Search the array of FOLDERRECs looking for this ID.
  138.         // =========================================================
  139.         BOOL bFound = FALSE;
  140.         for (dwI = 0; dwI < ctFolders; dwI++) {
  141.             if (strcmp( szJobID, paFolderRec[dwI].szID ) == 0) {
  142.                 // Check that not already deleted
  143.                 if (!paFolderRec[dwI].bDeleted) {
  144.                     bFound = TRUE;
  145.                 }
  146.                 break;
  147.             }
  148.         }
  149.         // If we found the ID, unlink and commit the folder.
  150.         // =================================================
  151.         if (bFound) {
  152.             // Unlink the folder to remove it from the in-memory hierarchy.
  153.             //============================================================
  154.             stat = SmsUnlinkFolder(paFolderRec[dwI].hFolder);
  155.             if (stat != SMS_OK) {
  156.                 DisplaySmsError("Failed to unlink the job folder", stat);
  157.             }
  158.             // Commit the unlinked folder to delete the folder in the
  159.             // datasource.
  160.             //=======================================================
  161.             stat = SmsCommitFolder(paFolderRec[dwI].hFolder);
  162.             if (stat != SMS_OK) {
  163.                 DisplaySmsError("Failed to commit the job folder", stat);
  164.             }
  165.             // If all OK then mark that job as deleted in our array.
  166.             // =====================================================
  167.             if (stat == SMS_OK) {
  168.                 paFolderRec[dwI].bDeleted = TRUE;
  169.                 bDidDeleteFolder = TRUE;
  170.                 printf("Job: %s was deleted succesfullynn", szJobID);
  171.             }
  172.         } else {
  173.             printf("Job %s not foundn", szJobID );
  174.         }
  175.     }
  176.     // Allow user to try again.
  177.     // (This is one of the few cases where a goto is permitted.)
  178.     // =========================================================
  179.     
  180.     if (UserSaysYes(bDidDeleteFolder ? "Delete another job?" : "Try again?")) {
  181.         goto AGAIN;
  182.     }
  183.     // Close all job folders.
  184.     // ======================
  185.     for (dwI = 0; dwI < ctFolders; dwI++) {
  186.         SmsCloseFolder( paFolderRec[dwI].hFolder );
  187.     }
  188.     // Close the container.
  189.     //=====================
  190.     stat = SmsCloseContainer( hContainerJob );
  191.     if (stat != SMS_OK) {
  192.         DisplaySmsError("Failed to close the package container", stat);
  193.     }
  194.     // Disconnect from the datasource.
  195.     //================================
  196.     stat = SmsDataSourceDisconnect( hConnect );
  197.     if (stat != SMS_OK) {
  198.         DisplaySmsError("Failed to disconnect from the datasource", stat);
  199.     }
  200. }  /* main */
  201. // ====================================================================
  202. // InputString
  203. //
  204. // Prompt the user to input a string and return the string in the
  205. // specified buffer.
  206. //
  207. // Parameters:
  208. //      const char* pszMessage
  209. //          The user prompt to display.
  210. //
  211. //      char* pszResult
  212. //          Pointer to the buffer where the user's input will be returned.
  213. //
  214. // Returns;
  215. //      The user's input is returned via the given buffer.
  216. //
  217. // ====================================================================
  218. void InputString(const char* pszMessage, char* pszResult)
  219. {
  220.     printf("%s: ", pszMessage);
  221.     gets(pszResult);
  222. }
  223. // ====================================================================
  224. // UserSaysYes
  225. //
  226. // Prompt the user to reply yes or no.  If the user enters "Y" then
  227. // return TRUE, otherwise FALSE.
  228. //
  229. // Parameters:
  230. //      const char* pszPrompt
  231. //          The string used to prompt the user
  232. //
  233. // Returns:
  234. //      TRUE = User replied "Y" or "y"
  235. //      FALSE = User gave any other reply.
  236. //
  237. // ====================================================================
  238. BOOL UserSaysYes(const char* pszPrompt)
  239. {
  240.     printf("%s? [y/n]", pszPrompt);
  241.     char szReply[256];
  242.     gets(szReply);
  243.     return(szReply[0] == 'y' || szReply[0] == 'Y');
  244. }
  245. // ====================================================================
  246. // ConnectToDatasource
  247. //
  248. // Get the datasource connection information from the user and use it
  249. // to connect to the datasource.
  250. //
  251. // Parameters:  None.
  252. //
  253. // Returns:
  254. //      The connection handle or NULL if the connection failed.
  255. //
  256. // ====================================================================
  257. HANDLE ConnectToDatasource()
  258. {
  259.     // Get the information we need to connect to the
  260.     // data source from the user.
  261.     //==============================================
  262.     char szServer[CCH_MAXSTRING];
  263.     char szUser[CCH_MAXSTRING];
  264.     char szPasswd[CCH_MAXSTRING];
  265.     char szDatabase[CCH_MAXSTRING];
  266.     printf("n");
  267.     printf("**************************n");
  268.     printf("* Connect to data source *n");
  269.     printf("**************************n");
  270.     InputString("SQL server name", szServer);
  271.     InputString("SQL database name", szDatabase);
  272.     InputString("User name for SQL server", szUser);
  273.     InputString("Password for SQL server", szPasswd);
  274.     printf("n");
  275.     // Connect to a data source. SQL in this case.
  276.     // ===========================================
  277.     DATASOURCE dsParams;
  278.     dsParams.sqlParams.ds          = DB_SQL;
  279.     dsParams.sqlParams.pszServer   = szServer;
  280.     dsParams.sqlParams.pszUserName = szUser;
  281.     dsParams.sqlParams.pszPasswd   = szPasswd;
  282.     dsParams.sqlParams.pszDbName   = szDatabase;
  283.     dsParams.sqlParams.pFunc       = NULL;         // No encryption.
  284.     dsParams.sqlParams.pszKey      = "";
  285.     HANDLE hConnect;
  286.     SMS_STATUS stat;
  287.     stat = SmsDataSourceConnect( &dsParams, &hConnect);
  288.     if (stat != SMS_OK) {
  289.         hConnect = NULL;
  290.         DisplaySmsError("Connect to data source failed", stat);
  291.     }
  292.     return( hConnect );
  293. }
  294. // ====================================================================
  295. // DidRequestHelp
  296. //
  297. // Check the program's arguments to see if the user asked for
  298. // the help screen to be displayed.
  299. //
  300. // Parameters:
  301. //      int argc
  302. //          The argc value from main(argc, argv)
  303. //
  304. //      char** argv
  305. //          The argv value from main(argc, argv)
  306. //
  307. // Returns:
  308. //      TRUE if command line parameters included a request
  309. //      for help to be displayed.
  310. //
  311. // ====================================================================
  312. BOOL DidRequestHelp(int argc, char** argv)
  313. {
  314.     const char* pszCommand = argv[1];
  315.     if (argc==2  && (strcmp((const char*) argv[1], "-help")==0)) {
  316.         return(TRUE);
  317.     }
  318.     else {
  319.         return(FALSE);
  320.     }
  321. }
  322. // ====================================================================
  323. // DisplayHelp
  324. //
  325. // This function displays the samples help screen.
  326. //
  327. // Parameters:
  328. //      None
  329. //
  330. // Returns:
  331. //      Nothing.
  332. //
  333. // ====================================================================
  334. void DisplayHelp()
  335. {
  336.     printf("nn");
  337.     printf("********************************************************n");
  338.     printf("* deljob.exe:                                          *n");
  339.     printf("*                                                      *n");
  340.     printf("* This program illustrates how to use the SMS SDK to   *n");
  341.     printf("* delete a job in the SMS database.                    *n");
  342.     printf("*                                                      *n");
  343.     printf("* Syntax:                                              *n");
  344.     printf("*     deljob.exe [-help]                               *n");
  345.     printf("*                                                      *n");
  346.     printf("* Switches:                                            *n");
  347.     printf("*     -help       Display this help screen.            *n");
  348.     printf("*                                                      *n");
  349.     printf("********************************************************n");
  350.     printf("n");
  351. }
  352. // ====================================================================
  353. // DisplayGreeting
  354. //
  355. // Display the initial greeting banner.
  356. //
  357. // Parameters:
  358. //     None.
  359. //
  360. // Returns:
  361. //     Nothing.
  362. //
  363. // ====================================================================
  364. void DisplayGreeting()
  365. {
  366.     // For this sample, the greeting is identical to the help screen.
  367.     //===============================================================
  368.     DisplayHelp();
  369. }
  370. /* EOF: deljob.cpp */