EMMA Coverage Report (generated Wed Jun 28 22:15:27 PDT 2006)
[all classes][org.apache.derby.impl.sql.conn]

COVERAGE SUMMARY FOR SOURCE FILE [TempTableInfo.java]

nameclass, %method, %block, %line, %
TempTableInfo.java100% (1/1)100% (10/10)100% (57/57)100% (19/19)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class TempTableInfo100% (1/1)100% (10/10)100% (57/57)100% (19/19)
TempTableInfo (TableDescriptor, int): void 100% (1/1)100% (15/15)100% (6/6)
getDeclaredInSavepointLevel (): int 100% (1/1)100% (3/3)100% (1/1)
getDroppedInSavepointLevel (): int 100% (1/1)100% (3/3)100% (1/1)
getModifiedInSavepointLevel (): int 100% (1/1)100% (3/3)100% (1/1)
getTableDescriptor (): TableDescriptor 100% (1/1)100% (3/3)100% (1/1)
matches (String): boolean 100% (1/1)100% (14/14)100% (1/1)
setDeclaredInSavepointLevel (int): void 100% (1/1)100% (4/4)100% (2/2)
setDroppedInSavepointLevel (int): void 100% (1/1)100% (4/4)100% (2/2)
setModifiedInSavepointLevel (int): void 100% (1/1)100% (4/4)100% (2/2)
setTableDescriptor (TableDescriptor): void 100% (1/1)100% (4/4)100% (2/2)

1/*
2 
3   Derby - Class org.apache.derby.impl.sql.conn.TempTableInfo
4 
5   Copyright 2003, 2004 The Apache Software Foundation or its licensors, as applicable.
6 
7   Licensed under the Apache License, Version 2.0 (the "License");
8   you may not use this file except in compliance with the License.
9   You may obtain a copy of the License at
10 
11      http://www.apache.org/licenses/LICENSE-2.0
12 
13   Unless required by applicable law or agreed to in writing, software
14   distributed under the License is distributed on an "AS IS" BASIS,
15   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   See the License for the specific language governing permissions and
17   limitations under the License.
18 
19 */
20 
21package org.apache.derby.impl.sql.conn;
22 
23import org.apache.derby.iapi.error.StandardException;
24import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
25 
26//this class is for temporary tables. The information kept here is necessary to implement the rollback
27//and commit behavior for temporary tables.
28 
29/**
30The temp tables will have following data structure
31TableDescriptor
32Declared in savepoint level
33Dropped in savepoint level
34Modified in savepoint level
35 
36The actual logic
37 
38LanguageConnectionContext will keep the "current savepoint level". At any point in
39time, this is the total number of savepoints defined for a transaction.
40At the start of any new transaction, the "current savepoint level" will be set to 0.
41 
42Everytime a new user defined savepoint is set, store returns the total number of savepoints
43for the connection at that point.
44For eg, in a new transaction,
45"current savepoint level' will be 0. When the first savepoint is set, store will return
461 and "current savepoint level" will be set to 1. For next savepoint, store will return 2 and so on
47and so forth.
48 
49When language calls rollback or release of a savepoint, store will again return the total number of savepoints
50for the connection after rollback or release and we will set "current savepoint level" to that number. For eg,
51start tran ("current savepoint level"=0)
52set savepoint 1 ("current savepoint level"=1)
53set savepoint 2 ("current savepoint level"=2)
54set savepoint 3 ("current savepoint level"=3)
55set savepoint 4 ("current savepoint level"=4)
56release savepoint 3 ("current savepoint level"=2)
57rollback savepoint 1 ("current savepoint level"=0)
58 
59If the temporary table was declared with ON ROLLBACK DELETE ROWS and contents of that temporary table
60were modified in a transaction or within a savepoint unit, then we keep track of that by saving the
61savepoint level in dataModifiedInSavepointLevel. This information will be used at rollback of savepoint or transaction.
62Also, when a savepoint is released, we check if the table was modified in any of the savepoints that
63are getting released. If yes, then we put the current savepoint level as dataModifiedInSavepointLevel.
64eg
65start tran ("current savepoint level"=0)
66declare temp table 0 ON ROLLBACK DELETE ROWS("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
67commit (temp table 0 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1))
68start tran ("current savepoint level = 0)
69  temp table 0 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
70set savepoint 1("current savepoint level = 1")
71  temp table 0 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
72set savepoint 2("current savepoint level = 2")
73  delete 1 row from temp table 0
74  temp table 0 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=2)
75release savepoint 2 ("current savepoint level"=1) and reset the modified in savepoint level as follows
76  temp table 0 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=1)
77rollback ("current savepoint level"=0) All the rows from the temp table 0 will be removed
78At the time of commit, we set dataModifiedInSavepointLevel to -1.
79At the time of rollback (transaction / savepoint), first we check if the table was modified in the unit of work
80getting rolled back. If yes, then we delete all the data from the temp table and we set dataModifiedInSavepointLevel to -1.
81 
82When language calls release of a savepoint, store will again return the total number of savepoints
83in the system after release. We will go through all the temp tables and reset their declared or
84dropped or modified in savepoint level to the value returned by the release savepoint if those tables had their
85declared or dropped or modified in savepoint levels higher than what was returned by the release savepoint.
86eg
87start tran ("current savepoint level"=0)
88declare temp table 0 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
89set savepoint 1("current savepoint level = 1")
90declare temp table 1 ("declared in savepoint level"=1, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
91set savepoint 2("current savepoint level = 2")
92declare temp table 2 ("declared in savepoint level"=2, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
93release savepoint 1 ("current savepoint level"=0) and reset the savepoint levels as follows
94  temp table 1 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
95  temp table 2 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
96set savepoint 3("current savepoint level = 1")
97rollback savepoint 3 ("current savepoint level"=0) and temp table info will look as follows
98  temp table 0 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
99  temp table 1 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
100  temp table 2 ("declared in savepoint level"=0, "dropped in savepoint level"=-1, "dataModifiedInSavepointLevel"=-1)
101 
102When you declare a temp table, it will have "declared in savepoint level" as the current savepoint
103level of the LanguageConnectionContext (which will be 0 in a transaction with no user-defined savepoints).
104The "dropped in savepoint level" for new temp tables will be set to -1.
105The "dataModifiedInSavepointLevel" for new temp tables will be set to -1 as well.
106 
107When a temp table is dropped, we will first check if the table was declared in a savepoint level
108equal to the current savepoint level.
109        If yes, then we will remove it from the temp tables list for the LanguageConnectionContext .
110    eg
111    start tran ("current savepoint level = 0")
112    set savepoint 1("current savepoint level = 1")
113    declare temp table 1 ("declared in savepoint level"=1, "dropped in savepoint level"=-1)
114    drop temp table 1 (declared in savepoint level same as current savepoint level and hence will remove it from list of temp tables)
115        If no, then we will set the dropped in savepoint level as the current savepoint level of the
116                LanguageConnectionContext (which will be 0 in a transaction without savepoints and it also means
117                that the table was declared in a previous transaction).
118 
119At the time of commit, go through all the temp tables with "dropped in savepoint level" != -1 (meaning dropped in this transaction)
120and remove them from the temp tables list for the LanguageConnectionContext. All the rest of the temp tables with
121"dropped in savepoint level" = -1, we will set their "declared in savepoint level" to -1 and , "dataModifiedInSavepointLevel" to -1.
122eg
123  start tran ("current savepoint level = 0)
124          declare temp table t1("declared in savepoint level" = 0, "dropped in savepoint level"=-1)
125  commit (temp table 1 ("declared in savepoint level"=-1, "dropped in savepoint level"=-1))
126  start tran ("current savepoint level = 0)
127          drop temp table t1 ("declared in savepoint level" = -1, "dropped in savepoint level"=0)
128  commit (temp table t1 will be removed from list of temp tables)
129 
130At the time of rollback
131  if rolling back transaction, first set the "current savepoint level" to 0
132  if rolling back to a savepoint, first set the "current savepoint level" to savepoint level returned by Store
133    for the rollback to savepoint command
134  Now go through all the temp tables.
135        If "declared in savepoint level" of temp table is greater than or equal to "current savepoint level"
136  (ie table was declared in this unit of work)
137    And if table was not dropped in this unit of work ie "dropped in savepoint level" = -1
138      Then we should remove the table from the list of temp tables and drop the conglomerate created for it
139                  eg
140                  start tran ("current savepoint level = 0)
141                  declare temp table t2("declared in savepoint level" = 0, "dropped in savepoint level"=-1)
142                  rollback tran
143        (temp table t2 will be removed from list of tables and conglomerate associated with it will be dropped)
144    And if table was dropped in this unit of work ie "dropped in savepoint level" >= "current savepoint level"
145      Then we should remove the table from the list of temp tables
146                  eg
147                  start tran ("current savepoint level = 0)
148      set savepoint 1("current savepoint level = 1")
149                  declare temp table t2("declared in savepoint level" = 1, "dropped in savepoint level"=-1)
150      set savepoint 2("current savepoint level = 2")
151                  drop temp table t1 ("declared in savepoint level" = 1, "dropped in savepoint level"=2)
152                  rollback savepoint 1 ("current savepoint level = 0) temp table t1 will be removed from the list of temp tables
153        Else if the "dropped in savepoint level" of temp table is greate than or equal to "current savepoint level"
154                 it mean that table was dropped in this unit of work (and was declared in an earlier savepoint unit / transaction) and we will
155    restore it as part of rollback ie replace the existing entry for this table in valid temp tables list with restored temp table.
156    At the end of restoring, "declared in savepoint level" will remain unchanged and "dropped in savepoint level" will be -1.
157                eg
158                  start tran ("current savepoint level = 0)
159                  declare temp table t1 with definition 1("declared in savepoint level" = 0, "dropped in savepoint level"=-1, definition 1(stored in table descriptor))
160                  commit (temp table t1 "declared in savepoint level" = -1, "dropped in savepoint level"=-1)
161                  start tran ("current savepoint level = 0)
162      set savepoint 1("current savepoint level = 1")
163                  drop temp table t1 ("declared in savepoint level" = -1, "dropped in savepoint level"=1, definition 1(stored in table descriptor))
164                  declare temp table t1 with definition 2(say different than definition 1)
165        ("declared in savepoint level" = -1, "dropped in savepoint level"=1, definition 1(stored in table descriptor)) ,
166                          ("declared in savepoint level" = 1, "dropped in savepoint level"=-1, definition 2(stored in table descriptor))
167      set savepoint 2("current savepoint level = 2")
168      drop temp table t1("declared in savepoint level" = -1, "dropped in savepoint level"=1, definition 1(stored in table descriptor)) ,
169                          ("declared in savepoint level" = 1, "dropped in savepoint level"=2, definition 2(stored in table descriptor))
170                  rollback tran
171        (Remove : temp table t1("declared in savepoint level" = 1, "dropped in savepoint level"=2, definition 2(stored in table descriptor)
172        (Restore : temp table t1"declared in savepoint level" = -1, "dropped in savepoint level"=-1, definition 1(stored in table descriptor))
173        Else if the "dataModifiedInSavepointLevel" of temp table is greate than or equal to "current savepoint level"
174                 it means that table was declared in an earlier savepoint unit / transaction and was modified in the current UOW. And hence we will delete all the
175    data from it.
176*/
177class TempTableInfo
178{
179 
180        private TableDescriptor td;
181        private int declaredInSavepointLevel;
182        private int droppededInSavepointLevel;
183        private int dataModifiedInSavepointLevel;
184 
185        TempTableInfo(TableDescriptor td, int declaredInSavepointLevel)
186        {
187                this.td = td;
188                this.declaredInSavepointLevel = declaredInSavepointLevel;
189                this.droppededInSavepointLevel = -1;
190                this.dataModifiedInSavepointLevel = -1;
191        }
192 
193        /**
194         * Return the table descriptor
195         */
196        TableDescriptor getTableDescriptor() {
197    return td;
198  }
199 
200        /**
201         * Set the table descriptor. Will be called while temporary is being restored
202         */
203        void setTableDescriptor(TableDescriptor td) {
204    this.td = td;
205  }
206 
207        /**
208         * Matches by name and only temp tables that have not been dropped (that's when droppededInSavepointLevel will be -1)
209         */
210        boolean matches(String tableName) {
211    return (td.getName().equals(tableName) && droppededInSavepointLevel == -1);
212  }
213 
214        /**
215         * Return the savepoint level when the table was last modified
216         */
217        int getModifiedInSavepointLevel() {
218    return dataModifiedInSavepointLevel;
219  }
220 
221        /**
222         * Set the savepoint level when the table was last modified
223         */
224        void setModifiedInSavepointLevel(int dataModifiedInSavepointLevel) {
225    this.dataModifiedInSavepointLevel = dataModifiedInSavepointLevel;
226  }
227 
228        /**
229         * Return the savepoint level when the table was declared
230         */
231        int getDeclaredInSavepointLevel() {
232    return declaredInSavepointLevel;
233  }
234 
235        /**
236         * Set the savepoint level when the table was declared
237         */
238        void setDeclaredInSavepointLevel(int declaredInSavepointLevel) {
239    this.declaredInSavepointLevel = declaredInSavepointLevel;
240  }
241 
242        /**
243         * Return the savepoint level when the table was dropped
244         */
245        int getDroppedInSavepointLevel() {
246    return droppededInSavepointLevel;
247  }
248 
249        /**
250         * Return the savepoint level when the table was dropped
251         */
252        public void setDroppedInSavepointLevel(int droppededInSavepointLevel) {
253    this.droppededInSavepointLevel = droppededInSavepointLevel;
254  }
255}

[all classes][org.apache.derby.impl.sql.conn]
EMMA 2.0.5312 (C) Vladimir Roubtsov