|                                                                                                              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                                                                                                                                                                                              |