1 24 25 package com.mckoi.database; 26 27 import java.util.ArrayList ; 28 import com.mckoi.debug.*; 29 30 43 44 final class MultiVersionTableIndices { 45 46 49 private final TableName table_name; 50 51 54 private final int column_count; 55 56 59 private final TransactionSystem system; 60 61 62 63 71 private ArrayList transaction_mod_list; 72 73 74 75 76 77 79 private String journal_count_stat_key; 80 81 84 MultiVersionTableIndices(TransactionSystem system, 85 TableName table_name, int column_count) { 86 this.system = system; 87 this.table_name = table_name; 88 this.column_count = column_count; 89 90 transaction_mod_list = new ArrayList (); 91 92 journal_count_stat_key = "MultiVersionTableIndices.journal_entries." + 93 table_name; 94 95 } 96 97 private long TS_merge_count = 0; 98 private long TS_merge_size = 0; 99 100 103 public final DebugLogger Debug() { 104 return system.Debug(); 105 } 106 107 120 boolean mergeJournalChanges(long commit_id) { 121 122 ++TS_merge_count; 124 TS_merge_size += transaction_mod_list.size(); 125 if ((TS_merge_count % 32) == 0) { 126 system.stats().set( 127 (int) ((TS_merge_size * 1000000L) / TS_merge_count), 128 "MultiVersionTableIndices.average_journal_merge_mul_1000000"); 129 } 139 140 int merge_count = 0; 141 int size = transaction_mod_list.size(); 142 while (transaction_mod_list.size() > 0) { 143 144 MasterTableJournal journal = 145 (MasterTableJournal) transaction_mod_list.get(0); 146 147 if (commit_id > journal.getCommitID()) { 148 149 ++merge_count; 150 if (Debug().isInterestedIn(Lvl.INFORMATION)) { 151 Debug().write(Lvl.INFORMATION, this, 152 "Merging '" + table_name + "' journal: " + journal); 153 } 154 155 transaction_mod_list.remove(0); 157 system.stats().decrement(journal_count_stat_key); 158 159 } 160 else { return false; 162 } 163 } 164 165 return true; 166 167 } 168 169 177 MasterTableJournal[] findAllJournalsSince(long commit_id) { 178 179 ArrayList all_since = new ArrayList (); 180 181 int size = transaction_mod_list.size(); 182 for (int i = 0; i < size; ++i) { 183 MasterTableJournal journal = 184 (MasterTableJournal) transaction_mod_list.get(i); 185 long journal_commit_id = journal.getCommitID(); 186 if (journal_commit_id >= commit_id) { 188 all_since.add(journal); 189 } 190 } 191 192 return (MasterTableJournal[]) 193 all_since.toArray(new MasterTableJournal[all_since.size()]); 194 } 195 196 200 void addTransactionJournal(MasterTableJournal change) { 201 transaction_mod_list.add(change); 202 system.stats().increment(journal_count_stat_key); 203 } 204 205 209 boolean hasTransactionChangesPending() { 210 return transaction_mod_list.size() > 0; 212 } 213 214 217 String transactionChangeString() { 218 return transaction_mod_list.toString(); 219 } 220 221 } 222 | Popular Tags |