1 /*
2 Copyright (C) 2012-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: itamysql.ctr
12 */
13 
14 /**	@file itamysql.c The itamysql module.
15 */
16 
17 
18 #include <libdk3c/dk3all.h>
19 #include <itadmin/itadmin.h>
20 
21 #if DK3_HAVE_MARIADB_MYSQL_H
22 #include <mariadb/mysql.h>
23 #else
24 #if DK3_HAVE_MYSQL_MYSQL_H
25 #include <mysql/mysql.h>
26 #else
27 #if DK3_HAVE_MYSQL_H
28 #include <mysql.h>
29 #endif
30 #endif
31 #endif
32 
33 
34 
35 
36 
37 
38 #if DK3_HAVE_MARIADB_MYSQL_H || DK3_HAVE_MYSQL_MYSQL_H || DK3_HAVE_MYSQL_H
39 
40 
41 /**	Keywords used by this module.
42 */
43 static char const *itadmin_mysql_c8_kw[] = {
44 /* 0 */
45 "select * from users",
46 
47 /* 1 */
48 "select * from buildings",
49 
50 /* 2 */
51 "select * from vlans",
52 
53 /* 3 */
54 "select * from patches",
55 
56 /* 4 */
57 "select * from ddspeed",
58 
59 /* 5 */
60 "select * from networks",
61 
62 /* 6 */
63 "select * from netgroups",
64 
65 /* 7 */
66 "select * from ngdeps",
67 
68 /* 8 */
69 "select * from dhcpclasses",
70 
71 /* 9 */
72 "select * from dhcpgroups",
73 
74 /* 10 */
75 "select * from dhcppools",
76 
77 /* 11 */
78 "select * from computers",
79 
80 /* 12 */
81 "select * from aliases",
82 
83 /* 13 */
84 "select * from dhcpoptions",
85 
86 /* 14 */
87 "select * from swmanufacturers",
88 
89 /* 15 */
90 "select * from swproducts",
91 
92 /* 16 */
93 "select * from licensetypes",
94 
95 /* 17 */
96 "select * from licenses",
97 
98 NULL
99 
100 };
101 
102 
103 
104 /**	Configuration section name "itadmin".
105 */
106 static char itadmin_mysql_arg_0[] = {
107   'i', 't', 'a', 'd', 'm', 'i', 'n', '\0'
108 };
109 
110 
111 /**	Configuration section name "client".
112 */
113 static char itadmin_mysql_gr_client[] = {
114   'c', 'l', 'i', 'e', 'n', 't', '\0'
115 };
116 
117 
118 /**	Argv array to initialize the library.
119 */
120 static char *itadmin_mysql_argv[] = {
121   itadmin_mysql_arg_0,
122   NULL
123 };
124 
125 
126 /**	Groups (configuration file section) names.
127 */
128 static char *itadmin_mysql_groups[] = {
129   itadmin_mysql_gr_client,
130   itadmin_mysql_arg_0,
131   NULL
132 };
133 
134 
135 /**	Elements from users table.
136 */
137 static char const * const	itadmin_mysql_cn_users[] = {
138 /* 0 */
139 "us_s",
140 
141 /* 1 */
142 "us_t",
143 
144 /* 2 */
145 "us_sn",
146 
147 /* 3 */
148 "us_fn",
149 
150 /* 4 */
151 "us_em",
152 
153 /* 5 */
154 "us_ko",
155 
156 /* 6 */
157 "us_se",
158 
159 NULL
160 
161 };
162 
163 /**	Number of elements in itadmin_mysql_cn_users.
164 */
165 static size_t const	itadmin_mysql_sz_cn_users =
166 sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1;
167 
168 
169 /**	Elements from buildings table.
170 */
171 static char const * const       itadmin_mysql_cn_buildings[] = {
172 /* 0 */
173 "gb_s",
174 
175 /* 1 */
176 "gb_l",
177 
178 /* 2 */
179 "gb_a1",
180 
181 /* 3 */
182 "gb_a2",
183 
184 /* 4 */
185 "gb_a3",
186 
187 /* 5 */
188 "gb_a4",
189 
190 /* 6 */
191 "gb_plz",
192 
193 /* 7 */
194 "gb_ort",
195 
196 NULL
197 
198 };
199 
200 /**	Number of elements in itadmin_mysql_cn_buildings.
201 */
202 static size_t const	itadmin_mysql_sz_cn_buildings =
203 sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1;
204 
205 
206 /**	Elements from speed table.
207 */
208 static char const * const       itadmin_mysql_cn_speed[] = {
209 /* 0 */
210 "sp_s",
211 
212 /* 1 */
213 "sp_l",
214 
215 NULL
216 
217 };
218 
219 /**	Number of elements in itadmin_mysql_cn_speed.
220 */
221 static size_t const	itadmin_mysql_sz_cn_speed =
222 sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1;
223 
224 
225 /**	Elements from vlan table.
226 */
227 static char const * const       itadmin_mysql_cn_vlan[] = {
228 /* 0 */
229 "vl_s",
230 
231 /* 1 */
232 "vl_l",
233 
234 NULL
235 
236 };
237 
238 /**	Number of elements in itadmin_mysql_cn_vlan.
239 */
240 static size_t const	itadmin_mysql_sz_cn_vlan =
241 sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1;
242 
243 
244 /**	Elements from patch table.
245 */
246 static char const * const       itadmin_mysql_cn_patch[] = {
247 /* 0 */
248 "dd_n",
249 
250 /* 1 */
251 "sp_s",
252 
253 /* 2 */
254 "vl_s",
255 
256 /* 3 */
257 "dd_p",
258 
259 /* 4 */
260 "gb_s",
261 
262 /* 5 */
263 "dd_r",
264 
265 NULL
266 
267 };
268 
269 /**	Number of elements in itadmin_mysql_cn_patch.
270 */
271 static size_t const	itadmin_mysql_sz_cn_patch =
272 sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1;
273 
274 
275 /**	Elements from netgroup table.
276 */
277 static char const * const       itadmin_mysql_cn_netgroup[] = {
278 /* 0 */
279 "ng_s",
280 
281 /* 1 */
282 "ng_l",
283 
284 NULL
285 
286 };
287 
288 /**	Number of elements in itadmin_mysql_cn_netgroup.
289 */
290 static size_t const	itadmin_mysql_sz_cn_netgroup =
291 sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1;
292 
293 
294 /**	Elements from dhcp_option table.
295 */
296 static char const * const       itadmin_mysql_cn_dhcp_option[] = {
297 /* 0 */
298 "do_pk",
299 
300 /* 1 */
301 "do_sc",
302 
303 /* 2 */
304 "do_sn",
305 
306 /* 3 */
307 "do_n",
308 
309 /* 4 */
310 "do_v",
311 
312 NULL
313 
314 };
315 
316 /**	Number of elements in itadmin_mysql_cn_dhcp_option.
317 */
318 static size_t const	itadmin_mysql_sz_cn_dhcp_option =
319 sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1;
320 
321 
322 /**	Elements from swman table.
323 */
324 static char const * const       itadmin_mysql_cn_swman[] = {
325 /* 0 */
326 "sm_s",
327 
328 /* 1 */
329 "sm_l",
330 
331 NULL
332 
333 };
334 
335 /**	Number of elements in itadmin_mysql_cn_swman.
336 */
337 static size_t const	itadmin_mysql_sz_cn_swman =
338 sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1;
339 
340 
341 /**	Elements from swprod table.
342 */
343 static char const * const       itadmin_mysql_cn_swprod[] = {
344 /* 0 */
345 "sw_s",
346 
347 /* 1 */
348 "sw_l",
349 
350 /* 2 */
351 "sm_s",
352 
353 NULL
354 
355 };
356 
357 /**	Number of elements in itadmin_mysql_cn_swprod.
358 */
359 static size_t const	itadmin_mysql_sz_cn_swprod =
360 sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1;
361 
362 
363 /**	Elements from lictype table.
364 */
365 static char const * const       itadmin_mysql_cn_lictype[] = {
366 /* 0 */
367 "lt_s",
368 
369 /* 1 */
370 "lt_l",
371 
372 /* 2 */
373 "lt_i",
374 
375 NULL
376 
377 };
378 
379 /**	Number of elements in itadmin_mysql_cn_lictype.
380 */
381 static size_t const	itadmin_mysql_sz_cn_lictype =
382 sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1;
383 
384 
385 /**	Elements from license table.
386 */
387 static char const * const       itadmin_mysql_cn_license[] = {
388 /* 0 */
389 "li_pk",
390 
391 /* 1 */
392 "li_on",
393 
394 /* 2 */
395 "sw_s",
396 
397 /* 3 */
398 "us_s",
399 
400 /* 4 */
401 "co_s",
402 
403 /* 5 */
404 "lt_s",
405 
406 /* 6 */
407 "li_no",
408 
409 /* 7 */
410 "sr_s",
411 
412 /* 8 */
413 "li_dd",
414 
415 /* 9 */
416 "li_nd",
417 
418 /* 10 */
419 "li_di",
420 
421 /* 11 */
422 "li_ni",
423 
424 NULL
425 
426 };
427 
428 /**	Number of elements in itadmin_mysql_cn_license.
429 */
430 static size_t const	itadmin_mysql_sz_cn_license =
431 sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1;
432 
433 
434 /**	Elements from ngdep table.
435 */
436 static char const * const       itadmin_mysql_cn_ngdep[] = {
437 /* 0 */
438 "nd_p",
439 
440 /* 1 */
441 "nd_c",
442 
443 NULL
444 
445 };
446 
447 /**	Number of elements in itadmin_mysql_cn_ngdep.
448 */
449 static size_t const	itadmin_mysql_sz_cn_ngdep =
450 sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1;
451 
452 
453 /**	Elements from hosts table.
454 */
455 static char const * const       itadmin_mysql_cn_hosts[] = {
456 /* 0 */
457 "co_s",
458 
459 /* 1 */
460 "us_s",
461 
462 /* 2 */
463 "co_ip",
464 
465 /* 3 */
466 "co_mc",
467 
468 /* 4 */
469 "ng_s",
470 
471 /* 5 */
472 "co_co",
473 
474 /* 6 */
475 "dc_s",
476 
477 /* 7 */
478 "dg_s",
479 
480 /* 8 */
481 "dd_n",
482 
483 /* 9 */
484 "gb_s",
485 
486 /* 10 */
487 "co_r",
488 
489 /* 11 */
490 "co_in",
491 
492 /* 12 */
493 "co_sn",
494 
495 /* 13 */
496 "co_dd",
497 
498 /* 14 */
499 "co_ff",
500 
501 /* 15 */
502 "co_gu",
503 
504 /* 16 */
505 "co_hi",
506 
507 /* 17 */
508 "co_ex",
509 
510 /* 18 */
511 "co_nn",
512 
513 /* 19 */
514 "co_na",
515 
516 NULL
517 
518 };
519 
520 /**	Number of elements in itadmin_mysql_cn_hosts.
521 */
522 static size_t const	itadmin_mysql_sz_cn_hosts =
523 sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1;
524 
525 
526 /**	Elements from network table.
527 */
528 static char const * const       itadmin_mysql_cn_network[] = {
529 /* 0 */
530 "nw_ip",
531 
532 /* 1 */
533 "nw_ma",
534 
535 /* 2 */
536 "nw_gw",
537 
538 /* 3 */
539 "nw_bc",
540 
541 /* 4 */
542 "vl_s",
543 
544 NULL
545 
546 };
547 
548 /**	Number of elements in itadmin_mysql_cn_network.
549 */
550 static size_t const	itadmin_mysql_sz_cn_network =
551 sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1;
552 
553 
554 /**	Elements from dhcp_class table.
555 */
556 static char const * const       itadmin_mysql_cn_dhcp_class[] = {
557 /* 0 */
558 "dc_s",
559 
560 /* 1 */
561 "dc_d",
562 
563 NULL
564 
565 };
566 
567 /**	Number of elements in itadmin_mysql_cn_dhcp_class.
568 */
569 static size_t const	itadmin_mysql_sz_cn_dhcp_class =
570 sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1;
571 
572 
573 /**	Elements from dhcp_group table.
574 */
575 static char const * const       itadmin_mysql_cn_dhcp_group[] = {
576 /* 0 */
577 "dg_s",
578 
579 /* 1 */
580 "dg_l",
581 
582 NULL
583 
584 };
585 
586 /**	Number of elements in itadmin_mysql_cn_dhcp_group.
587 */
588 static size_t const	itadmin_mysql_sz_cn_dhcp_group =
589 sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1;
590 
591 
592 /**	Elements from dhcp_pool table.
593 */
594 static char const * const       itadmin_mysql_cn_dhcp_pool[] = {
595 /* 0 */
596 "dp_st",
597 
598 /* 1 */
599 "dp_en",
600 
601 /* 2 */
602 "nw_ip",
603 
604 /* 3 */
605 "dp_al",
606 
607 /* 4 */
608 "dp_dn",
609 
610 /* 5 */
611 "dc_s",
612 
613 NULL
614 
615 };
616 
617 /**	Number of elements in itadmin_mysql_cn_dhcp_pool.
618 */
619 static size_t const	itadmin_mysql_sz_cn_dhcp_pool =
620 sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1;
621 
622 
623 /**	Elements from alias table.
624 */
625 static char const * const       itadmin_mysql_cn_alias[] = {
626 /* 0 */
627 "al_s",
628 
629 /* 1 */
630 "co_s",
631 
632 NULL
633 
634 };
635 
636 /**	Number of elements in itadmin_mysql_cn_alias.
637 */
638 static size_t const	itadmin_mysql_sz_cn_alias =
639 sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1;
640 
641 
642 #if VERSION_BEFORE_20120208
643 /**	Obtain int value from string.
644 	@param	job	Job structure.
645 	@param	ptr	String to convert.
646 	@param	lgt	Length of string.
647 	@param	def	Default value to use if conversion fails.
648 	@return	The value or the default value.
649 */
650 static
651 int
itadmin_mysql_read_int(itadmin_job * job,char const * ptr,size_t lgt,int def)652 itadmin_mysql_read_int(itadmin_job *job, char const *ptr, size_t lgt, int def)
653 {
654   int		back;
655   int		i;
656 
657   back = def;
658   if(ptr) {
659     if(lgt) {
660       if(sscanf(ptr, "%d", &i) == 1) {
661         back = i;
662       }
663     }
664   }
665   return back;
666 }
667 #else
668 /**	Obtain int value from string.
669 	@param	ptr	String to convert.
670 	@param	lgts	Lengths of strings.
671 	@param	cnind	Column name indices.
672 	@param	ind	Current index to use.
673 	@param	def	Default value to use if conversion fails.
674 	@return	The value or the default value.
675 */
676 static
677 int
itadmin_mysql_read_int(char const * ptr,unsigned long * lgts,size_t * cnind,size_t ind,int def)678 itadmin_mysql_read_int(
679   char const 		*ptr,
680   unsigned long		*lgts,
681   size_t		*cnind,
682   size_t		 ind,
683   int			 def
684 )
685 {
686   int		back;
687   int		i;
688 
689   back = def;
690   if(ptr) {
691     if(cnind[ind] != 0xFFFFU) {
692       if(lgts[cnind[ind]]) {
693         if(sscanf(ptr, "%d", &i) == 1) {
694 	  back = i;
695 	}
696       }
697     }
698   }
699   return back;
700 }
701 #endif
702 
703 
704 /**	Find column name indices.
705 	For column names not found the program sets the index
706 	to 0xFFFFU.
707 	@param	cnind		Destination array for indices.
708 	@param	sz_cnind	Size of @a cnind.
709 	@param	nf		Number of fields in query result.
710 	@param	mr		Query result.
711 	@param	colnames	Column names.
712 */
713 static
714 void
itadmin_data_mysql_find_indices(size_t * cnind,size_t sz_cnind,size_t nf,MYSQL_RES * mr,char const * const * colnames)715 itadmin_data_mysql_find_indices(
716   size_t		*cnind,
717   size_t		 sz_cnind,
718   size_t		 nf,
719   MYSQL_RES		*mr,
720   char const * const	*colnames
721 )
722 {
723   MYSQL_FIELD	*field;
724   size_t	 i;
725   int		 ai;
726   for(i = 0; i < sz_cnind; i++) { cnind[i] = 0xFFFFU; }
727   for(i = 0; i < nf; i++) {
728     /*
729     	nf is retrieved as unsigned from a MySQL function,
730 	so conversion back to unsigned is ok.
731     */
732     field = mysql_fetch_field_direct(mr, (unsigned int)i);
733     if(field) {
734       if(field->name) {
735         ai = dk3str_c8_array_index(colnames, field->name, 0);
736 	if(ai >= 0) {
737 	  if(((size_t)ai) < sz_cnind) {
738 	    cnind[(size_t)ai] = i;
739 	  }
740 	}
741       }
742     }
743   }
744 }
745 
746 
747 
748 /**	Set value pointers.
749 	@param	val		Value pointers array.
750 	@param	cnind		Index array.
751 	@param	sz_cnind	Size of @a val and @a cnind.
752 	@param	nf		Number of fields in @a mrow.
753 	@param	mrow		One result row.
754 	@param	lgts		Array of string lengths for row.
755 */
756 static
757 void
itadmin_data_mysql_set_pointers(char const ** val,size_t * cnind,size_t sz_cnind,size_t nf,MYSQL_ROW mrow,unsigned long * lgts)758 itadmin_data_mysql_set_pointers(
759   char const * 		*val,
760   size_t		*cnind,
761   size_t		 sz_cnind,
762   size_t		 nf,
763   MYSQL_ROW		 mrow,
764   unsigned long		*lgts
765 )
766 {
767   size_t		 i;
768   size_t		 j;
769   for(i = 0; i < sz_cnind; i++) {
770     val[i] = NULL;
771     if(cnind[i] != 0xFFFFU) {
772       j = cnind[i];
773       if(j < nf) {
774         if(lgts[j]) {
775           if(mrow[j]) {
776             val[i] = mrow[j];
777           }
778 	}
779       }
780     }
781   }
782 }
783 
784 
785 
786 /**	Read aliases table.
787 	@param	job	Job structure.
788 	@return	1 on success, 0 on error.
789 */
790 static
791 int
itadmin_data_mysql_alias(itadmin_job * job)792 itadmin_data_mysql_alias(itadmin_job *job)
793 {
794   MYSQL_RES	*mr;		/* Results set. */
795   MYSQL_ROW	 mrow;		/* One result row. */
796   char const	*val[sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1];
797   size_t	 cnind[sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1];
798   unsigned long	*lgts;		/* Field lengths. */
799   unsigned int	 nf;		/* Number of fields in result. */
800   int		 res;		/* Query result. */
801   int		 back	= 0;
802 
803   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[12]);
804   if(0 == res) {
805     mr = mysql_use_result((MYSQL *)(job->dbptr));
806     if(mr) {
807       nf = mysql_num_fields(mr);
808       itadmin_data_mysql_find_indices(
809         cnind, itadmin_mysql_sz_cn_alias, nf, mr,
810 	itadmin_mysql_cn_alias
811       );
812       back = 1;
813       do {
814         mrow = mysql_fetch_row(mr);
815 	if(mrow) {
816 	  lgts = mysql_fetch_lengths(mr);
817 	  if(lgts) {
818 	    itadmin_data_mysql_set_pointers(
819 	      val, cnind, itadmin_mysql_sz_cn_alias,
820 	      nf, mrow, lgts
821 	    );
822 	    res = itadmin_register_alias(
823 	      job,
824 	      val[0], val[1]
825 	    );
826 	    if(!(res)) { back = 0; }
827 	  } else {
828 	    back = 0;
829 	  }
830 	}
831       } while(mrow);
832       mysql_free_result(mr);
833     } else {
834       /* ERROR: Failed to obtain results list */
835       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
836     }
837   } else {
838     /* ERROR: Query failed! */
839     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
840   }
841 
842   return back;
843 }
844 
845 
846 
847 /**	Read DHCP pool table.
848 	@param	job	Job structure.
849 	@return	1 on success, 0 on error.
850 */
851 static
852 int
itadmin_data_mysql_dhcp_pool(itadmin_job * job)853 itadmin_data_mysql_dhcp_pool(itadmin_job *job)
854 {
855   MYSQL_RES	*mr;		/* Results set. */
856   MYSQL_ROW	 mrow;		/* One result row. */
857   char const	*val[sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1];
858   size_t	 cnind[sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1];
859   unsigned long	*lgts;		/* Field lengths. */
860   unsigned int	 nf;		/* Number of fields in result. */
861   int		 res;		/* Query result. */
862   int		 back	= 0;
863 
864   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[10]);
865   if(0 == res) {
866     mr = mysql_use_result((MYSQL *)(job->dbptr));
867     if(mr) {
868       nf = mysql_num_fields(mr);
869       itadmin_data_mysql_find_indices(
870         cnind, itadmin_mysql_sz_cn_dhcp_pool, nf, mr,
871 	itadmin_mysql_cn_dhcp_pool
872       );
873       back = 1;
874       do {
875         mrow = mysql_fetch_row(mr);
876 	if(mrow) {
877 	  lgts = mysql_fetch_lengths(mr);
878 	  if(lgts) {
879 	    itadmin_data_mysql_set_pointers(
880 	      val, cnind, itadmin_mysql_sz_cn_dhcp_pool,
881 	      nf, mrow, lgts
882 	    );
883 	    res = itadmin_register_dhcp_pool(
884 	      job,
885 	      val[0], val[1], val[2],
886 #if VERSION_BEFORE_20120208
887 	      itadmin_mysql_read_int(val[3], lgts[cnind[3]], 0),
888 	      itadmin_mysql_read_int(val[4], lgts[cnind[4]], 0),
889 #else
890 	      itadmin_mysql_read_int(val[3], lgts, cnind, 3, 0),
891 	      itadmin_mysql_read_int(val[4], lgts, cnind, 4, 0),
892 #endif
893 	      val[5]
894 	    );
895 	    if(!(res)) { back = 0; }
896 	  } else {
897 	    back = 0;
898 	  }
899 	}
900       } while(mrow);
901 
902       mysql_free_result(mr);
903     } else {
904       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
905     }
906   } else {
907     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
908   }
909 
910   return back;
911 }
912 
913 
914 /**	Read DHCP group table.
915 	@param	job	Job structure.
916 	@return	1 on success, 0 on error.
917 */
918 static
919 int
itadmin_data_mysql_dhcp_group(itadmin_job * job)920 itadmin_data_mysql_dhcp_group(itadmin_job *job)
921 {
922   MYSQL_RES	*mr;		/* Results set. */
923   MYSQL_ROW	 mrow;		/* One result row. */
924   char const	*val[sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1];
925   size_t	 cnind[sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1];
926   unsigned long	*lgts;		/* Field lengths. */
927   unsigned int	 nf;		/* Number of fields in result. */
928   int		 res;		/* Query result. */
929   int		 back	= 0;
930 
931   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[9]);
932   if(0 == res) {
933     mr = mysql_use_result((MYSQL *)(job->dbptr));
934     if(mr) {
935       nf = mysql_num_fields(mr);
936       itadmin_data_mysql_find_indices(
937         cnind, itadmin_mysql_sz_cn_dhcp_group, nf, mr,
938 	itadmin_mysql_cn_dhcp_group
939       );
940       back = 1;
941       do {
942         mrow = mysql_fetch_row(mr);
943 	if(mrow) {
944 	  lgts = mysql_fetch_lengths(mr);
945 	  if(lgts) {
946 	    itadmin_data_mysql_set_pointers(
947 	      val, cnind, itadmin_mysql_sz_cn_dhcp_group,
948 	      nf, mrow, lgts
949 	    );
950 	    res = itadmin_register_dhcp_group(job, val[0], val[1]);
951 	    if(!(res)) { back = 0; }
952 	  } else {
953 	    back = 0;
954 	  }
955 	}
956       } while(mrow);
957       mysql_free_result(mr);
958     } else {
959       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
960     }
961   } else {
962     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
963   }
964 
965   return back;
966 }
967 
968 
969 
970 /**	Read DHCP class table.
971 	@param	job	Job structure.
972 	@return	1 on success, 0 on error.
973 */
974 static
975 int
itadmin_data_mysql_dhcp_class(itadmin_job * job)976 itadmin_data_mysql_dhcp_class(itadmin_job *job)
977 {
978   MYSQL_RES	*mr;		/* Results set. */
979   MYSQL_ROW	 mrow;		/* One result row. */
980   char const	*val[sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1];
981   size_t	 cnind[sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1];
982   unsigned long	*lgts;		/* Field lengths. */
983   unsigned int	 nf;		/* Number of fields in result. */
984   int		 res;		/* Query result. */
985   int		 back	= 0;
986 
987   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[8]);
988   if(0 == res) {
989     mr = mysql_use_result((MYSQL *)(job->dbptr));
990     if(mr) {
991       nf = mysql_num_fields(mr);
992       itadmin_data_mysql_find_indices(
993         cnind, itadmin_mysql_sz_cn_dhcp_class, nf, mr,
994 	itadmin_mysql_cn_dhcp_class
995       );
996       back = 1;
997       do {
998         mrow = mysql_fetch_row(mr);
999 	if(mrow) {
1000 	  lgts = mysql_fetch_lengths(mr);
1001 	  if(lgts) {
1002 	    itadmin_data_mysql_set_pointers(
1003 	      val, cnind, itadmin_mysql_sz_cn_dhcp_class,
1004 	      nf, mrow, lgts
1005 	    );
1006 	    res = itadmin_register_dhcp_class(job, val[0], val[1]);
1007 	    if(!(res)) { back = 0; }
1008 	  } else {
1009 	    back = 0;
1010 	  }
1011 	}
1012       } while(mrow);
1013       mysql_free_result(mr);
1014     } else {
1015       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1016     }
1017   } else {
1018     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1019   }
1020 
1021   return back;
1022 }
1023 
1024 
1025 
1026 /**	Read networks table.
1027 	@param	job	Job structure.
1028 	@return	1 on success, 0 on error.
1029 */
1030 static
1031 int
itadmin_data_mysql_network(itadmin_job * job)1032 itadmin_data_mysql_network(itadmin_job *job)
1033 {
1034   MYSQL_RES	*mr;		/* Results set. */
1035   MYSQL_ROW	 mrow;		/* One result row. */
1036   char const	*val[sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1];
1037   size_t	 cnind[sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1];
1038   unsigned long	*lgts;		/* Field lengths. */
1039   unsigned int	 nf;		/* Number of fields in result. */
1040   int		 res;		/* Query result. */
1041   int		 back	= 0;
1042 
1043   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[5]);
1044   if(0 == res) {
1045     mr = mysql_use_result((MYSQL *)(job->dbptr));
1046     if(mr) {
1047       nf = mysql_num_fields(mr);
1048       itadmin_data_mysql_find_indices(
1049         cnind, itadmin_mysql_sz_cn_network, nf, mr,
1050 	itadmin_mysql_cn_network
1051       );
1052       back = 1;
1053       do {
1054         mrow = mysql_fetch_row(mr);
1055 	if(mrow) {
1056 	  lgts = mysql_fetch_lengths(mr);
1057 	  if(lgts) {
1058 	    itadmin_data_mysql_set_pointers(
1059 	      val, cnind, itadmin_mysql_sz_cn_network,
1060 	      nf, mrow, lgts
1061 	    );
1062 	    res = itadmin_register_network(
1063 	      job, val[0], val[1], val[2], val[3], val[4]
1064 	    );
1065 	    if(!(res)) { back = 0; }
1066 	  } else {
1067 	    back = 0;
1068 	  }
1069 	}
1070       } while(mrow);
1071       mysql_free_result(mr);
1072     } else {
1073       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1074     }
1075   } else {
1076     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1077   }
1078 
1079   return back;
1080 }
1081 
1082 
1083 
1084 /**	Read hosts table.
1085 	@param	job	Job structure.
1086 	@return	1 on success, 0 on error.
1087 */
1088 static
1089 int
itadmin_data_mysql_hosts(itadmin_job * job)1090 itadmin_data_mysql_hosts(itadmin_job *job)
1091 {
1092   itadmin_date	 expi;		/* Expiration date for host entry. */
1093   MYSQL_RES	*mr;		/* Results set. */
1094   MYSQL_ROW	 mrow;		/* One result row. */
1095   char const	*val[sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1];
1096   size_t	 cnind[sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1];
1097   unsigned long	*lgts;		/* Field lengths. */
1098   unsigned int	 nf;		/* Number of fields in result. */
1099   int		 res;		/* Query result. */
1100   int		 hexpi;		/* Flag: Have expiration date. */
1101   int		 flag_first;	/* Flag: Write FQDN to /etc/hosts first. */
1102   int		 flag_guest;	/* Flag: Guest computer. */
1103   int		 flag_no_net_docu;	/* Flag: Skip host in docu. */
1104   int		 flag_no_arpwatch;	/* Flag: Skip host for arpwatch. */
1105   int		 back	= 0;
1106 
1107   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[11]);
1108   if(0 == res) {
1109     mr = mysql_use_result((MYSQL *)(job->dbptr));
1110     if(mr) {
1111       nf = mysql_num_fields(mr);
1112       itadmin_data_mysql_find_indices(
1113         cnind, itadmin_mysql_sz_cn_hosts, nf, mr,
1114 	itadmin_mysql_cn_hosts
1115       );
1116       back = 1;
1117       do {
1118         mrow = mysql_fetch_row(mr);
1119 	if(mrow) {
1120 	  lgts = mysql_fetch_lengths(mr);
1121 	  if(lgts) {
1122 	    itadmin_data_mysql_set_pointers(
1123 	      val, cnind, itadmin_mysql_sz_cn_hosts,
1124 	      nf, mrow, lgts
1125 	    );
1126 	    flag_first =
1127 	    itadmin_mysql_read_int(val[14], lgts, cnind, 14, 0);
1128 	    flag_guest =
1129 	    itadmin_mysql_read_int(val[15], lgts, cnind, 15, 0);
1130 	    flag_no_net_docu =
1131 	    itadmin_mysql_read_int(val[18], lgts, cnind, 18, 0);
1132 	    flag_no_arpwatch =
1133 	    itadmin_mysql_read_int(val[19], lgts, cnind, 19, 0);
1134 	    itadmin_mem_date_init(&expi);
1135 	    hexpi = 0;
1136 	    if(val[17]) {
1137 	      if(cnind[17] != 0xFFFFU) {
1138 	        if(lgts[cnind[17]]) {
1139 		  if(itadmin_tool_convert_date(job, &expi, val[17])) {
1140 		    hexpi = 1;
1141 		  } else {
1142 		  }
1143 		} else {
1144 		}
1145 	      } else {
1146 	      }
1147 	    } else {
1148 	    }
1149 	    res = itadmin_register_host(
1150 	      job, val[0], val[1], val[2], val[3], val[4], val[5], val[6],
1151 	      val[7], val[8], val[9], val[10], val[11], val[12], val[13],
1152 	      flag_first, flag_guest, val[16], ((hexpi) ? &expi : NULL),
1153 	      flag_no_net_docu, flag_no_arpwatch
1154 	    );
1155 	    if(!(res)) { back = 0; }
1156 	  } else {
1157 	    back = 0;
1158 	  }
1159 	}
1160       } while(mrow);
1161       mysql_free_result(mr);
1162     } else {
1163       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1164     }
1165   } else {
1166     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1167   }
1168 
1169   return back;
1170 }
1171 
1172 
1173 
1174 /**	Read ngdep table.
1175 	@param	job	Job structure.
1176 	@return	1 on success, 0 on error.
1177 */
1178 static
1179 int
itadmin_data_mysql_ngdep(itadmin_job * job)1180 itadmin_data_mysql_ngdep(itadmin_job *job)
1181 {
1182   MYSQL_RES	*mr;		/* Results set. */
1183   MYSQL_ROW	 mrow;		/* One result row. */
1184   char const	*val[sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1];
1185   size_t	 cnind[sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1];
1186   unsigned long	*lgts;		/* Field lengths. */
1187   unsigned int	 nf;		/* Number of fields in result. */
1188   int		 res;		/* Query result. */
1189   int		 back	= 0;
1190 
1191   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[7]);
1192   if(0 == res) {
1193     mr = mysql_use_result((MYSQL *)(job->dbptr));
1194     if(mr) {
1195       nf = mysql_num_fields(mr);
1196       itadmin_data_mysql_find_indices(
1197         cnind, itadmin_mysql_sz_cn_ngdep, nf, mr,
1198 	itadmin_mysql_cn_ngdep
1199       );
1200       back = 1;
1201       do {
1202         mrow = mysql_fetch_row(mr);
1203 	if(mrow) {
1204 	  lgts = mysql_fetch_lengths(mr);
1205 	  if(lgts) {
1206 	    itadmin_data_mysql_set_pointers(
1207 	      val, cnind, itadmin_mysql_sz_cn_ngdep,
1208 	      nf, mrow, lgts
1209 	    );
1210 	    res = itadmin_register_ngdep(job, val[0], val[1]);
1211 	    if(!(res)) { back = 0; }
1212 	  } else {
1213 	    back = 0;
1214 	  }
1215 	}
1216       } while(mrow);
1217       mysql_free_result(mr);
1218     } else {
1219       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1220     }
1221   } else {
1222     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1223   }
1224 
1225   return back;
1226 }
1227 
1228 
1229 
1230 /**	Read license types table.
1231 	@param	job	Job structure.
1232 	@return	1 on success, 0 on error.
1233 */
1234 static
1235 int
itadmin_data_mysql_license(itadmin_job * job)1236 itadmin_data_mysql_license(itadmin_job *job)
1237 {
1238   char		 lnbuffer[128];	/* Line number buffer. */
1239   MYSQL_RES	*mr;		/* Results set. */
1240   MYSQL_ROW	 mrow;		/* One result row. */
1241   itadmin_date	 dd;		/* Delivery date. */
1242   itadmin_date	 di;		/* Invoice date. */
1243   char const	*val[sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1];
1244   size_t	 cnind[sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1];
1245   unsigned long	*lgts;		/* Field lengths. */
1246   unsigned long	 pk;		/* Primary key. */
1247   unsigned long	 lineno;	/* Record number. */
1248   unsigned int	 nf;		/* Number of fields in result. */
1249   int		 res;		/* Query result. */
1250   int		 back	= 0;
1251 
1252   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[17]);
1253   if(0 == res) {
1254     mr = mysql_use_result((MYSQL *)(job->dbptr));
1255     if(mr) {
1256       nf = mysql_num_fields(mr);
1257       itadmin_data_mysql_find_indices(
1258         cnind, itadmin_mysql_sz_cn_license, nf, mr,
1259 	itadmin_mysql_cn_license
1260       );
1261       back = 1;
1262       lineno = 0UL;
1263       do {
1264         mrow = mysql_fetch_row(mr);
1265 	if(mrow) {
1266 	  lgts = mysql_fetch_lengths(mr);
1267 	  if(lgts) {
1268 	    itadmin_data_mysql_set_pointers(
1269 	      val, cnind, itadmin_mysql_sz_cn_license,
1270 	      nf, mrow, lgts
1271 	    );
1272 	    /*
1273 	    res = itadmin_register_license(
1274 	      job, val[0], val[1], licno
1275 	    );
1276 	    if(!(res)) { back = 0; }
1277 	    */
1278 	    if(val[0]) {
1279 	      if(sscanf(val[0], "%lu", &pk) == 1) {
1280 		if(val[8]) {
1281 		  if(cnind[8] != 0xFFFFU) {
1282 		    if(lgts[cnind[8]]) {
1283 		      itadmin_tool_convert_date(job, &dd, val[8]);
1284 		    }
1285 		  }
1286 		}
1287 		if(val[10]) {
1288 		  if(cnind[10] != 0xFFFFU) {
1289 		    if(lgts[cnind[10]]) {
1290 		      itadmin_tool_convert_date(job, &di, val[10]);
1291 		    }
1292 		  }
1293 		}
1294 		res = itadmin_register_license(
1295 		  job,
1296 		  pk,
1297 		  val[1],	/* li_on	*/
1298 		  val[2],	/* sw_s		*/
1299 		  val[3],	/* us_s		*/
1300 		  val[4],	/* co_s		*/
1301 		  val[5],	/* lt_s		*/
1302 		  val[6],	/* li_no	*/
1303 		  val[9],	/* li_nd	*/
1304 		  val[11]	/* li_ni	*/
1305 		);
1306 		if(!(res)) { back = 0; }
1307 	      } else {
1308 	        /* ERROR: Primary key not numeric! */
1309 		sprintf(lnbuffer, "%lu", lineno);
1310 		itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 143, 144, lnbuffer);
1311 	      }
1312 	    } else {
1313 	      /* ERROR: No primary key */
1314 	      sprintf(lnbuffer, "%lu", lineno);
1315 	      itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 143, 145, lnbuffer);
1316 	    }
1317 	  } else {
1318 	    back = 0;
1319 	  }
1320 	}
1321 	lineno++;
1322       } while(mrow);
1323       mysql_free_result(mr);
1324     } else {
1325       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1326     }
1327   } else {
1328     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1329   }
1330 
1331   return back;
1332 }
1333 
1334 
1335 
1336 /**	Read license types table.
1337 	@param	job	Job structure.
1338 	@return	1 on success, 0 on error.
1339 */
1340 static
1341 int
itadmin_data_mysql_lictype(itadmin_job * job)1342 itadmin_data_mysql_lictype(itadmin_job *job)
1343 {
1344   MYSQL_RES	*mr;		/* Results set. */
1345   MYSQL_ROW	 mrow;		/* One result row. */
1346   char const	*val[sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1];
1347   size_t	 cnind[sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1];
1348   unsigned long	*lgts;		/* Field lengths. */
1349   unsigned int	 nf;		/* Number of fields in result. */
1350   int		 res;		/* Query result. */
1351   int		 licno;		/* Number of licenses. */
1352   int		 back	= 0;
1353 
1354   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[16]);
1355   if(0 == res) {
1356     mr = mysql_use_result((MYSQL *)(job->dbptr));
1357     if(mr) {
1358       nf = mysql_num_fields(mr);
1359       itadmin_data_mysql_find_indices(
1360         cnind, itadmin_mysql_sz_cn_lictype, nf, mr,
1361 	itadmin_mysql_cn_lictype
1362       );
1363       back = 1;
1364       do {
1365         mrow = mysql_fetch_row(mr);
1366 	if(mrow) {
1367 	  lgts = mysql_fetch_lengths(mr);
1368 	  if(lgts) {
1369 	    itadmin_data_mysql_set_pointers(
1370 	      val, cnind, itadmin_mysql_sz_cn_lictype,
1371 	      nf, mrow, lgts
1372 	    );
1373 	    licno = 1;
1374 	    if(val[2]) {
1375 	      char const	*s;
1376 	      int		 i;
1377 	      s = dk3str_c8_start(val[2], NULL);
1378 	      if(s) {
1379 	        if(sscanf(s, "%d", &i) == 1) {
1380 		  licno = i;
1381 		} else {
1382 		  /* ERROR: Not a number! */
1383 		  itadmin_tool_log_utf8_5(
1384 		    job, DK3_LL_ERROR, 146, 147, 148, val[0], s
1385 		  );
1386 		}
1387 	      }
1388 	    }
1389 	    res = itadmin_register_lictype(
1390 	      job, val[0], val[1], licno
1391 	    );
1392 	    if(!(res)) { back = 0; }
1393 	  } else {
1394 	    back = 0;
1395 	  }
1396 	}
1397       } while(mrow);
1398       mysql_free_result(mr);
1399     } else {
1400       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1401     }
1402   } else {
1403     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1404   }
1405 
1406   return back;
1407 }
1408 
1409 
1410 
1411 /**	Read software products table.
1412 	@param	job	Job structure.
1413 	@return	1 on success, 0 on error.
1414 */
1415 static
1416 int
itadmin_data_mysql_swprod(itadmin_job * job)1417 itadmin_data_mysql_swprod(itadmin_job *job)
1418 {
1419   MYSQL_RES	*mr;		/* Results set. */
1420   MYSQL_ROW	 mrow;		/* One result row. */
1421   char const	*val[sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1];
1422   size_t	 cnind[sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1];
1423   unsigned long	*lgts;		/* Field lengths. */
1424   unsigned int	 nf;		/* Number of fields in result. */
1425   int		 res;		/* Query result. */
1426   int		 back	= 0;
1427 
1428   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[15]);
1429   if(0 == res) {
1430     mr = mysql_use_result((MYSQL *)(job->dbptr));
1431     if(mr) {
1432       nf = mysql_num_fields(mr);
1433       itadmin_data_mysql_find_indices(
1434         cnind, itadmin_mysql_sz_cn_swprod, nf, mr,
1435 	itadmin_mysql_cn_swprod
1436       );
1437       back = 1;
1438       do {
1439         mrow = mysql_fetch_row(mr);
1440 	if(mrow) {
1441 	  lgts = mysql_fetch_lengths(mr);
1442 	  if(lgts) {
1443 	    itadmin_data_mysql_set_pointers(
1444 	      val, cnind, itadmin_mysql_sz_cn_swprod,
1445 	      nf, mrow, lgts
1446 	    );
1447 	    res = itadmin_register_swprod(
1448 	      job, val[0], val[1], val[2]
1449 	    );
1450 	    if(!(res)) { back = 0; }
1451 	  } else {
1452 	    back = 0;
1453 	  }
1454 	}
1455       } while(mrow);
1456       mysql_free_result(mr);
1457     } else {
1458       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1459     }
1460   } else {
1461     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1462   }
1463 
1464   return back;
1465 }
1466 
1467 
1468 
1469 /**	Read swman table.
1470 	@param	job	Job structure.
1471 	@return	1 on success, 0 on error.
1472 */
1473 static
1474 int
itadmin_data_mysql_swman(itadmin_job * job)1475 itadmin_data_mysql_swman(itadmin_job *job)
1476 {
1477   char		 lnbuffer[128];	/* Buffer for record number. */
1478   unsigned long	 lineno;	/* Record number. */
1479   MYSQL_RES	*mr;		/* Results set. */
1480   MYSQL_ROW	 mrow;		/* One result row. */
1481   char const	*val[sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1];
1482   size_t	 cnind[sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1];
1483   unsigned long	*lgts;		/* Field lengths. */
1484 #if 0
1485   long		 pk;
1486 #endif
1487   unsigned int	 nf;		/* Number of fields in result. */
1488   int		 res;		/* Query result. */
1489   int		 back	= 0;
1490 
1491   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[14]);
1492   if(0 == res) {
1493     mr = mysql_use_result((MYSQL *)(job->dbptr));
1494     if(mr) {
1495       nf = mysql_num_fields(mr);
1496       itadmin_data_mysql_find_indices(
1497         cnind, itadmin_mysql_sz_cn_swman, nf, mr,
1498 	itadmin_mysql_cn_swman
1499       );
1500       back = 1;
1501       lineno = 0UL;
1502       do {
1503         mrow = mysql_fetch_row(mr);
1504 	if(mrow) {
1505 	  lgts = mysql_fetch_lengths(mr);
1506 	  if(lgts) {
1507 	    itadmin_data_mysql_set_pointers(
1508 	      val, cnind, itadmin_mysql_sz_cn_swman,
1509 	      nf, mrow, lgts
1510 	    );
1511 	    res = 0;
1512 	    if(val[0]) {
1513 	      res = itadmin_register_swman(
1514 	        job, val[0], val[1]
1515 	      );
1516 	    } else {
1517 	      /* ERROR: No pk pointer! */
1518 	      sprintf(lnbuffer, "%lu", lineno);
1519 	      itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 149, 150, lnbuffer);
1520 	    }
1521 	    if(!(res)) { back = 0; }
1522 	  } else {
1523 	    back = 0;
1524 	  }
1525 	}
1526 	lineno++;
1527       } while(mrow);
1528       mysql_free_result(mr);
1529     } else {
1530       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1531     }
1532   } else {
1533     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1534   }
1535 
1536   return back;
1537 }
1538 
1539 
1540 
1541 /**	Read dhcp_option table.
1542 	@param	job	Job structure.
1543 	@return	1 on success, 0 on error.
1544 */
1545 static
1546 int
itadmin_data_mysql_dhcp_option(itadmin_job * job)1547 itadmin_data_mysql_dhcp_option(itadmin_job *job)
1548 {
1549   char		 lnbuffer[128];	/* Record number buffer. */
1550   unsigned long	 lineno;	/* Record number. */
1551   MYSQL_RES	*mr;		/* Results set. */
1552   MYSQL_ROW	 mrow;		/* One result row. */
1553   char const	*val[sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1];
1554   size_t	 cnind[sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1];
1555   unsigned long	*lgts;		/* Field lengths. */
1556   long		 pk;
1557   unsigned int	 nf;		/* Number of fields in result. */
1558   int		 res;		/* Query result. */
1559   int		 back	= 0;
1560 
1561   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[13]);
1562   if(0 == res) {
1563     mr = mysql_use_result((MYSQL *)(job->dbptr));
1564     if(mr) {
1565       nf = mysql_num_fields(mr);
1566       itadmin_data_mysql_find_indices(
1567         cnind, itadmin_mysql_sz_cn_dhcp_option, nf, mr,
1568 	itadmin_mysql_cn_dhcp_option
1569       );
1570       back = 1;
1571       lineno = 0UL;
1572       do {
1573         mrow = mysql_fetch_row(mr);
1574 	if(mrow) {
1575 	  lgts = mysql_fetch_lengths(mr);
1576 	  if(lgts) {
1577 	    itadmin_data_mysql_set_pointers(
1578 	      val, cnind, itadmin_mysql_sz_cn_dhcp_option,
1579 	      nf, mrow, lgts
1580 	    );
1581 	    res = 0;
1582 	    if(val[0]) {
1583 	      if(sscanf(val[0], "%ld", &pk) == 1) {
1584 	        res = itadmin_register_dhcp_option(
1585 	          job, val[1], val[2], val[3], val[4], pk
1586 	        );
1587 	      } else {
1588 	        /* ERROR: pk not a number! */
1589 		sprintf(lnbuffer, "%lu", lineno);
1590 		itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 151, 152, lnbuffer);
1591 	      }
1592 	    } else {
1593 	      /* ERROR: No pk pointer! */
1594 	      sprintf(lnbuffer, "%lu", lineno);
1595 	      itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 151, 153, lnbuffer);
1596 	    }
1597 	    if(!(res)) { back = 0; }
1598 	  } else {
1599 	    back = 0;
1600 	  }
1601 	}
1602 	lineno++;
1603       } while(mrow);
1604       mysql_free_result(mr);
1605     } else {
1606       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1607     }
1608   } else {
1609     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1610   }
1611 
1612   return back;
1613 }
1614 
1615 
1616 
1617 /**	Read netgroup table.
1618 	@param	job	Job structure.
1619 	@return	1 on success, 0 on error.
1620 */
1621 static
1622 int
itadmin_data_mysql_netgroup(itadmin_job * job)1623 itadmin_data_mysql_netgroup(itadmin_job *job)
1624 {
1625   MYSQL_RES	*mr;		/* Results set. */
1626   MYSQL_ROW	 mrow;		/* One result row. */
1627   char const	*val[sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1];
1628   size_t	 cnind[sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1];
1629   unsigned long	*lgts;		/* Field lengths. */
1630   unsigned int	 nf;		/* Number of fields in result. */
1631   int		 res;		/* Query result. */
1632   int		 back	= 0;
1633 
1634   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[6]);
1635   if(0 == res) {
1636     mr = mysql_use_result((MYSQL *)(job->dbptr));
1637     if(mr) {
1638       nf = mysql_num_fields(mr);
1639       itadmin_data_mysql_find_indices(
1640         cnind, itadmin_mysql_sz_cn_netgroup, nf, mr,
1641 	itadmin_mysql_cn_netgroup
1642       );
1643       back = 1;
1644       do {
1645         mrow = mysql_fetch_row(mr);
1646 	if(mrow) {
1647 	  lgts = mysql_fetch_lengths(mr);
1648 	  if(lgts) {
1649 	    itadmin_data_mysql_set_pointers(
1650 	      val, cnind, itadmin_mysql_sz_cn_netgroup,
1651 	      nf, mrow, lgts
1652 	    );
1653 	    res = itadmin_register_netgroup(job, val[0], val[1]);
1654 	    if(!(res)) { back = 0; }
1655 	  } else {
1656 	    back = 0;
1657 	  }
1658 	}
1659       } while(mrow);
1660       mysql_free_result(mr);
1661     } else {
1662       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1663     }
1664   } else {
1665     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1666   }
1667 
1668   return back;
1669 }
1670 
1671 
1672 
1673 /**	Read patches table.
1674 	@param	job	Job structure.
1675 	@return	1 on success, 0 on error.
1676 */
1677 static
1678 int
itadmin_data_mysql_patch(itadmin_job * job)1679 itadmin_data_mysql_patch(itadmin_job *job)
1680 {
1681   MYSQL_RES	*mr;		/* Results set. */
1682   MYSQL_ROW	 mrow;		/* One result row. */
1683   char const	*val[sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1];
1684   size_t	 cnind[sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1];
1685   unsigned long	*lgts;		/* Field lengths. */
1686   unsigned int	 nf;		/* Number of fields in result. */
1687   int		 res;		/* Query result. */
1688   int		 back	= 0;
1689 
1690   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[3]);
1691   if(0 == res) {
1692     mr = mysql_use_result((MYSQL *)(job->dbptr));
1693     if(mr) {
1694       nf = mysql_num_fields(mr);
1695       itadmin_data_mysql_find_indices(
1696         cnind, itadmin_mysql_sz_cn_patch, nf, mr,
1697 	itadmin_mysql_cn_patch
1698       );
1699       back = 1;
1700       do {
1701         mrow = mysql_fetch_row(mr);
1702 	if(mrow) {
1703 	  lgts = mysql_fetch_lengths(mr);
1704 	  if(lgts) {
1705 	    itadmin_data_mysql_set_pointers(
1706 	      val, cnind, itadmin_mysql_sz_cn_patch,
1707 	      nf, mrow, lgts
1708 	    );
1709 	    res = itadmin_register_patch(
1710 	      job, val[0], val[1], val[2], val[3], val[4], val[5]
1711 	    );
1712 	    if(!(res)) { back = 0; }
1713 	  } else {
1714 	    back = 0;
1715 	  }
1716 	}
1717       } while(mrow);
1718       mysql_free_result(mr);
1719     } else {
1720       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1721     }
1722   } else {
1723     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1724   }
1725 
1726   return back;
1727 }
1728 
1729 
1730 
1731 /**	Read VLAN table.
1732 	@param	job	Job structure.
1733 	@return	1 on success, 0 on error.
1734 */
1735 static
1736 int
itadmin_data_mysql_vlan(itadmin_job * job)1737 itadmin_data_mysql_vlan(itadmin_job *job)
1738 {
1739   MYSQL_RES	*mr;		/* Results set. */
1740   MYSQL_ROW	 mrow;		/* One result row. */
1741   char const	*val[sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1];
1742   size_t	 cnind[sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1];
1743   unsigned long	*lgts;		/* Field lengths. */
1744   unsigned int	 nf;		/* Number of fields in result. */
1745   int		 res;		/* Query result. */
1746   int		 back	= 0;
1747 
1748   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[2]);
1749   if(0 == res) {
1750     mr = mysql_use_result((MYSQL *)(job->dbptr));
1751     if(mr) {
1752       nf = mysql_num_fields(mr);
1753       itadmin_data_mysql_find_indices(
1754         cnind, itadmin_mysql_sz_cn_vlan, nf, mr,
1755 	itadmin_mysql_cn_vlan
1756       );
1757       back = 1;
1758       do {
1759         mrow = mysql_fetch_row(mr);
1760 	if(mrow) {
1761 	  lgts = mysql_fetch_lengths(mr);
1762 	  if(lgts) {
1763 	    itadmin_data_mysql_set_pointers(
1764 	      val, cnind, itadmin_mysql_sz_cn_vlan,
1765 	      nf, mrow, lgts
1766 	    );
1767 	    res = itadmin_register_vlan(job, val[0], val[1]);
1768 	    if(!(res)) { back = 0; }
1769 	  } else {
1770 	    back = 0;
1771 	  }
1772 	}
1773       } while(mrow);
1774       mysql_free_result(mr);
1775     } else {
1776       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1777     }
1778   } else {
1779     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1780   }
1781 
1782   return back;
1783 }
1784 
1785 
1786 
1787 /**	Read speed table.
1788 	@param	job	Job structure.
1789 	@return	1 on success, 0 on error.
1790 */
1791 static
1792 int
itadmin_data_mysql_speed(itadmin_job * job)1793 itadmin_data_mysql_speed(itadmin_job *job)
1794 {
1795   MYSQL_RES	*mr;		/* Results set. */
1796   MYSQL_ROW	 mrow;		/* One result row. */
1797   char const	*val[sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1];
1798   size_t	 cnind[sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1];
1799   unsigned long	*lgts;		/* Field lengths. */
1800   unsigned int	 nf;		/* Number of fields in result. */
1801   int		 res;		/* Query result. */
1802   int		 back	= 0;
1803 
1804   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[4]);
1805   if(0 == res) {
1806     mr = mysql_use_result((MYSQL *)(job->dbptr));
1807     if(mr) {
1808       nf = mysql_num_fields(mr);
1809       itadmin_data_mysql_find_indices(
1810         cnind, itadmin_mysql_sz_cn_speed, nf, mr,
1811 	itadmin_mysql_cn_speed
1812       );
1813       back = 1;
1814       do {
1815         mrow = mysql_fetch_row(mr);
1816 	if(mrow) {
1817 	  lgts = mysql_fetch_lengths(mr);
1818 	  if(lgts) {
1819 	    itadmin_data_mysql_set_pointers(
1820 	      val, cnind, itadmin_mysql_sz_cn_speed,
1821 	      nf, mrow, lgts
1822 	    );
1823 	    res = itadmin_register_speed(job, val[0], val[1]);
1824 	    if(!(res)) { back = 0; }
1825 	  } else {
1826 	    back = 0;
1827 	  }
1828 	}
1829       } while(mrow);
1830       mysql_free_result(mr);
1831     } else {
1832       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1833     }
1834   } else {
1835     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1836   }
1837 
1838   return back;
1839 }
1840 
1841 
1842 
1843 /**	Read buildings table.
1844 	@param	job	Job structure.
1845 	@return	1 on success, 0 on error.
1846 */
1847 static
1848 int
itadmin_data_mysql_buildings(itadmin_job * job)1849 itadmin_data_mysql_buildings(itadmin_job *job)
1850 {
1851   MYSQL_RES	*mr;		/* Results set. */
1852   MYSQL_ROW	 mrow;		/* One result row. */
1853   char const	*val[sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1];
1854   size_t	 cnind[sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1];
1855   unsigned long	*lgts;		/* Field lengths. */
1856   unsigned int	 nf;		/* Number of fields in result. */
1857   int		 res;		/* Query result. */
1858   int		 back	= 0;
1859 
1860   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[1]);
1861   if(0 == res) {
1862     mr = mysql_use_result((MYSQL *)(job->dbptr));
1863     if(mr) {
1864       nf = mysql_num_fields(mr);
1865       itadmin_data_mysql_find_indices(
1866         cnind, itadmin_mysql_sz_cn_buildings, nf, mr,
1867 	itadmin_mysql_cn_buildings
1868       );
1869       back = 1;
1870       do {
1871         mrow = mysql_fetch_row(mr);
1872 	if(mrow) {
1873 	  lgts = mysql_fetch_lengths(mr);
1874 	  if(lgts) {
1875 	    itadmin_data_mysql_set_pointers(
1876 	      val, cnind, itadmin_mysql_sz_cn_buildings,
1877 	      nf, mrow, lgts
1878 	    );
1879 	    res = itadmin_register_building(
1880 	      job,
1881 	      val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]
1882 	    );
1883 	    if(!(res)) { back = 0; }
1884 	  } else {
1885 	    back = 0;
1886 	  }
1887 	}
1888       } while(mrow);
1889       mysql_free_result(mr);
1890     } else {
1891       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1892     }
1893   } else {
1894     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1895   }
1896 
1897   return back;
1898 }
1899 
1900 
1901 
1902 /**	Read users table.
1903 	@param	job	Job structure.
1904 	@return	1 on success, 0 on error.
1905 */
1906 static
1907 int
itadmin_data_mysql_users(itadmin_job * job)1908 itadmin_data_mysql_users(itadmin_job *job)
1909 {
1910   MYSQL_RES	*mr;		/* Results set. */
1911   MYSQL_ROW	 mrow;		/* One result row. */
1912   char const	*val[sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1];
1913   size_t	 cnind[sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1];
1914   unsigned long	*lgts;		/* Field lengths array. */
1915   unsigned int	 nf;		/* Number of fields in result. */
1916   int		 res;		/* Query result. */
1917   int		 back	= 0;
1918 
1919   res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[0]);
1920   if(0 == res) {
1921     mr = mysql_use_result((MYSQL *)(job->dbptr));
1922     if(mr) {
1923       nf = mysql_num_fields(mr);
1924       itadmin_data_mysql_find_indices(
1925         cnind, itadmin_mysql_sz_cn_users, nf, mr, itadmin_mysql_cn_users
1926       );
1927       back = 1;
1928       do {
1929         mrow = mysql_fetch_row(mr);
1930 	if(mrow) {
1931 	  lgts = mysql_fetch_lengths(mr);
1932 	  if(lgts) {
1933 	    itadmin_data_mysql_set_pointers(
1934 	      val, cnind, itadmin_mysql_sz_cn_users,
1935 	      nf, mrow, lgts
1936 	    );
1937 	    res = itadmin_register_user(
1938 	      job, val[0], val[1], val[2], val[3], val[4], val[5], val[6]
1939 	    );
1940 	    if(!(res)) {
1941 	      back = 0;
1942 	    }
1943 	  } else {
1944 	    back = 0;
1945 	  }
1946 	}
1947       } while(mrow);
1948       mysql_free_result(mr);
1949     } else {
1950       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1951     }
1952   } else {
1953     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1954   }
1955   return back;
1956 }
1957 
1958 
1959 
1960 
1961 /**	Retrieve data from a MySQL database.
1962 	@param	job	Job structure.
1963 	@return	1 on success, 0 on error.
1964 */
1965 static
1966 int
itadmin_data_mysql_retrieve(itadmin_job * job)1967 itadmin_data_mysql_retrieve(itadmin_job *job)
1968 {
1969   int			back	= 1;
1970 
1971   /* PROGRESS: Reading users table. */
1972   itadmin_tool_log_1(job, DK3_LL_PROGRESS, 87);
1973   if(!itadmin_data_mysql_users(job)) { back = 0; }
1974   /* PROGRESS: Reading buildings table. */
1975   itadmin_tool_log_1(job, DK3_LL_PROGRESS, 88);
1976   if(!itadmin_data_mysql_buildings(job)) { back = 0; }
1977   if(itadmin_job_do_network(job)) {
1978     /* PROGRESS: Reading connection speed type table. */
1979     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 89);
1980     if(!itadmin_data_mysql_speed(job)) { back = 0; }
1981     /* PROGRESS: Reading VLANS table. */
1982     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 90);
1983     if(!itadmin_data_mysql_vlan(job)) { back = 0; }
1984     /* PROGRESS: Reading ethernet connections table. */
1985     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 91);
1986     if(!itadmin_data_mysql_patch(job)) { back = 0; }
1987     /* PROGRESS: Reading netgroups table. */
1988     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 92);
1989     if(!itadmin_data_mysql_netgroup(job)) { back = 0; }
1990     /* PROGRESS: Reading netgroup dependencies. */
1991     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 93);
1992     if(!itadmin_data_mysql_ngdep(job)) { back = 0; }
1993   }
1994   if((itadmin_job_do_dhcp(job)) || (itadmin_job_do_licenses(job))) {
1995     /* PROGRESS: Reading networks. */
1996     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 94);
1997     if(!itadmin_data_mysql_network(job)) { back = 0; }
1998   }
1999   if(itadmin_job_do_network(job)) {
2000     if(itadmin_job_do_dhcp(job)) {
2001       /* PROGRESS: Reading DHCP classes. */
2002       itadmin_tool_log_1(job, DK3_LL_PROGRESS, 95);
2003       if(!itadmin_data_mysql_dhcp_class(job)) { back = 0; }
2004       /* PROGRESS: Reading DHCP groups. */
2005       itadmin_tool_log_1(job, DK3_LL_PROGRESS, 96);
2006       if(!itadmin_data_mysql_dhcp_group(job)) { back = 0; }
2007     }
2008   }
2009   if((itadmin_job_do_dhcp(job)) || (itadmin_job_do_licenses(job))) {
2010     /* PROGRESS: Reading DHCP pools. */
2011     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 97);
2012     if(!itadmin_data_mysql_dhcp_pool(job)) { back = 0; }
2013   }
2014   /* PROGRESS: Reading hosts. */
2015   itadmin_tool_log_1(job, DK3_LL_PROGRESS, 98);
2016   if(!itadmin_data_mysql_hosts(job)) { back = 0; }
2017   /* PROGRESS: Reading host name aliases. */
2018   itadmin_tool_log_1(job, DK3_LL_PROGRESS, 99);
2019   if(!itadmin_data_mysql_alias(job)) { back = 0; }
2020   if(itadmin_job_do_dhcp(job)) {
2021     /* PROGRESS: Reading DHCP options. */
2022     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 100);
2023     if(!itadmin_data_mysql_dhcp_option(job)) { back = 0; }
2024   }
2025   if(itadmin_job_do_licenses(job)) {
2026     /* PROGRESS: Reading software manufacturers. */
2027     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 101);
2028     if(!itadmin_data_mysql_swman(job)) { back = 0; }
2029     /* PROGRESS: Reading software products. */
2030     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 102);
2031     if(!itadmin_data_mysql_swprod(job)) { back = 0; }
2032     /* PROGRESS: Reading license types. */
2033     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 103);
2034     if(!itadmin_data_mysql_lictype(job)) { back = 0; }
2035     /* PROGRESS: Reading licenses. */
2036     itadmin_tool_log_1(job, DK3_LL_PROGRESS, 104);
2037     if(!itadmin_data_mysql_license(job)) { back = 0; }
2038   }
2039   /* PROGRESS: Finished reading input. */
2040   itadmin_tool_log_1(job, DK3_LL_PROGRESS, 105);
2041 
2042   return back;
2043 }
2044 
2045 
2046 #endif
2047 
2048 int
itadmin_data_mysql_read(itadmin_job * job)2049 itadmin_data_mysql_read(itadmin_job *job)
2050 {
2051 #if DK3_HAVE_MARIADB_MYSQL_H || DK3_HAVE_MYSQL_MYSQL_H || DK3_HAVE_MYSQL_H
2052   char			 dbh[ITADMIN_CONFIG_LINE_SIZE];	/* Host name. */
2053   char			 dbu[ITADMIN_CONFIG_LINE_SIZE];	/* User name. */
2054   char			 dbp[ITADMIN_CONFIG_LINE_SIZE];	/* Password. */
2055   char			 dbn[ITADMIN_CONFIG_LINE_SIZE];	/* DB name. */
2056   MYSQL			*re1;
2057   MYSQL			*res;				/* Same connection. */
2058   int			 ie;				/* INput encoding. */
2059   int			 back	= 0;
2060 
2061   ie = dk3app_get_encoding(job->app);
2062   if(0 == mysql_library_init(-1, itadmin_mysql_argv, itadmin_mysql_groups)) {
2063     re1 = mysql_init(NULL);
2064     if(re1) {
2065       if(dk3str_to_c8u_app(dbh,sizeof(dbh),job->dbhn,ie,job->app)) {
2066         if(dk3str_to_c8u_app(dbu,sizeof(dbu),job->dbus,ie,job->app)) {
2067 	  if(dk3str_to_c8u_app(dbp,sizeof(dbp),job->dbpw,ie,job->app)) {
2068 	    if(dk3str_to_c8u_app(dbn,sizeof(dbn),job->dbn,ie,job->app)) {
2069 
2070 	      res = mysql_real_connect(re1, dbh, dbu, dbp, dbn, 0, NULL, 0);
2071 	      if(res) {
2072 	        job->dbptr = (void *)res;
2073 	        if(mysql_set_character_set(res, "utf8")) {
2074 		  /* WARNING: Failed to set encoding! */
2075 		  dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 154);
2076 		}
2077 	        back = itadmin_data_mysql_retrieve(job);
2078 	      } else {
2079 	        /* ERROR: Failed to connect to database! */
2080 		itadmin_tool_log_utf8_5(job,DK3_LL_ERROR,155,156,157,dbn,dbh);
2081 	      }
2082 	    } else {
2083 	      /* ERROR: Failed to convert database name! */
2084 	      dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,158,159,job->dbn);
2085 	    }
2086 	  } else {
2087 	    /* ERROR: Failed to convert database user password! */
2088 	    dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 160);
2089 	  }
2090 	} else {
2091 	  /* ERROR: Failed to convert database user name! */
2092 	  dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 161, 162, job->dbus);
2093 	}
2094       } else {
2095         /* ERROR: Failed to convert database host name! */
2096 	dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 163, 164, job->dbhn);
2097       }
2098       mysql_close(re1);
2099     } else {
2100       /* ERROR: Failed to initialize MySQL client object! */
2101       dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 165);
2102     }
2103     mysql_library_end();
2104   } else {
2105     /* ERROR: Failed to initialize MySQL library! */
2106     dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 166);
2107   }
2108 
2109 #else
2110   int			back	= 0;
2111   /* ERROR: No MySQL support available! */
2112   dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 167);
2113 #endif
2114   return back;
2115 }
2116 
2117 
2118 
2119