| 1 package com.quadcap.sql; 2 3 40 41 import java.io.BufferedOutputStream ; 42 import java.io.Externalizable ; 43 import java.io.IOException ; 44 import java.io.InputStream ; 45 import java.io.ObjectInput ; 46 import java.io.ObjectOutput ; 47 import java.io.OutputStream ; 48 49 import java.sql.SQLException ; 50 51 import com.quadcap.sql.io.ObjectInputStream; 52 import com.quadcap.sql.io.ObjectOutputStream; 53 import com.quadcap.sql.io.Extern; 54 55 import com.quadcap.sql.file.BlockAccess; 56 import com.quadcap.sql.file.BlockFile; 57 import com.quadcap.sql.file.Datafile; 58 import com.quadcap.sql.file.Log; 59 import com.quadcap.sql.file.PageManager; 60 import com.quadcap.sql.file.SubPageManager; 61 62 import com.quadcap.sql.types.Value; 63 import com.quadcap.sql.types.ValueBlob; 64 65 import com.quadcap.util.Debug; 66 67 import com.quadcap.io.IO; 68 69 74 public class InsertBlob extends LogStep implements Externalizable { 75 long tempBlock; 76 long permBlock; 77 78 81 public InsertBlob() {} 82 83 86 public InsertBlob(Session session, ValueBlob blob) 87 throws IOException  88 { 89 super(session); 90 91 if (blob.getBytesVal() != null) { 92 blob.passivate(session.getDatabase(), session.getTransactionId()); 93 } 94 this.tempBlock = blob.getTempBlock(); 95 this.permBlock = blob.getPermBlock(); 96 } 97 98 101 public void redo(Session session) throws IOException , SQLException { 102 Log log = session.getLog(); 103 if (session.getConnection().inRecovery() && tempBlock >= 0) { 104 BlockFile perm = session.getFile(); 105 BlockFile temp = session.getDatabase().getTempFile(); 106 InputStream is = temp.getInputStream(tempBlock); 107 108 long newPermBlock = perm.newPage(); 109 OutputStream os = perm.getOutputStream(newPermBlock); 110 IO.copyStream(is, os); 111 os.close(); 112 is.close(); 113 114 log.putRowMap(permBlock, newPermBlock); 115 permBlock = newPermBlock; 116 } 117 session.getDatabase().addMorgue(permBlock, session.getTransactionId()); 118 } 119 120 public void undo(Session session) throws IOException , SQLException { 121 final Database db = session.getDatabase(); 122 final BlockFile file = session.getFile(); 123 124 file.freeStream(permBlock); 125 db.delMorgue(permBlock); 126 } 127 128 public void prepare(Session session) throws IOException { 129 } 130 131 public void readExternal(ObjectInput in) 132 throws IOException , ClassNotFoundException  133 { 134 super.readExternal(in); 135 tempBlock = in.readLong(); 136 permBlock = in.readLong(); 137 } 138 139 public void writeExternal(ObjectOutput out) throws IOException { 140 super.writeExternal(out); 141 out.writeLong(tempBlock); 142 out.writeLong(permBlock); 143 } 144 145 public String toString() { 147 StringBuffer sb = new StringBuffer (super.toString()); 148 sb.append(" InsertBlob("); 149 sb.append(Long.toString(tempBlock)); 150 sb.append(','); 151 sb.append(Long.toString(permBlock)); 152 sb.append(')'); 153 return sb.toString(); 154 } 155 157 static Extern extern; 158 public void setExtern(Extern extern) { InsertBlob.extern = extern; } 159 public Extern getExtern() { return extern; } 160 161 public void discard(Datafile db) throws IOException { 162 db.getTempFile(false).freeSegment(tempBlock); 163 db.releaseTempFile(); } 165 } 166 | Popular Tags |