2010-02-18 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / AccessDataSource.cs
index 7442bed9757f95fe5ba2d6069ee77b511bd56418..eebd3826d5f099e15ec5ab5888a75d8c3d20ae7e 100644 (file)
@@ -1,12 +1,10 @@
-//
+//
 // System.Web.UI.WebControls.AccessDataSource.cs
 //
 // Authors:
 //   Sanjay Gupta (gsanjay@novell.com)
 //
-// (C) 2004 Novell, Inc (http://www.novell.com)
-//
-
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 
 using System.IO;
 using System.ComponentModel;
+using System.Data.Common;
+using System.Drawing;
+using System.Security.Permissions;
 
 namespace System.Web.UI.WebControls {
-       [ DesignerAttribute ("System.Web.UI.Design.WebControls.AccessDataSourceDesigner, System.Design",
-               "System.ComponentModel.Design.IDesigner")]                      
-       public class AccessDataSource : SqlDataSource 
-       {
-               string dataFile;
-               
+
+       // CAS
+       [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       // attributes
+       [DesignerAttribute ("System.Web.UI.Design.WebControls.AccessDataSourceDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+       [ToolboxBitmap ("")]
+       public class AccessDataSource : SqlDataSource {
+
+               const string PROVIDER_NAME = "System.Data.OleDb";
+               const string PROVIDER_STRING = "Microsoft.Jet.OLEDB.4.0";
+
+               //string dataFile;
+               string connectionString;
+
                public AccessDataSource () : base ()
                {
-                       this.ProviderName = "System.Data.OleDb";
+                       base.ProviderName = PROVIDER_NAME;
                }
 
                public AccessDataSource (string dataFile, string selectCommand) : 
                        base (String.Empty, selectCommand)
                {
-                       this.dataFile = dataFile;
-                       //After setting dataFile, connectionString gets recreated
-                       //On accessing ConnectionString, MS.Net throws NullReferenceException
-                       //Need to dig more on this.
-                       this.ProviderName = "System.Data.OleDb";                                                        
+                       //this.dataFile = dataFile;
+                       this.ProviderName = PROVIDER_NAME;
                }
 
                protected override SqlDataSourceView CreateDataSourceView (string viewName)
                {
                        AccessDataSourceView view = new AccessDataSourceView (this, viewName, this.Context);
-                       view.DataSourceViewChanged += new EventHandler (ViewChanged);
                        if (IsTrackingViewState)
                                ((IStateManager) view).TrackViewState ();                               
                        return view;
                }
 
-               void ViewChanged (object source, EventArgs e)
-               {
-                       OnDataSourceChanged (e);
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               [Browsable (false)]
+               [MonoTODO("AccessDataSource does not support SQL Cache Dependencies")]
+               public override string SqlCacheDependency {
+                       get { throw new NotSupportedException ("AccessDataSource does not supports SQL Cache Dependencies."); }
+                       set { throw new NotSupportedException ("AccessDataSource does not supports SQL Cache Dependencies."); }
                }
 
-               /*[MonoTODO]
-               protected internal override void SaveDataToCache (int startingRowIndex,
-                                                       int maxRows, object data)
+               [MonoTODO ("why override?  maybe it doesn't call DbProviderFactories.GetFactory?")]
+               protected override DbProviderFactory GetDbProviderFactory ()
                {
-                       throw new NotImplementedException ();
+                       return DbProviderFactories.GetFactory (PROVIDER_NAME);
                }
 
-               [MonoTODO]
-               protected internal override void SaveTotalRowCountToCache(int totalRows)
+               string GetPhysicalDataFilePath ()
                {
-                       throw new NotImplementedException ();
-               }
-
-               public override string SqlCacheDependency {
-                       get { throw new NotSupportedException ("AccessDataSource does not supports SQL Cache Dependencies."); }
-                       set { throw new NotSupportedException ("AccessDataSource does not supports SQL Cache Dependencies."); }
-               }*/
+                       if (DataFile == null || DataFile == "")
+                               return "";
 
-               //Above commented out portion will come into place after implementing 
-               // stuff in SqlDataSource class.
-               //Overrid implementation will depend on how .Net stores data in 
-               //Cache property of HttpContext object. 
+                       // more here?  how do we handle |DataDirectory|?
+                       return HttpContext.Current.Request.MapPath (DataFile);
+               }
 
                [BrowsableAttribute (false), 
-               DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]                      
+               DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
                public override string ConnectionString {
-                       get { return this.ConnectionString; }
-                       set { throw new InvalidOperationException 
-                               ("The ConnectionString is automatically generated for AccessDataSource and hence cannot be set."); 
+                       get {
+                               if (connectionString == null) {
+                                       connectionString = String.Concat ("Provider=", PROVIDER_STRING, "; Data Source=", GetPhysicalDataFilePath ());
+                               }
+
+                               return connectionString;
+                       }
+                       set {
+                               throw new InvalidOperationException 
+                                       ("The ConnectionString is automatically generated for AccessDataSource and hence cannot be set."); 
                        }
                }
 
-               [UrlPropertyAttribute (), DefaultValueAttribute (""),
-               WebCategoryAttribute ("Data"), 
-               WebSysDescriptionAttribute ("MS Office Access database file name"),
-               EditorAttribute ("System.Web.UI.Design.MdbDataFileEditor, System.Design", 
-                       "System.Drawing.Design.UITypeEditor, System.Drawing")]
+               [UrlPropertyAttribute]
+               [DefaultValueAttribute ("")]
+               [WebCategoryAttribute ("Data")]
+               [WebSysDescriptionAttribute ("MS Office Access database file name")]
+               [EditorAttribute ("System.Web.UI.Design.MdbDataFileEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
                public string DataFile {
-                       get { return dataFile; }
-                       set { dataFile = value; }
-                       //After setting dataFile, connectionString gets recreated
-                       //On accessing ConnectionString, MS.Net throws NullReferenceException
-                       //Need to dig more on this.
+                       get { return ViewState.GetString ("DataFile", ""); }
+                       set {
+                               ViewState ["DataFile"] = value;
+                               connectionString = null;
+                       }
                }
 
                [BrowsableAttribute (false), 
                DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]                      
                public override string ProviderName {
-                       get { return this.ProviderName; }
+                       get { return base.ProviderName; }
                        set { throw new InvalidOperationException
                                ("Setting ProviderName on an AccessDataSource is not allowed");
                        }