1: # include "ctlmod.h" 2: # include <ingres.h> 3: # include <aux.h> 4: # include <tree.h> 5: # include <sccs.h> 6: 7: SCCSID(@(#)init_qt.c 8.1 12/31/84) 8: 9: /* 10: ** INIT_QT -- initialize query tree 11: ** 12: ** This routine saves and initializes the global portion 13: ** of a query tree. It must be called before doing any 14: ** creation of a query tree which depends on or modifies 15: ** the global portion of a query tree. 16: ** 17: ** The global portion of a query tree includes the range 18: ** table, the query mode, etc. 19: ** 20: ** The algorithm for saving the query tree global portion 21: ** ("Qt") is somewhat obscure. To understand it, it is 22: ** critical to be clear that every query tree is associated 23: ** with a context, but not every context is associated with 24: ** a query tree. We further constrain that a context 25: ** is associated with at most one query tree; if more than 26: ** one is needed in a single context, it is always safe 27: ** to reuse the previous one. 28: ** 29: ** When we allocate a new context (in 'initp'), the current 30: ** Qt (if in use) is associated with the save image of the 31: ** context. When we call init_qt, we check to see if such 32: ** an association exists. If so, we save Qt, and adjust 33: ** the old context to point to the save image of Qt. When 34: ** we call init_qt again, Qt will be active, but not 35: ** associated with a context save image; thus, we do not 36: ** save Qt. On context restore, if it has a pointer to a 37: ** saved Qt, we restore that also. 38: ** 39: ** Parameters: 40: ** none. 41: ** 42: ** Returns: 43: ** none 44: ** 45: ** Side Effects: 46: ** Qt possibly gets saved in an area set up by 47: ** calling malloc. 48: ** 49: ** Trace Flags: 50: ** none 51: */ 52: 53: init_qt() 54: { 55: extern char *malloc(); 56: register char *p; 57: 58: /* 59: ** Save Qt if associated with a saved context. 60: */ 61: 62: if (Qt.qt_ctx != NULL) 63: { 64: p = malloc(sizeof Qt); 65: if (p == NULL) 66: syserr("init_qt: no mem"); 67: bmove((char *)&Qt, p, sizeof Qt); 68: ((ctx_t *)Qt.qt_ctx)->ctx_qt = p; 69: Qt.qt_ctx = NULL; 70: } 71: 72: /* mark the Qt as active */ 73: Qt.qt_active++; 74: }