Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Data;
- using System.Data.OleDb;
- using System.Windows.Forms;
- namespace ExLab
- {
- partial class FMSSDB_NewDataSet
- {
- partial class FILESDataTable
- {
- public override void EndInit()
- {
- base.EndInit(); //super class
- FILESRowChanged += MyRowChanged;
- }
- // static int i=0;
- OleDbDataReader reader;
- public int GetNextCluster(OleDbCommand cmd,int currentCluster)
- {
- cmd.CommandText = "SELECT NextCluster, ClusterStatus FROM CLUSTERS WHERE [#C]=" + currentCluster;
- reader = cmd.ExecuteReader();
- reader.Read();
- if ("E".Equals(reader[1]))
- {
- reader.Close();
- return -1;
- }
- Console.WriteLine(reader[0]);
- int nextCluster = (int)reader[0];
- reader.Close();
- return nextCluster;
- }
- public Tuple<int,int> GetClusterChain(OleDbCommand cmd,int currentCluster)
- {
- int noClusters=1;
- while (true)
- {
- int next = GetNextCluster(cmd, currentCluster);
- if (next == -1)
- break;
- ++noClusters;
- currentCluster = next;
- }
- return new Tuple<int, int>(currentCluster, noClusters);
- }
- public void LinkClusterAAfterB(OleDbCommand cmd,int clusterA, int clusterB)
- {
- cmd.CommandText = "UPDATE CLUSTERS SET NextCluster=" + clusterA + ",CLUSTER STATUS='C' WHERE [#C]=" + clusterB;
- cmd.ExecuteNonQuery();
- }
- public void MyRowChanged(object sender, FILESRowChangeEvent ev){
- //Console.WriteLine("bla"+(i++));
- //Console.WriteLine(ev.Row.File);
- //Console.WriteLine(ev.Row[0]);
- String conString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =| DataDirectory |\\FMSSDB_New.accdb";
- OleDbConnection con = new OleDbConnection(conString);
- OleDbCommand cmd = new OleDbCommand();
- OleDbDataReader reader;
- cmd.CommandType =CommandType.Text;
- cmd.Connection = con;
- con.Open();
- cmd.CommandText = "SELECT FileSize FROM FILES WHERE [#F]=" + ev.Row[0];
- reader = cmd.ExecuteReader();
- reader.Read();
- int oldFileSize = (int)((float)reader[0]);
- reader.Close();
- int newFileSize = (int)ev.Row.FileSize;
- if(newFileSize==oldFileSize)
- {
- con.Close();
- return;
- }
- cmd.CommandText = "SELECT FirstFreeCluster FROM DRIVES WHERE [#LD]=" + ev.Row.LogicDrive;
- reader = cmd.ExecuteReader();
- reader.Read();
- int firstFreeCluster = (int)reader[0];
- reader.Close();
- Tuple<int, int> r = GetClusterChain(cmd, firstFreeCluster);
- int noFreeClusters = r.Item2;
- int lastFreeCluster = r.Item1;
- r = GetClusterChain(cmd, ev.Row.FileStart);
- int noFileClusters = r.Item2;
- int lastFileCluster = r.Item1;
- // Console.WriteLine(GetNextCluster(cmd, 169432));
- int clusterSize = 10240;
- int oldClusterNr = (oldFileSize / clusterSize)+1;
- int newClusterNr = (newFileSize / clusterSize) + 1;
- if (newClusterNr > noFileClusters + noFreeClusters)
- {
- MessageBox.Show("Not enough free clusters for the new file size");
- ev.Row.RejectChanges();
- return;
- }
- LinkClusterAAfterB(cmd, firstFreeCluster, lastFileCluster);
- int currentCluster = lastFileCluster;
- for(int i = 0; i < newClusterNr - noFileClusters; i++)
- {
- lastFileCluster = firstFreeCluster;
- firstFreeCluster = GetNextCluster(cmd, firstFreeCluster);
- }
- cmd.CommandText = "UPADATE CLUSTERS SET NextCluster= NULL, ClusterStatus= 'E' WHERE [#C]=" + lastFileCluster;
- cmd.ExecuteNonQuery();
- cmd.CommandText = "UPADATE DRIVES SET FirstFreeCluster="+firstFreeCluster+" WHERE [#LD]=" + ev.Row.LogicDrive;
- cmd.ExecuteNonQuery();
- cmd.CommandText = "UPADATE FILES SET FileSize= " + newFileSize + " WHERE [#F]=" + ev.Row[0];
- cmd.ExecuteNonQuery();
- con.Close();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement