Line data Source code
1 : /*
2 : * Purpose: Test reaching processes limit trigger a specific error
3 : * Functions: dbopen dbsetmaxprocs
4 : */
5 :
6 : #include "common.h"
7 : #include <freetds/bool.h>
8 :
9 : static bool proc_limit_hit = false;
10 :
11 : static int
12 10 : err_handler(DBPROCESS * dbproc TDS_UNUSED, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr)
13 : {
14 10 : if (dberr == 20011) {
15 10 : proc_limit_hit = true;
16 10 : fprintf(stderr, "OK: anticipated error %d (%s) arrived\n", dberr, dberrstr);
17 10 : return INT_CANCEL;
18 : }
19 :
20 0 : fprintf(stderr,
21 : "DB-LIBRARY error (severity %d, dberr %d, oserr %d, dberrstr %s, oserrstr %s):\n",
22 : severity, dberr, oserr, dberrstr ? dberrstr : "(null)", oserrstr ? oserrstr : "(null)");
23 0 : fflush(stderr);
24 :
25 0 : return INT_CANCEL;
26 : }
27 :
28 10 : TEST_MAIN()
29 : {
30 : LOGINREC *login;
31 : DBPROCESS *dbproc, *dbproc2;
32 10 : bool failed = false;
33 :
34 10 : set_malloc_options();
35 :
36 10 : read_login_info(argc, argv);
37 10 : printf("Starting %s\n", argv[0]);
38 10 : dbinit();
39 :
40 : /* limit number of processes to get error */
41 10 : dbsetmaxprocs(1);
42 :
43 10 : dberrhandle(syb_err_handler);
44 10 : dbmsghandle(syb_msg_handler);
45 :
46 10 : printf("About to logon\n");
47 :
48 10 : login = dblogin();
49 10 : DBSETLPWD(login, PASSWORD);
50 10 : DBSETLUSER(login, USER);
51 10 : DBSETLAPP(login, "proc_limit");
52 :
53 10 : dbproc = dbopen(login, SERVER);
54 :
55 : /* another process should fail as limit reached */
56 10 : dberrhandle(err_handler);
57 10 : dbproc2 = dbopen(login, SERVER);
58 10 : dbloginfree(login);
59 :
60 10 : if (dbproc == NULL || dbproc2 != NULL || !proc_limit_hit)
61 0 : failed = true;
62 :
63 10 : dbclose(dbproc);
64 10 : dbexit();
65 :
66 10 : printf("%s %s\n", __FILE__, (failed ? "failed!" : "OK"));
67 10 : return failed ? 1 : 0;
68 : }
|