Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/16/08 17:26:43 (15 years ago)
Author:
svonolfe
Message:

Refactored DAL, Improved Caching (#372)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/DataAdapterBase.cs

    r925 r995  
    1 using System;
     1#region License Information
     2/* HeuristicLab
     3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     4 *
     5 * This file is part of HeuristicLab.
     6 *
     7 * HeuristicLab is free software: you can redistribute it and/or modify
     8 * it under the terms of the GNU General Public License as published by
     9 * the Free Software Foundation, either version 3 of the License, or
     10 * (at your option) any later version.
     11 *
     12 * HeuristicLab is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 * GNU General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU General Public License
     18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
     19 */
     20#endregion
     21
     22using System;
    223using System.Collections.Generic;
    324using System.Linq;
    425using System.Text;
     26using HeuristicLab.Hive.Contracts.BusinessObjects;
     27using System.Runtime.CompilerServices;
    528
    629namespace HeuristicLab.Hive.Server.ADODataAccess {
    7   abstract class DataAdapterBase {
    8     protected abstract void Update();
     30  abstract class DataAdapterBase<AdapterT, ObjT, RowT>
     31    where AdapterT: new()
     32    where RowT: System.Data.DataRow
     33    where ObjT: IHiveObject, new() {
     34    protected AdapterT adapter =
     35      new AdapterT();
    936
    10     protected DataAdapterBase() {
    11       ServiceLocator.GetTransactionManager().OnUpdate +=
    12         new EventHandler(DataAdapterBase_OnUpdate);
     37    #region Abstract methods
     38    protected abstract RowT Convert(ObjT obj, RowT row);
     39
     40    protected abstract ObjT Convert(RowT row, ObjT obj);
     41
     42    protected abstract RowT InsertNewRow(ObjT obj);
     43
     44    protected abstract void UpdateRow(RowT row);
     45
     46    protected abstract IEnumerable<RowT> FindById(long id);
     47
     48    protected abstract IEnumerable<RowT> FindAll();
     49    #endregion
     50
     51    protected delegate IEnumerable<RowT> Selector();
     52
     53    protected virtual RowT FindSingleRow(Selector selector) {
     54      RowT row = default(RowT);
     55
     56      IEnumerable<RowT> found =
     57        selector();
     58
     59      if (found.Count<RowT>() == 1)
     60        row = found.First<RowT>();
     61
     62      return row;
    1363    }
    1464
    15     void DataAdapterBase_OnUpdate(object sender, EventArgs e) {
    16       this.Update();
     65    protected virtual ObjT FindSingle(Selector selector) {
     66      RowT row = FindSingleRow(selector);
     67
     68      if (row != null) {
     69        ObjT obj = new ObjT();
     70        Convert(row, obj);
     71
     72        return obj;
     73      } else {
     74        return default(ObjT);
     75      }
     76    }
     77
     78    protected virtual ICollection<ObjT> FindMultiple(Selector selector) {
     79      IEnumerable<RowT> found =
     80        selector();
     81
     82      IList<ObjT> result =
     83        new List<ObjT>();
     84
     85      foreach (RowT row in found) {
     86        ObjT obj = new ObjT();
     87        Convert(row, obj);
     88        result.Add(obj);
     89      }
     90
     91      return result;
     92    }
     93
     94    protected virtual RowT GetRowById(long id) {
     95      return FindSingleRow(
     96        delegate() {
     97          return FindById(id);
     98        });
     99    }
     100
     101    [MethodImpl(MethodImplOptions.Synchronized)]
     102    public virtual void Update(ObjT obj) {
     103      if (obj != null) {
     104        RowT row =
     105          GetRowById(obj.Id);
     106
     107        if (row == null) {
     108          row = InsertNewRow(obj);
     109        }
     110
     111        Convert(obj, row);
     112
     113        UpdateRow(row);
     114
     115        obj.Id = (long)row[row.Table.PrimaryKey[0]];
     116      }
     117    }
     118
     119    public virtual ObjT GetById(long id) {
     120      return FindSingle(delegate() {
     121        return FindById(id);
     122      });
     123    }
     124
     125    public virtual ICollection<ObjT> GetAll() {
     126      return new List<ObjT>(
     127        FindMultiple(
     128          new Selector(FindAll)));
     129    }
     130
     131    [MethodImpl(MethodImplOptions.Synchronized)]
     132    public virtual bool Delete(ObjT obj) {
     133      if (obj != null) {
     134        RowT row =
     135          GetRowById(obj.Id);
     136
     137        if (row != null) {
     138          row.Delete();
     139          UpdateRow(row);
     140        }
     141      }
     142
     143      return false;
    17144    }
    18145  }
Note: See TracChangeset for help on using the changeset viewer.