]> andersk Git - moira.git/blob - backup/dump_db.dc
open DB with SQL, not quel
[moira.git] / backup / dump_db.dc
1 /*
2  *      $Source$
3  *      $Author$
4  *      $Header$
5  *
6  *      (c) Copyright 1988 by the Massachusetts Institute of Technology.
7  *      For copying and distribution information, please see the file
8  *      <mit-copyright.h>.
9  *
10  *      This program dumps the SMS database to a series of output files
11  * which can be later read back into SMS in the event of a crash.
12  * 
13  */
14
15 #ifndef lint
16 static char *rcsid_dump_db_c = "$Header$";
17 #endif lint
18
19 #include <stdio.h>
20 #include <sys/file.h>
21 #include <ctype.h>
22 #include <mit-copyright.h>
23 EXEC SQL INCLUDE sqlca;
24 #include "dump_db.h"
25
26 /* putc without the line buffer hair */
27
28 #define putc1(x, p)     (--(p)->_cnt >= 0 ?\
29         (int)(*(unsigned char *)(p)->_ptr++ = (x)) :\
30                 _flsbuf((unsigned char)(x), p))
31
32 FILE *open_file();
33
34 char act[128];
35
36 main(argc, argv)
37     int argc;
38     char **argv;
39 {
40     char *prefix;
41     register int i;
42     
43     if (argc != 2) {
44         fprintf(stderr, "Usage: smsbackup prefix\n");
45         exit(1);
46     }
47     prefix = argv[1];
48
49     bzero(act, 128);
50
51     act[SEP_CHAR]=1;
52     act['\\']=1;
53     act[127]=2;
54     for (i=0; i<' '; i++) act[i]=2;
55     
56     EXEC SQL CONNECT moira;
57     EXEC SQL set lockmode session where level = table;
58
59     do_backups(prefix);
60
61     EXEC SQL DISCONNECT;
62     exit(0);
63 }
64
65 dump_int(f, n)
66     FILE *f;
67     int n;
68 {
69     char buf[1024];
70     (void) sprintf(buf, "%d", n);
71     dump_str(f, buf);
72 }
73
74 wpunt()
75 {
76     punt("can't write backup file");
77 }
78
79 dump_str(f, str)
80     register FILE *f;
81     register char *str;
82 {
83     char  *strtrim();
84     register char *ibp = strtrim(str);
85     register int c;             /* PCC doesn't put chars in registers.. */
86     for (; c = *ibp; ibp++) {
87         c = toascii(c);         /* punt 8th bit */
88         switch(act[c]) {
89             register int t;
90         case 1:
91             if (putc1('\\', f) < 0) wpunt();
92             /* fall thru.. */
93         case 0:
94             if (putc1(c, f) < 0) wpunt();
95             
96             break;
97         case 2:
98             if (putc1('\\', f) < 0) wpunt();        
99             t = ((c>>6)&7) + '0';
100             if (putc1(t,f) < 0) wpunt();
101             t = ((c>>3)&7) + '0';
102             if (putc1(t,f) < 0) wpunt();
103             t = (c&7) + '0';
104             if (putc1(t,f) < 0) wpunt();
105             fprintf(stderr, "control character \\%03o\n", c);
106             break;
107             
108         default:
109             punt("Can't get here");
110         }
111     }
112 }
113
114 safe_close(stream)
115         FILE *stream;
116 {
117         if (fflush(stream) == EOF)
118                 punt("Unable to fflush");
119         if (fsync(fileno(stream)) != 0) 
120                 punt("Unable to fsync");
121         (void) fclose(stream);
122 }       
123
124 FILE *open_file(prefix, suffix)
125     char *prefix, *suffix;
126 {
127     char name[BUFSIZ];
128     int fd;
129     FILE *f;
130     
131     (void) strcpy(name, prefix);
132     (void) strcat(name, suffix);
133
134     fd = open(name, O_CREAT|O_WRONLY|O_EXCL, 0644);
135     if (fd < 0) {
136         punt(name);
137     }
138     f = fdopen(fd, "w");
139     if (f == NULL) {
140         fprintf(stderr, "fdopen of ");
141         punt(name);
142     }
143     fprintf(stderr, "Working on %s\n", name);
144     return(f);
145 }
146
147
148 /*
149  * Trim whitespace off both ends of a string.
150  */
151 char *strtrim(save)
152     register char *save;
153 {
154     register char *t, *s;
155
156     s = save;
157     while (isspace(*s)) s++;
158     /* skip to end of string */
159     if (*s == '\0') {
160         *save = '\0';
161         return(save);
162     }
163
164     for (t = s; *t; t++) continue; 
165     while (t > s) {
166         --t;
167         if (!isspace(*t)) {
168             t++;
169             break;
170         }
171     }
172     *t = '\0';
173     return s;
174 }
This page took 0.051125 seconds and 5 git commands to generate.