Orbiter 2022
Combinatorial Objects
database.cpp
Go to the documentation of this file.
1// database.cpp
2//
3// Anton Betten
4// 27.11.2000
5// moved from D2 to ORBI Nov 15, 2007
6
8#include "discreta.h"
9
10
11using namespace std;
12
13
14namespace orbiter {
15namespace layer2_discreta {
16
17
19{
20 k = DATABASE;
21}
22
24 // copy constructor: this := x
25{
26 cout << "database::copy constructor for object: "
27 << const_cast<discreta_base &>(x) << "\n";
28 const_cast<discreta_base &>(x).copyobject_to(*this);
29}
30
32 // copy assignment
33{
34 cout << "database::operator = (copy assignment)" << endl;
35 copyobject(const_cast<discreta_base &>(x));
36 return *this;
37}
38
40{
41 OBJECTSELF s;
42
43 s = self;
44 new(this) database;
45 self = s;
46 k = DATABASE;
47}
48
50{
52}
53
55{
56 // cout << "group_selection::freeself_database()\n";
58}
59
61{
62 return DATABASE;
63}
64
66{
67#ifdef COPY_VERBOSE
68 cout << "database::copyobject_to()\n";
69 print_as_vector(cout);
70#endif
73#ifdef COPY_VERBOSE
74 x.as_database().print_as_vector(cout);
75#endif
76}
77
78ostream& database::print(ostream& ost)
79{
80
81 return ost;
82}
83
84void database::init(const char *filename, int objectkind, int f_compress)
85{
87}
88
89void database::init_with_file_type(const char *filename,
90 int objectkind, int f_compress, int file_type)
91{
92 m_l(8);
96 btree_access().m_l(0);
100 f_open() = FALSE;
102 file_size() = 0;
103}
104
105void database::create(int verbose_level)
106{
107 int f_v = (verbose_level >= 1);
108 int i;
109 char *buf;
110
111 if (f_v) {
112 cout << "database::create" << endl;
113 }
114 buf = NEW_char(size_of_header());
115 file_create(0 /*verbose_level - 1*/);
117 for (i = 0; i < size_of_header(); i++)
118 buf[i] = 0;
119 file_seek(0);
120 file_write(buf, size_of_header(), 1);
122 for (i = 0; i < btree_access().s_l(); i++) {
123 btree_access_i(i).create(verbose_level - 1);
124 }
125 FREE_char(buf);
126}
127
128void database::open(int verbose_level)
129{
130 int f_v = (verbose_level >= 1);
131 int i;
132
133 if (f_v) {
134 cout << "database::open, verbose_level=" << verbose_level << endl;
135 }
136 file_open(0 /*verbose_level - 1*/);
137 for (i = 0; i < btree_access().s_l(); i++) {
138 btree_access_i(i).open(verbose_level - 1);
139 }
140}
141
142void database::close(int verbose_level)
143{
144 int f_v = (verbose_level >= 1);
145 int i;
146
147 if (f_v) {
148 cout << "database::close" << endl;
149 }
151 file_close(0 /*verbose_level - 1*/);
152 for (i = 0; i < btree_access().s_l(); i++) {
153 btree_access_i(i).close(verbose_level);
154 }
155}
156
158{
159 hollerith cmd;
160 int i;
161
162 cmd.init("rm ");
163 cmd.append(filename().s());
164 system(cmd.s());
165 for (i = 0; i < btree_access().s_l(); i++) {
166 cmd.init("rm ");
167 cmd.append(btree_access_i(i).filename().s());
168 system(cmd.s());
169 }
170}
171
173{
174 int_4 l, l1;
175 int f_v = FALSE;
177
178 if (f_v) {
179 cout << "database::put_file_size" << endl;
180 }
182 l = l1 = (int_4) file_size();
183 Os.block_swap_chars((char *)&l, sizeof(int_4), 1);
184 file_write(&l, 4, 1);
185}
186
188{
189 int_4 l;
190 int f_v = FALSE;
192
193 if (f_v) {
194 cout << "database::get_file_size" << endl;
195 }
197 file_read(&l, 4, 1);
198 Os.block_swap_chars((char *)&l, sizeof(int_4), 1);
199 file_size() = l;
200}
201
202void database::user2total(int user, int &total, int &pad)
203{
204 int r, r1, sz;
205
206 sz = size_of_header();
208 r = user % sz;
209 if (r != 0) {
210 r1 = sz - r;
211 }
212 else {
213 r1 = 0;
214 }
215 pad = r1 + sz;
216 total = sz + sz + user + pad;
217 }
218 else if (file_type() == DB_FILE_TYPE_COMPACT) {
219 r = user % sz;
220 pad = sz - r;
221 total = sizeof(int_4) * 2 + user + pad;
222 }
223}
224
226{
228 return 16;
229 }
230 else if (file_type() == DB_FILE_TYPE_COMPACT) {
231 return 8;
232 }
233 else {
234 cout << "database::size_of_header() unknown file_type" << endl;
235 cout << "file_type()=" << file_type() << endl;
236 exit(1);
237 }
238}
239
241{
243 return 4;
244 }
245 else if (file_type() == DB_FILE_TYPE_COMPACT) {
246 return 3;
247 }
248 else {
249 cout << "database::size_of_header_log() unknown file_type" << endl;
250 cout << "file_type()=" << file_type() << endl;
251 exit(1);
252 }
253
254}
255
256void database::add_object_return_datref(Vector &the_object, uint_4 &datref, int verbose_level)
257{
258 int f_v = (verbose_level >= 1);
259 int f_vv = (verbose_level >= 2);
260 KEYTYPE *key_type = NULL;
261 DATATYPE data_type;
262
263 if (f_v) {
264 cout << "database::add_object_return_datref" << endl;
265 }
266 if (!f_open()) {
267 cout << "database::add_object_return_datref() database not open" << endl;
268 exit(1);
269 }
270 key_type = new KEYTYPE;
271 if (the_object.s_kind() != objectkind()) {
272 cout << "database::add_object_return_datref() wrong kind of object" << endl;
273 exit(1);
274 }
275
276 memory M;
277
278 if (FALSE) {
279 cout << "database::add_object_return_datref(): packing object" << endl;
280 }
281 the_object.pack(M, FALSE, 0/*debug_depth*/);
282
283 if (f_compress()) {
284 if (FALSE) {
285 cout << "database::add_object_return_datref(): compressing object" << endl;
286 }
287 M.compress(FALSE);
288 }
289 int i, size;
290 //uint4 datref;
291 char *pc;
292 size = M.used_length();
293 pc = (char *) M.self.char_pointer;
294 if (FALSE) {
295 cout << "database::add_object_return_datref(): saving data via add_data_DB()" << endl;
296 }
297 add_data_DB((void *)pc, size, &datref, verbose_level - 4);
298 if (FALSE) {
299 cout << "finished with add_data_DB()" << endl;
300 }
301 data_type.datref = datref;
302 data_type.data_size = (uint_4) size;
303
304 for (i = 0; i < btree_access().s_l(); i++) {
305 btree & bt = btree_access_i(i);
306 bt.key_fill_in(key_type->c, the_object);
307
308 if (f_vv) {
309 cout << "database::add_object_return_datref(): calling insert_key for btree #" << i << ": ";
310 bt.key_print(key_type->c, cout);
311 cout << endl;
312 }
313 bt.insert_key(key_type, &data_type, verbose_level - 2);
314 if (f_vv) {
315 cout << "database::add_object_return_datref(): after insert_key for btree #" << i << endl;
316 }
317 }
318
319 delete key_type;
320 if (f_v) {
321 cout << "database::add_object_return_datref done" << endl;
322 }
323}
324
325void database::add_object(Vector &the_object, int verbose_level)
326{
327 int f_v = (verbose_level >= 1);
328 uint_4 datref;
329
330 if (f_v) {
331 cout << "database::add_object" << endl;
332 }
333 add_object_return_datref(the_object, datref, verbose_level);
334 if (f_v) {
335 cout << "database::add_object done" << endl;
336 }
337}
338
340 uint_4 datref, int verbose_level)
341{
342 int i, j, len;
343 int idx;
344 KEYTYPE key_type;
345 DATATYPE data_type;
346
347 if (!f_open()) {
348 cout << "database::delete_object() database not open" << endl;
349 exit(1);
350 }
351 if (the_object.s_kind() != objectkind()) {
352 cout << "database::delete_object() wrong kind of object" << endl;
353 exit(1);
354 }
355 int size = get_size_from_datref(datref, verbose_level - 1);
356 data_type.datref = datref;
357 data_type.data_size = (uint_4) size;
358 len = btree_access().s_l();
359 for (i = 0; i < len; i++) {
360 for (j = 0; j < BTREEMAXKEYLEN; j++) {
361 key_type.c[j] = 0;
362 }
363 btree & bt = btree_access_i(i);
364 bt.key_fill_in(key_type.c, the_object);
365 if (!bt.search(key_type.c, &data_type, &idx, 0, verbose_level)) {
366 cout << "database::delete_object() WARNING: btree entry not found" << endl;
367 continue;
368 }
369 bt.delete_ith(idx, verbose_level);
370 }
371 free_data_DB(datref, size, verbose_level - 2);
372}
373
375 Vector &the_object, int verbose_level)
376{
377 int f_v = (verbose_level >= 1);
378 int size;
379 DATATYPE data_type;
380
381 if (f_v) {
382 cout << "database::get_object" << endl;
383 }
384 size = get_size_from_datref(datref, verbose_level - 1);
385 data_type.datref = datref;
386 data_type.data_size = (uint_4) size;
387 get_object(&data_type, the_object, verbose_level - 1);
388}
389
390void database::get_object(DATATYPE *data_type, Vector &the_object,
391 int verbose_level)
392{
393 int f_v = (verbose_level >= 1);
394 int f_vv = (verbose_level >= 2);
395 int size, total = 0, pad, i;
397
398 if (f_v) {
399 cout << "database::get_object" << endl;
400 }
401 if (!f_open()) {
402 cout << "database::get_object(data_type) database not open" << endl;
403 exit(1);
404 }
405 size = data_type->data_size;
406 user2total(size, total, pad);
407 memory M;
408
409 M.alloc(size);
410 char *pc = M.self.char_pointer;
411 char *d = NULL;
412 char *pc1;
413
414 d = new char[total];
415
416 file_seek(((unsigned int)data_type->datref) << size_of_header_log());
417 file_read(d, 1, total);
418
420 int_4 *header = (int_4 *) d;
421 int_4 *header2 = header + 4;
422
423 pc1 = d + 8 * 4;
424 Os.block_swap_chars((char *)header, sizeof(int_4), 4);
425 Os.block_swap_chars((char *)header2, sizeof(int_4), 4);
426 if (header[0] != MAGIC_SYNC) {
427 cout << "database::get_object()|header: no MAGIC_SYNC" << endl;
428 cout << "data_type->datref=" << data_type->datref << endl;
429 exit(1);
430 }
431 if (!header[1]) {
432 cout << "database::get_object()|header: data is not used" << endl;
433 exit(1);
434 }
435 if (header[2] != size) {
436 cout << "database::get_object()|header: header[2] != size" << endl;
437 exit(1);
438 }
439 if (header[3] != total) {
440 cout << "database::get_object()|header: header[3] != total" << endl;
441 exit(1);
442 }
443 if (header2[0] != MAGIC_SYNC) {
444 cout << "database::get_object()|header2: no MAGIC_SYNC" << endl;
445 exit(1);
446 }
447 if (!header2[1]) {
448 cout << "database::get_object()|header2: data is not used" << endl;
449 exit(1);
450 }
451 if (header2[2] != size) {
452 cout << "database::get_object()|header2: header[2] != size" << endl;
453 exit(1);
454 }
455 if (header2[3] != total) {
456 cout << "database::get_object()|header2: header[3] != total" << endl;
457 exit(1);
458 }
459 }
460 else if (file_type() == DB_FILE_TYPE_COMPACT) {
461 int_4 *header = (int_4 *) d;
462
463 pc1 = d + 4 * 2;
464 Os.block_swap_chars((char *)header, sizeof(int_4), 2);
465 if (header[0] != MAGIC_SYNC) {
466 cout << "database::get_object()|header: no MAGIC_SYNC" << endl;
467 cout << "data_type->datref=" << data_type->datref << endl;
468 exit(1);
469 }
470 if (header[1] != size) {
471 cout << "database::get_object()|header: header[1] != size" << endl;
472 exit(1);
473 }
474 }
475 else {
476 cout << "database::get_object() unknown file_type" << endl;
477 cout << "file_type()=" << file_type() << endl;
478 exit(1);
479 }
480 for (i = 0; i < size; i++)
481 pc[i] = pc1[i];
482 // M.alloc_length();
483 M.used_length() = size;
484 if (f_compress()) {
485 if (f_vv) {
486 cout << "database::get_object(): decompressing object" << endl;
487 }
488 M.decompress(f_vv);
489 }
490 M.cur_pointer() = 0;
491
492 the_object.freeself();
493 the_object.unpack(M, FALSE, 0/*debug_depth*/);
494
495 delete [] d;
496}
497
498void database::get_object_by_unique_int4(int btree_idx, int id,
499 Vector& the_object, int verbose_level)
500{
501 int f_v = (verbose_level >= 1);
502 //int f_vv = (verbose_level >= 2);
503 btree& B = btree_access_i(btree_idx);
504 int datref;
505
506 if (f_v) {
507 cout << "database::get_object_by_unique_int4 calling search_datref_of_unique_int4" << endl;
508 }
509 datref = B.search_datref_of_unique_int4(id, verbose_level - 1);
510 if (f_v) {
511 cout << "datref=" << datref << " calling get_object" << endl;
512 }
513 get_object((uint_4) datref, the_object, verbose_level - 1);
514}
515
517 Vector& the_object, int verbose_level)
518{
519 int f_v = (verbose_level >= 1);
520 //int f_vv = (verbose_level >= 2);
521 btree& B = btree_access_i(btree_idx);
522 int datref;
523
524 if (f_v) {
525 cout << "database::get_object_by_unique_int4 calling search_datref_of_unique_int4" << endl;
526 }
527 datref = B.search_datref_of_unique_int4_if_there(id, verbose_level - 1);
528 if (f_v) {
529 cout << "datref=" << datref << endl;
530 }
531 if (datref == -1)
532 return FALSE;
533 if (f_v) {
534 cout << "calling get_object" << endl;
535 }
536 get_object((uint_4) datref, the_object, verbose_level - 1);
537 return TRUE;
538}
539
541{
542 btree & B = btree_access_i(btree_idx);
543
544 return B.get_highest_int4();
545}
546
547void database::ith_object(int i, int btree_idx,
548 Vector& the_object, int verbose_level)
549{
550 int f_v = (verbose_level >= 1);
551 KEYTYPE key_type;
552 DATATYPE data_type;
553
554 if (f_v) {
555 cout << "database::ith_object i=" << i << endl;
556 }
557 ith(i, btree_idx, &key_type, &data_type, verbose_level);
558 get_object(&data_type, the_object, verbose_level - 1);
559}
560
561void database::ith(int i, int btree_idx,
562 KEYTYPE *key_type, DATATYPE *data_type,
563 int verbose_level)
564{
565 int f_v = (verbose_level >= 1);
566
567 if (f_v) {
568 cout << "database::ith i=" << i << endl;
569 }
570 btree & bt = btree_access_i(btree_idx);
571 bt.ith(i, key_type, data_type, verbose_level);
572}
573
574void database::print_by_btree(int btree_idx, ostream& ost)
575{
576 btree&B = btree_access_i(btree_idx);
577 int i, len;
578 Vector the_object;
579 int verbose_level = 0;
580
581 open(verbose_level);
582 len = B.length(verbose_level);
583 cout << "database " << filename().s() << ", btree " << B.filename().s() << " of length " << len << endl;
584 for (i = 0; i < len; i++) {
585 ith_object(i, btree_idx, the_object, verbose_level);
586 cout << i << " : " << the_object << endl;
587 }
588 close(verbose_level);
589}
590
591void database::print_by_btree_with_datref(int btree_idx, ostream& ost)
592{
593 btree &B = btree_access_i(btree_idx);
594 int i, len;
595 Vector the_object;
596 int verbose_level = 0;
597 KEYTYPE key_type;
598 DATATYPE data_type;
599
600 open(verbose_level);
601 len = B.length(verbose_level);
602 cout << "database " << filename().s() << ", btree " << B.filename().s() << " of length " << len << endl;
603 for (i = 0; i < len; i++) {
604 B.ith(i, &key_type, &data_type, verbose_level);
605 get_object(&data_type, the_object, verbose_level - 1);
606 cout << i << " : "
607 << data_type.datref << " "
608 << data_type.data_size << " "
609 << the_object << endl;
610 }
611 close(verbose_level);
612}
613
614void database::print_subset(Vector& datrefs, ostream& ost)
615{
616 int i, len;
617 Vector the_object;
618 int verbose_level = 0;
619
620 len = datrefs.s_l();
621 for (i = 0; i < len; i++) {
622 get_object((uint_4) datrefs.s_ii(i), the_object, verbose_level);
623 cout << i << " : " << the_object << endl;
624 }
625}
626
627void database::extract_subset(Vector& datrefs, char *out_path, int verbose_level)
628{
629 int f_v = (verbose_level >= 1);
630 int f_vv = (verbose_level >= 1);
631 int i, len;
632 Vector the_object;
633
634 if (f_v) {
635 cout << "database::extract_subset()" << endl;
636 }
637 database D;
638
640
641 p.init_database(D, out_path);
642 D.create(verbose_level - 1);
643
644
645 len = datrefs.s_l();
646 if (f_v) {
647 cout << "copying " << len << " datasets into database " << out_path << endl;
648 }
649 for (i = 0; i < len; i++) {
650 if (f_v && !f_vv) {
651 cout << i << " ";
652 if ((i % 10) == 0)
653 cout << endl;
654 }
655 get_object((uint_4) datrefs.s_ii(i), the_object, verbose_level - 2);
656 if (f_vv) {
657 cout << i << " : " << the_object << endl;
658 }
659 D.add_object(the_object, verbose_level - 2);
660 }
661 D.close(verbose_level - 1);
662}
663
664void database::search_int4(int btree_idx, int imin, int imax,
665 Vector &datrefs, int verbose_level)
666{
667 Vector Btree_idx, Imin, Imax;
668
669 Btree_idx.m_l(1);
670 Imin.m_l(1);
671 Imax.m_l(1);
672 Btree_idx.m_ii(0, btree_idx);
673 Imin.m_ii(0, imin);
674 Imax.m_ii(0, imax);
675 search_int4_multi_dimensional(Btree_idx, Imin, Imax, datrefs, verbose_level);
676}
677
678void database::search_int4_2dimensional(int btree_idx0, int imin0, int imax0,
679 int btree_idx1, int imin1, int imax1,
680 Vector &datrefs, int verbose_level)
681{
682 Vector Btree_idx, Imin, Imax;
683
684 Btree_idx.m_l(2);
685 Imin.m_l(2);
686 Imax.m_l(2);
687 Btree_idx.m_ii(0, btree_idx0);
688 Imin.m_ii(0, imin0);
689 Imax.m_ii(0, imax0);
690 Btree_idx.m_ii(1, btree_idx1);
691 Imin.m_ii(1, imin1);
692 Imax.m_ii(1, imax1);
693 search_int4_multi_dimensional(Btree_idx, Imin, Imax, datrefs, verbose_level);
694}
695
697 Vector& i_min, Vector &i_max, Vector& datrefs, int verbose_level)
698{
699 int f_v = (verbose_level >= 1);
700 int f_vv = (verbose_level >= 2);
701 int i, l, bi, imin, imax, first, len, db_length;
702 Vector v1, v2, First, Len, Len_sorted;
703
704 if (!f_open()) {
705 cout << "database::search_int4_multi_dimensional() database not open" << endl;
706 exit(1);
707 }
708 datrefs.m_l(0);
709 l = btree_idx.s_l();
710 First.m_l_n(l);
711 Len.m_l_n(l);
712 for (i = 0; i < l; i++) {
713 bi = btree_idx.s_ii(i);
714 imin = i_min.s_ii(i);
715 imax = i_max.s_ii(i);
716 if (f_v) {
717 cout << "database::search_int4_multi_dimensional() i=" << i
718 << " bi=" << bi << " imin=" << imin << " imax=" << imax << endl;
719 }
720 btree &B = btree_access_i(bi);
721 B.search_interval_int4(imin, imax, first, len, verbose_level - 1);
722 if (f_v) {
723 cout << "after search_interval_int4() first = " << first << " len=" << len << endl;
724 }
725 if (len == 0)
726 return;
727 First.m_ii(i, first);
728 Len.m_ii(i, len);
729 }
730 if (f_v) {
731 cout << "First = " << First << endl;
732 cout << "Len = " << Len << endl;
733 }
734 permutation p;
735
736 Len_sorted = Len;
737 Len_sorted.sort_with_logging(p);
738 if (f_v) {
739 cout << "Len (sorted) = " << Len_sorted << endl;
740 }
741 int j, h, l2;
742 j = p[0];
743 bi = btree_idx.s_ii(j);
744 btree &B = btree_access_i(bi);
745 db_length = B.length(verbose_level);
746 B.get_datrefs(First.s_ii(j), Len.s_ii(j), v1);
747 v1.sort();
748 if (f_v) {
749 cout << "db_length = " << db_length << endl;
750 cout << "datrefs after 0-th btree " << j << " : " << v1 << " (length=" << v1.s_l() << ")" << endl;
751 }
752 if (f_vv) {
753 print_subset(v1, cout);
754 }
755 for (i = 1; i < l; i++) {
756 KEYTYPE key;
757 DATATYPE data;
758 int datref, idx;
759 integer datref_object;
760
761 v2.m_l_n(v1.s_l());
762 l2 = 0;
763 j = p[i];
764 bi = btree_idx.s_ii(j);
765 first = First.s_ii(j);
766 len = Len.s_ii(j);
767 if (len == db_length) {
768 if (f_v) {
769 cout << i << "th-btree selects all datasets, no restriction here." << endl;
770 }
771 continue;
772 }
773 btree &B = btree_access_i(bi);
774 for (h = 0; h < len; h++) {
775 B.ith(first + h, &key, &data, verbose_level - 1);
776 datref = data.datref;
777 datref_object.m_i(datref);
778 if (v1.search(datref_object, &idx)) {
779 v2.m_ii(l2++, datref);
780 }
781 }
782 v2.realloc(l2);
783 v2.sort();
784 v1.swap(v2);
785 if (f_v) {
786 cout << "datrefs after " << i << "th-btree " << j << " : " << v1 << " (length=" << v1.s_l() << ")" << endl;
787 }
788 if (f_vv) {
789 print_subset(v1, cout);
790 }
791 }
792 v1.swap(datrefs);
793 if (f_v) {
794 print_subset(datrefs, cout);
795 }
796}
797
798
799int database::get_size_from_datref(uint_4 datref, int verbose_level)
800{
801 int f_v = (verbose_level >= 1);
802 int size;
803 int_4 *header = NULL;
805
806 if (f_v) {
807 cout << "database::get_size_from_datref" << endl;
808 }
809 if (!f_open()) {
810 cout << "database::get_size_from_datref() database not open" << endl;
811 exit(1);
812 }
814 header = new int_4[8];
815 file_seek(((unsigned int)datref) << size_of_header_log());
816 file_read((char *)header, 1, 8 * 4);
817 Os.block_swap_chars((char *)header, sizeof(int_4), 8);
818 if (header[0] != MAGIC_SYNC) {
819 cout << "database::get_size_from_datref()|header: no MAGIC_SYNC, probably the datref is wrong" << endl;
820 cout << "datref=" << datref << endl;
821 exit(1);
822 }
823 if (!header[1]) {
824 cout << "database::get_size_from_datref()|header: data is not used" << endl;
825 exit(1);
826 }
827 size = header[2];
828 delete [] header;
829 }
830 else if (file_type() == DB_FILE_TYPE_COMPACT) {
831 header = new int_4[2];
832 file_seek(((unsigned int)datref) << size_of_header_log());
833 file_read((char *)header, 1, 4 * 2);
834 Os.block_swap_chars((char *)header, sizeof(int_4), 2);
835 if (header[0] != MAGIC_SYNC) {
836 cout << "database::get_size_from_datref()|header: no MAGIC_SYNC, probably the datref is wrong" << endl;
837 cout << "datref=" << datref << endl;
838 exit(1);
839 }
840 size = header[1];
841 delete [] header;
842 }
843 else {
844 cout << "database::size_of_header() unknown file_type" << endl;
845 cout << "file_type()=" << file_type() << endl;
846 exit(1);
847 }
848 if (f_v) {
849 cout << "database::get_size_from_datref size = " << size << endl;
850 }
851
852 return size;
853}
854
856 int size, uint_4 *datref, int verbose_level)
857{
859 add_data_DB_standard(d, size, datref, verbose_level);
860 }
861 else if (file_type() == DB_FILE_TYPE_COMPACT) {
862 add_data_DB_compact(d, size, datref, verbose_level);
863 }
864}
865
867 int size, uint_4 *datref, int verbose_level)
868{
869 int f_v = (verbose_level >= 1);
870 int f_vv = (verbose_level >= 2);
871 int total = 0, pad = 0;
872 char *data2 = NULL;
873 char *pc, *pc0;
874 int i;
875 int_4 *pi;
876 int_4 header[4];
877 int_4 new_header[4];
878 /* 0: SYNC
879 * 1: f_used
880 * 2: length user data
881 * 3: total length (header inclusive),
882 * a multiple of 16,
883 * one unused full 16 char block guaranteed.
884 */
885 int old_file_size;
887
888 if (f_v) {
889 cout << "database::add_data_DB_standard()" << endl;
890 }
891 user2total(size, total, pad);
892 data2 = (char *) new char[total];
893 header[0] = MAGIC_SYNC;
894 header[1] = TRUE;
895 header[2] = (int_4) size;
896 header[3] = (int_4) total;
897 Os.block_swap_chars((char *)header, sizeof(int_4), 4);
898 pi = (int_4 *)data2;
899 pi[0] = header[0];
900 pi[1] = header[1];
901 pi[2] = header[2];
902 pi[3] = header[3];
903 pi[4] = header[0];
904 pi[5] = header[1];
905 pi[6] = header[2];
906 pi[7] = header[3];
907 Os.block_swap_chars((char *)header, sizeof(int_4), 4);
908 // swap header back, there will be another test
909 pc = (char *)(pi + 8);
910 pc0 = (char *)d;
911 if (f_vv) {
912 cout << "size = " << size << " pad = " << pad
913 << " total = " << total << endl;
914 }
915 for (i = 0; i < size; i++)
916 pc[i] = pc0[i];
917 for (i = 0; i < pad; i++)
918 pc[size + i] = 0;
919 old_file_size = file_size();
920 if (old_file_size <= 0) {
921 cout << "database::add_data_DB_standard old_file_size <= 0" << endl;
922 exit(1);
923 }
924 file_seek(old_file_size);
925 file_write(data2, 1, total);
926 *datref = (uint_4)(old_file_size >> size_of_header_log());
927 if (((int)((unsigned int)*datref << size_of_header_log())) != old_file_size) {
928 cout << "database::add_data_DB_standard ((unsigned int)*datref << size_of_header_log()) != old_file_size" << endl;
929 cout << "old_file_size=" << old_file_size << endl;
930 cout << "*datref=" << *datref << endl;
931 cout << "size_of_header_log()=" << size_of_header_log() << endl;
932 exit(1);
933 }
934 file_size() += total;
935 //put_file_size();
936
937 file_seek(old_file_size);
938 file_read(new_header, 4, 4);
939 Os.block_swap_chars((char *)new_header, sizeof(int_4), 4);
940 if (header[0] != new_header[0]) {
941 cout << "header[0] != new_header[0]\n";
942 }
943 if (header[1] != new_header[1]) {
944 cout << "header[1] != new_header[1]\n";
945 }
946 if (header[2] != new_header[2]) {
947 cout << "header[2] != new_header[2]\n";
948 }
949 if (header[3] != new_header[3]) {
950 cout << "header[3] != new_header[3]\n";
951 }
952 delete [] data2;
953}
954
956 int size, uint_4 *datref, int verbose_level)
957{
958 int f_v = (verbose_level >= 1);
959 int f_vv = (verbose_level >= 2);
960 int total = 0, pad = 0;
961 char *data2 = NULL;
962 char *pc, *pc0;
963 int i;
964 int_4 *pi;
965 int_4 header[2];
966 int_4 new_header[2];
967 // 0: SYNC
968 // 1: size of user data are
969 int old_file_size;
971
972 if (f_v) {
973 cout << "database::add_data_DB_compact()" << endl;
974 }
975 user2total(size, total, pad);
976 data2 = (char *) new char[total];
977 header[0] = MAGIC_SYNC;
978 header[1] = (int_4) size;
979 Os.block_swap_chars((char *)header, sizeof(int_4), 2);
980 pi = (int_4 *)data2;
981 pi[0] = header[0];
982 pi[1] = header[1];
983 Os.block_swap_chars((char *)header, sizeof(int_4), 2);
984 // swap header back, there will be another test
985 pc = (char *)(pi + 2);
986 pc0 = (char *)d;
987 if (f_vv) {
988 cout << "size = " << size << " pad = " << pad << " total = " << total << endl;
989 }
990 for (i = 0; i < size; i++)
991 pc[i] = pc0[i];
992 for (i = 0; i < pad; i++)
993 pc[size + i] = 0;
994 old_file_size = file_size();
995 file_seek(old_file_size);
996 file_write(data2, 1, total);
997 *datref = (uint_4)(old_file_size >> size_of_header_log());
998 if (((int)((unsigned int)*datref << size_of_header_log())) != old_file_size) {
999 cout << "database::add_data_DB_compact ((unsigned int)*datref << size_of_header_log()) != old_file_size" << endl;
1000 cout << "old_file_size=" << old_file_size << endl;
1001 cout << "*datref=" << *datref << endl;
1002 cout << "size_of_header_log()=" << size_of_header_log() << endl;
1003 exit(1);
1004 }
1005 file_size() += total;
1006 //put_file_size();
1007
1008 file_seek(old_file_size);
1009 file_read(new_header, 4, 2);
1010 Os.block_swap_chars((char *)new_header, sizeof(int_4), 2);
1011 if (header[0] != new_header[0]) {
1012 cout << "header[0] != new_header[0]\n";
1013 }
1014 if (header[1] != new_header[1]) {
1015 cout << "header[1] != new_header[1]\n";
1016 }
1017 delete [] data2;
1018}
1019
1020void database::free_data_DB(uint_4 datref, int size, int verbose_level)
1021{
1022 int f_v = (verbose_level >= 1);
1023 //int f_vv = (verbose_level >= 2);
1024 int total;
1025 int_4 header[8];
1027
1028 if (f_v) {
1029 cout << "database::free_data_DB()" << endl;
1030 }
1032 return;
1033 file_seek(((unsigned int)datref) << size_of_header_log());
1034 total = 8 * 4;
1035 file_read(header, 1, total);
1036 Os.block_swap_chars((char *)header, 4, 8);
1037 if (header[0] != MAGIC_SYNC) {
1038 cout << "database::free_data_DB()|header: no MAGIC_SYNC\n";
1039 exit(1);
1040 }
1041 if (!header[1]) {
1042 cout << "database::free_data_DB()|header: data is not used\n";
1043 exit(1);
1044 }
1045 if (header[2] != size) {
1046 cout << "database::free_data_DB()|header: header[2] != size\n";
1047 exit(1);
1048 }
1049 if (header[4] != MAGIC_SYNC) {
1050 cout << "database::free_data_DB()|header2: no MAGIC_SYNC\n";
1051 exit(1);
1052 }
1053 if (!header[5]) {
1054 cout << "database::free_data_DB()|header2: data is not used\n";
1055 exit(1);
1056 }
1057 if (header[6] != size) {
1058 cout << "database::free_data_DB()|header2: header[6] != size\n";
1059 exit(1);
1060 }
1061 if (header[7] != header[3]) {
1062 cout << "database::free_data_DB()|header2: header[7] != header[3]\n";
1063 exit(1);
1064 }
1065 header[1] = FALSE;
1066 header[5] = FALSE;
1067 Os.block_swap_chars((char *)header, 4, 8);
1068 file_seek(((unsigned int)datref) << size_of_header_log());
1069 file_write(header, 1, total);
1070}
1071
1072void database::file_open(int verbose_level)
1073{
1074 int f_v = (verbose_level >= 1);
1075 int idx = fstream_table_get_free_entry();
1076 fstream *f = new fstream(filename().s(), ios::in | ios::out | ios::binary);
1077 fstream_table[idx] = f;
1078 fstream_table_used[idx] = TRUE;
1079 stream() = idx;
1080 f_open() = TRUE;
1081 get_file_size();
1082 if (f_v) {
1083 cout << "database::file_open() file " << filename().s() << " opened" << endl;
1084 }
1085}
1086
1087void database::file_create(int verbose_level)
1088{
1089 int f_v = (verbose_level >= 1);
1090 hollerith cmd;
1091
1092 cmd.init("rm ");
1093 cmd.append(filename().s());
1094 system(cmd.s());
1095
1096 int idx = fstream_table_get_free_entry();
1097 {
1098 fstream *f = new fstream(filename().s(), ios::out | ios::binary);
1099 if (!*f) {
1100 cout << "database::file_create() file " << filename().s() << " could not be created" << endl;
1101 exit(1);
1102 }
1103 f->close();
1104 delete f;
1105 }
1106 fstream *f = new fstream(filename().s(), ios::in | ios::out | ios::binary);
1107 if (!*f) {
1108 cout << "database::file_create() file " << filename().s() << " could not be opened" << endl;
1109 exit(1);
1110 }
1111 fstream_table[idx] = f;
1112 fstream_table_used[idx] = TRUE;
1113 stream() = idx;
1114 f_open() = TRUE;
1115 if (f_v) {
1116 cout << "database::file_create() file " << filename().s() << " created" << endl;
1117 }
1118}
1119
1120void database::file_close(int verbose_level)
1121{
1122 int f_v = (verbose_level >= 1);
1123 int idx = (int) stream();
1124 if (!fstream_table_used[idx]) {
1125 cout << "database::file_close() !fstream_table_used[idx]" << endl;
1126 cout << "idx=" << idx << endl;
1127 exit(1);
1128 }
1129 delete fstream_table[idx];
1131 stream() = 0;
1132 f_open() = FALSE;
1133 if (f_v) {
1134 cout << "database::file_close() file " << filename().s() << " closed" << endl;
1135 }
1136}
1137
1138void database::file_seek(int offset)
1139{
1140 if (!f_open()) {
1141 cout << "database::file_seek() file not open" << endl;
1142 exit(1);
1143 }
1144 int idx = (int) stream();
1145 if (!fstream_table_used[idx]) {
1146 cout << "database::file_seek() !fstream_table_used[idx]" << endl;
1147 cout << "idx=" << idx << endl;
1148 exit(1);
1149 }
1150 fstream_table[idx]->seekg(offset);
1151}
1152
1153void database::file_write(void *p, int size, int nb)
1154{
1155 if (!f_open()) {
1156 cout << "database::file_write() file not open" << endl;
1157 exit(1);
1158 }
1159 int idx = (int) stream();
1160 if (!fstream_table_used[idx]) {
1161 cout << "database::file_write() !fstream_table_used[idx]" << endl;
1162 cout << "idx=" << idx << endl;
1163 exit(1);
1164 }
1165 fstream_table[idx]->write((char *) p, size * nb);
1166}
1167
1168void database::file_read(void *p, int size, int nb)
1169{
1170 if (!f_open()) {
1171 cout << "database::file_read() file not open" << endl;
1172 exit(1);
1173 }
1174 int idx = (int) stream();
1175 if (!fstream_table_used[idx]) {
1176 cout << "database::file_read() !fstream_table_used[idx]" << endl;
1177 cout << "idx=" << idx << endl;
1178 exit(1);
1179 }
1180 fstream_table[idx]->read((char *) p, size * nb);
1181}
1182
1183}}
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
discreta_base & s_i(int i)
Definition: vector.cpp:202
void m_ii(int i, int a)
Definition: discreta.h:824
Vector & sort_with_logging(permutation &p)
Definition: vector.cpp:548
bool search(discreta_base &x, int *idx)
Definition: vector.cpp:477
void copyobject_to(discreta_base &x)
Definition: vector.cpp:72
DISCRETA class for a database.
Definition: discreta.h:1672
int search(void *pSearchKey, DATATYPE *pData, int *idx, int key_depth, int verbose_level)
Definition: btree.cpp:924
int search_datref_of_unique_int4(int i, int verbose_level)
Definition: btree.cpp:860
void open(int verbose_level)
Definition: btree.cpp:311
int search_datref_of_unique_int4_if_there(int i, int verbose_level)
Definition: btree.cpp:874
void key_print(char *the_key, std::ostream &ost)
Definition: btree.cpp:270
int length(int verbose_level)
Definition: btree.cpp:1165
void create(int verbose_level)
Definition: btree.cpp:275
void close(int verbose_level)
Definition: btree.cpp:356
void delete_ith(int idx, int verbose_level)
Definition: btree.cpp:1628
void insert_key(KEYTYPE *pKey, DATATYPE *pData, int verbose_level)
Definition: btree.cpp:1310
void get_datrefs(int first, int len, Vector &datrefs)
Definition: btree.cpp:911
void key_fill_in(char *the_key, Vector &the_object)
Definition: btree.cpp:265
void ith(int l, KEYTYPE *key, DATATYPE *data, int verbose_level)
Definition: btree.cpp:1209
void search_interval_int4(int i_min, int i_max, int &first, int &len, int verbose_level)
Definition: btree.cpp:637
DISCRETA class for a database.
Definition: discreta.h:1525
void copyobject_to(discreta_base &x)
Definition: database.cpp:65
void print_by_btree_with_datref(int btree_idx, std::ostream &ost)
Definition: database.cpp:591
void add_data_DB_standard(void *d, int size, uint_4 *datref, int verbose_level)
Definition: database.cpp:866
void get_object_by_unique_int4(int btree_idx, int id, Vector &the_object, int verbose_level)
Definition: database.cpp:498
void free_data_DB(uint_4 datref, int size, int verbose_level)
Definition: database.cpp:1020
void init_with_file_type(const char *filename, int objectkind, int f_compress, int file_type)
Definition: database.cpp:89
void print_by_btree(int btree_idx, std::ostream &ost)
Definition: database.cpp:574
void ith(int i, int btree_idx, KEYTYPE *key_type, DATATYPE *data_type, int verbose_level)
Definition: database.cpp:561
void search_int4_2dimensional(int btree_idx0, int imin0, int imax0, int btree_idx1, int imin1, int imax1, Vector &datrefs, int verbose_level)
Definition: database.cpp:678
void search_int4(int btree_idx, int imin, int imax, Vector &datrefs, int verbose_level)
Definition: database.cpp:664
int get_size_from_datref(uint_4 datref, int verbose_level)
Definition: database.cpp:799
void close(int verbose_level)
Definition: database.cpp:142
void add_object_return_datref(Vector &the_object, uint_4 &datref, int verbose_level)
Definition: database.cpp:256
int get_highest_int4(int btree_idx)
Definition: database.cpp:540
database & operator=(const discreta_base &x)
Definition: database.cpp:31
std::ostream & print(std::ostream &)
Definition: database.cpp:78
void add_object(Vector &the_object, int verbose_level)
Definition: database.cpp:325
void open(int verbose_level)
Definition: database.cpp:128
void create(int verbose_level)
Definition: database.cpp:105
void print_subset(Vector &datrefs, std::ostream &ost)
Definition: database.cpp:614
void delete_object(Vector &the_object, uint_4 datref, int verbose_level)
Definition: database.cpp:339
void add_data_DB_compact(void *d, int size, uint_4 *datref, int verbose_level)
Definition: database.cpp:955
void file_create(int verbose_level)
Definition: database.cpp:1087
void extract_subset(Vector &datrefs, char *out_path, int verbose_level)
Definition: database.cpp:627
void get_object(uint_4 datref, Vector &the_object, int verbose_level)
Definition: database.cpp:374
void ith_object(int i, int btree_idx, Vector &the_object, int verbose_level)
Definition: database.cpp:547
void file_open(int verbose_level)
Definition: database.cpp:1072
void file_close(int verbose_level)
Definition: database.cpp:1120
int get_object_by_unique_int4_if_there(int btree_idx, int id, Vector &the_object, int verbose_level)
Definition: database.cpp:516
void add_data_DB(void *d, int size, uint_4 *datref, int verbose_level)
Definition: database.cpp:855
void search_int4_multi_dimensional(Vector &btree_idx, Vector &i_min, Vector &i_max, Vector &datrefs, int verbose_level)
Definition: database.cpp:696
void file_write(void *p, int size, int nb)
Definition: database.cpp:1153
void file_read(void *p, int size, int nb)
Definition: database.cpp:1168
void user2total(int user, int &total, int &pad)
Definition: database.cpp:202
void init(const char *filename, int objectkind, int f_compress)
Definition: database.cpp:84
DISCRETA class for design parameters.
Definition: discreta.h:1958
void init_database(database &D, char *path)
DISCRETA base class. All DISCRETA classes are derived from this class.
Definition: discreta.h:382
void pack(memory &M, int verbose_level, int debug_depth)
Definition: base.cpp:1387
void unpack(memory &M, int verbose_level, int debug_depth)
Definition: base.cpp:1418
void swap(discreta_base &a)
Definition: base.cpp:179
void copyobject(discreta_base &x)
Definition: base.cpp:194
DISCRETA string class.
Definition: discreta.h:626
DISCRETA integer class.
Definition: discreta.h:667
DISCRETA class to serialize data structures.
Definition: discreta.h:582
DISCRETA permutation class.
Definition: discreta.h:976
#define BTREEMAXKEYLEN
Definition: discreta.h:1490
#define DB_FILE_TYPE_STANDARD
Definition: discreta.h:1516
#define DB_FILE_TYPE_COMPACT
Definition: discreta.h:1517
#define DB_POS_FILESIZE
Definition: discreta.h:1514
#define NEW_char(n)
Definition: foundations.h:632
int int_4
Definition: foundations.h:181
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define MAGIC_SYNC
Definition: foundations.h:162
unsigned int uint_4
Definition: foundations.h:184
#define FREE_char(p)
Definition: foundations.h:646
fstream * fstream_table[MAX_FSTREAM_TABLE]
Definition: btree.cpp:39
int fstream_table_used[MAX_FSTREAM_TABLE]
Definition: btree.cpp:38
int fstream_table_get_free_entry()
Definition: btree.cpp:109
the orbiter library for the classification of combinatorial objects
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1507
DISCRETA auxiliary class related to the class database.
Definition: discreta.h:1498
DISCRETA internal class.
Definition: discreta.h:353