bin/load/loader.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- stop_updates
- error_init
- main
1 /***************************************
2 $Revision: 1.11 $
3
4 loader.c - core of the database loading.
5
6 Status: NOT REVUED, TESTED
7
8 ******************/ /******************
9 Filename : loader.c
10 Authors : Andrei Robachevsky
11 OSs Tested : Solaris 7,8
12 ******************/ /******************
13 Copyright (c) 2000,2001 RIPE NCC
14
15 All Rights Reserved
16
17 Permission to use, copy, modify, and distribute this software and its
18 documentation for any purpose and without fee is hereby granted,
19 provided that the above copyright notice appear in all copies and that
20 both that copyright notice and this permission notice appear in
21 supporting documentation, and that the name of the author not be
22 used in advertising or publicity pertaining to distribution of the
23 software without specific, written prior permission.
24
25 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 ***************************************/
32
33
34 #include <sys/types.h>
35 #include <fcntl.h>
36 #include <signal.h>
37
38 #include <ud.h>
39 #include <ud_int.h>
40 #include <constants.h>
41 #include <properties.h>
42
43
44 #include "ca_configFns.h"
45 #include "ca_macros.h"
46 #include "ca_srcAttribs.h"
47
48
49
50
51 void stop_updates()
/* [<][>][^][v][top][bottom][index][help] */
52 {
53 char print_buf[STR_M];
54
55 fprintf(stderr, "Updates interrupted..\n");
56 sprintf(print_buf, "%d", 0);
57 CO_set_const("UD.do_update", print_buf);
58 return;
59 }
60
61
62 void error_init(int argc, char ** argv) {
/* [<][>][^][v][top][bottom][index][help] */
63 char *slash;
64 char progname[32];
65
66 slash = strrchr(argv[0],'/');
67 strncpy(progname, (slash != NULL) ? slash+1 : argv[0], 31);
68 progname[31]=0;
69
70 /* Initialize error module but do not process ER_DEF definitions from the config */
71 ER_init(progname, 0);
72
73 /* ripupdlog: logs all update transactions */
74 /* add one more definition */
75 {
76 char *err_msg = NULL;
77 char *buf =
78 "CREATE err_log { FORMAT SEVCHAR|FACSYMB|TEXTLONG|DATETIME SOCK 2 }"
79 "( FAC ALL SEV E- )"
80 "( FAC UD ASP 0xffffffff SEV I )"
81 ;
82
83 int parsres = ER_parse_spec(buf, &err_msg);
84
85 if( parsres != 0 ) { /* print only on failure */
86 puts(err_msg);
87 }
88
89 wr_free(err_msg);
90
91 dieif( parsres != 0 );
92 }
93
94
95 } /* error_init() */
96
97
98 /***********************************************
99 ******* MAIN **********************************
100 ***********************************************/
101
102
103 int main(int argc, char** argv) {
/* [<][>][^][v][top][bottom][index][help] */
104 int c;
105 int fd;
106 extern int optind;
107 extern char *optarg;
108 int errflg = 0;
109 int dummy_allowed;
110 int start_object;
111 int num_ok, num_failed;
112 long num_skip=0;
113 struct _nrtm *nrtm=NULL;
114 UD_stream_t ud_stream;
115 Log_t log;
116 int current_serial=-1;
117 int load_pass=0;
118 int delay=1;
119 char *prop_file_name=NULL;
120 int do_update;
121 char *source_name = "RIPE";
122 ca_dbSource_t *source_hdl;
123 char *db_host, *db_name, *db_user, *db_passwd;
124 int db_port;
125 char *co_result;
126
127
128 struct sigaction sig;
129
130 num_ok=0; num_failed=0;
131 dummy_allowed=0;
132
133 start_object = 1;
134
135 while ((c = getopt(argc, argv, "n:M:L:p:s:?")) != EOF)
136 switch (c) {
137 case 'n':
138 num_skip=atol(optarg);
139 break;
140 case 'p':
141 prop_file_name = optarg;
142 break;
143 case 'L':
144 load_pass=atoi(optarg);
145 dummy_allowed=1;
146 break;
147 case 's':
148 source_name=optarg;
149 break;
150 case '?':
151 default :
152 errflg++;
153 break;
154 }
155 if (errflg) {
156 fprintf(stderr,"usage: standalone [-L pass#] [-n num_skip] [-p properties] file\n");
157 exit (2);
158 }
159
160
161 sig.sa_handler=stop_updates;
162 sigemptyset(&sig.sa_mask);
163 sig.sa_flags=SA_RESTART;
164 sigaction(SIGINT, &sig, NULL);
165 sigaction(SIGTERM, &sig, NULL);
166
167 co_result = CO_set();
168 free(co_result);
169
170 /* 3a. Populate dictionary and load config */
171 ca_init(prop_file_name);
172
173 /* 4. initalise error system */
174 error_init(argc, argv);
175
176 /* Zero the structure */
177 memset(&ud_stream, 0, sizeof(ud_stream));
178
179 /* set mode of operation: unprotected (dummy allowed), updates, standalone */
180 ud_stream.ud_mode= (B_DUMMY | B_UPDATE | B_STANDALONE );
181
182 /* get the source handle */
183 source_hdl = ca_get_SourceHandleByName(source_name);
184
185 /* Connect to the database */
186 db_host = ca_get_srcdbmachine(source_hdl);
187 db_port = ca_get_srcdbport(source_hdl);
188 db_name = ca_get_srcdbname(source_hdl);
189 db_user = ca_get_srcdbuser(source_hdl);
190 db_passwd = ca_get_srcdbpassword(source_hdl);
191
192 fprintf(stderr, "D: Making SQL connection to %s@%s ...", db_name, db_host);
193
194 /* ud_stream.db_connection=SQ_get_connection2(); */
195 ud_stream.db_connection=SQ_get_connection(db_host, db_port, db_name, db_user, db_passwd);
196
197
198 if(! ud_stream.db_connection) {
199 fprintf(stderr, "D: ERROR: no SQL connection\n");
200 return;
201 }
202
203 fprintf(stderr, "OK\n");
204
205
206
207 ud_stream.nrtm=NULL;
208
209 ud_stream.log.num_ok=0;
210 ud_stream.log.num_failed=0;
211
212 free(db_host);
213 free(db_name);
214 free(db_user);
215 free(db_passwd);
216
217
218 if(optind<argc) fd=open(argv[optind],O_RDONLY, 0666); else fd=0;
219
220 if (fd==-1) { fprintf(stderr, "Cannot open data stream. Exiting..\n");
221 exit(1); }
222
223
224 ud_stream.condat.sock = fd;
225 ud_stream.num_skip=num_skip;
226 ud_stream.load_pass=load_pass;
227
228 /* Start to process the stream */
229
230 fprintf(stderr, "starting processing stream\n");
231 num_ok=UD_process_stream(&ud_stream);
232 fprintf(stderr, "processing stream finished\n");
233 fprintf(stderr, "%d objects processed\n", num_ok);
234
235 return(0);
236
237 } /* main() */
238
239
240
241