*** empty log message ***
[m17n/m17n-lib-cs.git] / MDatabase.cs
index 6ac8291..01d5755 100644 (file)
@@ -968,12 +968,6 @@ namespace M17N.Core
 
     private FileStream get_stream ()
     {
-      if (loader != null
-         || (Info.Format != MSymbol.plist && Info.Format != Mxml))
-       {
-         LastLoadStatus = LoadStatus.InvalidLoadMethod;
-         return null;
-       }
       if (DBStatus != MDBStatus.READY)
        {
          LastLoadStatus = LoadStatus.NotAvailable;
@@ -989,8 +983,6 @@ namespace M17N.Core
       return stream;
     }
 
-    private NameTable name_table = new NameTable ();
-
     public MPlist Load ()
     {
       if (loader != null)
@@ -1013,138 +1005,163 @@ namespace M17N.Core
       return plist;
     }
 
-    public void Load (XmlDocument doc)
+    public MPlist Load (MSymbol key, MSymbol stop)
     {
-      if (Info.Format == Mxml)
-       throw new Exception ("Not an XML database");
-      try {
-       XmlTextReader reader
-         = new XmlTextReader (FileInfo.FullName, doc.NameTable);
-       doc.Load (reader);
-       LastLoaded = DateTime.Now;          
-      } catch (Exception e) {
-       Console.WriteLine (e);
-       LastLoadStatus = LoadStatus.InvalidContents;
-      }
-    }
+      if (loader != null)
+       throw new Exception ("Partial load is impossible");
+      if (Info.Format != MSymbol.plist)
+       throw new Exception ("Not a plist database");
 
-    public object Load (MSymbol key, MSymbol stop)
-    {
       FileStream stream = get_stream ();
-
       if (stream == null)
        return null;
-      if (Info.Format == Mxml)
-       {
-         XmlDocument doc = new XmlDocument (name_table);
-         XmlTextReader reader = new XmlTextReader (stream, name_table);
-
-         reader.WhitespaceHandling = WhitespaceHandling.None;
-         try {
-           reader.Read ();
-           while (reader.NodeType != XmlNodeType.Element)
-             reader.Read ();
-           doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
-           reader.Read ();
-           XmlNode node = doc.DocumentElement;
-           while (reader.NodeType == XmlNodeType.Element
-                  ? reader.Name != stop.Name
-                  : reader.NodeType != XmlNodeType.EndElement)
-             if (reader.NodeType == XmlNodeType.Element
-                 && reader.Name == key.Name)
-               node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
-                                                       node);
-         } finally {
-           reader.Close ();
-           stream.Dispose ();
-         }
-         return doc;
-       }
-
-      MPlist plist = null;
       try {
-       plist = new MPlist (stream, key, stop);
+       MPlist plist = new MPlist (stream, key, stop);
        LastLoaded = DateTime.Now;
+       return plist;
       } catch {
        LastLoadStatus = LoadStatus.InvalidContents;
+       return null;
       } finally {
        stream.Dispose ();
       }
-      return plist;
     }
 
-    public object Load (MSymbol stop)
+    public MPlist Load (MSymbol stop)
     {
-      FileStream stream = get_stream ();
+      if (loader != null)
+       throw new Exception ("Partial load is impossible");
+      if (Info.Format != MSymbol.plist)
+       throw new Exception ("Not a plist database");
 
+      FileStream stream = get_stream ();
       if (stream == null)
        return null;
-      if (Info.Format == Mxml)
-       {
-         XmlDocument doc = new XmlDocument (name_table);
-         XmlTextReader reader = new XmlTextReader (stream, name_table);
-
-         reader.WhitespaceHandling = WhitespaceHandling.None;
-         try {
-           reader.Read ();
-           while (reader.NodeType != XmlNodeType.Element)
-             reader.Read ();
-           doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
-           reader.Read ();
-           XmlNode node = null;
-           while (reader.NodeType == XmlNodeType.Element
-                  ? reader.Name != stop.Name
-                  : reader.NodeType != XmlNodeType.EndElement)
-             if (reader.NodeType == XmlNodeType.Element)
-                 node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
-                                                         node);
-         } catch (Exception e) {
-           Console.WriteLine (e);
-         } finally {
-           reader.Close ();
-           stream.Dispose ();
-         }
-         return doc;
-       }
-
-      MPlist plist = null;
       try {
-       plist = new MPlist (stream, stop);
+       MPlist plist = new MPlist (stream, stop);
        LastLoaded = DateTime.Now;
+       return plist;
       } catch (Exception e) {
        Console.WriteLine (e);
        LastLoadStatus = LoadStatus.InvalidContents;
+       return null;
       } finally {
        stream.Dispose ();
       }
-      return plist;
     }
 
-    public XmlNode Load (string id, params string[] nodes)
+    private XmlTextReader get_reader (XmlDocument doc)
+    {
+      XmlTextReader reader;
+
+      try {
+       if (doc.NameTable != null)
+         reader = new XmlTextReader (FileInfo.FullName, doc.NameTable);
+       else
+         reader = new XmlTextReader (FileInfo.FullName);
+       reader.WhitespaceHandling = WhitespaceHandling.None;
+      } catch {
+       LastLoadStatus = LoadStatus.NotReadable;
+       reader = null;
+      }
+      return reader;
+    }
+
+    public bool Load (XmlDocument doc)
     {
-      FileStream stream = get_stream ();
-      if (stream == null)
-       return null;
       if (Info.Format != Mxml)
-       throw new Exception ("Not an XML format");
+       throw new Exception ("Not an XML database");
+      XmlTextReader reader = get_reader (doc);
+      if (reader == null)
+       return false;
+      try {
+       doc.Load (reader);
+       LastLoaded = DateTime.Now;          
+       return true;
+      } catch (Exception e) {
+       Console.WriteLine (e);
+       LastLoadStatus = LoadStatus.InvalidContents;
+       return false;
+      } finally {
+       reader.Close ();
+      }
+    }
 
-      XmlDocument doc = new XmlDocument (name_table);
-      XmlTextReader reader = new XmlTextReader (stream, name_table);
-      int len = nodes.Length;
+    public bool Load (XmlDocument doc, MSymbol key, MSymbol stop)
+    {
+      if (Info.Format != Mxml)
+       throw new Exception ("Not an XML database");
+      XmlTextReader reader = get_reader (doc);
+      if (reader == null)
+       return false;
+      try {
+       reader.Read ();
+       while (reader.NodeType != XmlNodeType.Element)
+         reader.Read ();
+       doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+       reader.Read ();
+       XmlNode node = doc.DocumentElement;
+       while (reader.NodeType == XmlNodeType.Element
+              ? reader.Name != stop.Name
+              : reader.NodeType != XmlNodeType.EndElement)
+         if (reader.NodeType == XmlNodeType.Element
+             && reader.Name == key.Name)
+           node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
+                                                   node);
+       return true;
+      } catch (Exception e) {
+       Console.WriteLine (e);
+       return false;
+      } finally {
+       reader.Close ();
+      }
+    }
 
-      reader.WhitespaceHandling = WhitespaceHandling.None;
-      do {
+    public bool Load (XmlDocument doc, MSymbol stop)
+    {
+      if (Info.Format != Mxml)
+       throw new Exception ("Not an XML database");
+      XmlTextReader reader = get_reader (doc);
+      if (reader == null)
+       return false;
+      try {
        reader.Read ();
-      } while (reader.NodeType != XmlNodeType.Element);
+       while (reader.NodeType != XmlNodeType.Element)
+         reader.Read ();
+       doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+       reader.Read ();
+       XmlNode node = doc.DocumentElement;
+       while (reader.NodeType == XmlNodeType.Element
+              ? reader.Name != stop.Name
+              : reader.NodeType != XmlNodeType.EndElement)
+         node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader), node);
+       return true;
+      } catch (Exception e) {
+       Console.WriteLine (e);
+       return false;
+      } finally {
+       reader.Close ();
+      }
+    }
 
-      if (reader.Name != nodes[0])
+    public XmlNode Load (XmlDocument doc, string id, params string[] nodes)
+    {
+      if (Info.Format != Mxml)
+       throw new Exception ("Not an XML database");
+      XmlTextReader reader = get_reader (doc);
+      if (reader == null)
        return null;
-
-      string ns = reader.GetAttribute ("xmlns");
-      XmlNode top = doc.CreateNode (XmlNodeType.Element, nodes[0], ns);
-      XmlNode node = top;
-
       try {
+       int len = nodes.Length;
+       do {
+         reader.Read ();
+       } while (reader.NodeType != XmlNodeType.Element);
+       if (reader.Name != nodes[0])
+         return null;
+
+       string ns = reader.GetAttribute ("xmlns");
+       XmlNode top = doc.CreateNode (XmlNodeType.Element, nodes[0], ns);
+       XmlNode node = top;
        int i;
 
        for (i = 1; i + 1 < len; i++)
@@ -1170,14 +1187,13 @@ namespace M17N.Core
            else
              reader.Read ();
          }
-             
+       return top;
       } catch (Exception e) {
        Console.WriteLine (e);
+       return null;
       } finally {
        reader.Close ();
-       stream.Dispose ();
       }
-      return top;
     }
 
     /// <summary>Return a list of currently available database