Tag0 = tag0; Tag1 = tag1; Tag2 = tag2; Tag3 = MSymbol.nil;
}
- public MDatabaseTag (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
+ public MDatabaseTag (MSymbol tag0, MSymbol tag1,
+ MSymbol tag2, MSymbol tag3)
{
Tag0 = tag0; Tag1 = tag1; Tag2 = tag2; Tag3 = tag3;
}
public class MDatabase
{
+ private class MDatabaseDir
+ {
+ public string Dirname;
+ public DirectoryInfo Info;
+ public DateTime LastScanned;
+
+ public MDatabaseDir (string dirname)
+ {
+ Dirname = dirname;
+ try {
+ Info = new DirectoryInfo (dirname);
+ } finally {
+ Info = null;
+ }
+ }
+
+ public bool StatusChanged {
+ get {
+ bool exists = Directory.Exists (Dirname);
+
+ if (Info != null)
+ {
+ if (! exists)
+ {
+ Info = null;
+ return true;
+ }
+ Info.Refresh ();
+ return (LastScanned < Info.LastWriteTime);
+ }
+ else
+ {
+ if (exists)
+ {
+ Info = new DirectoryInfo (Dirname);
+ return true;
+ }
+ return false;
+ }
+ }
+ }
+
+ public void UpdateStatus ()
+ {
+ LastScanned = DateTime.Now;
+ }
+ }
+
+ private class MDatabaseDefinition
+ {
+ private static readonly MSymbol Mversion;
+ public MDatabaseTag Tag;
+ public string Description;
+ public MText Filename;
+ public bool IsWildcard;
+ public MSymbol Format;
+ public MSymbol Schema;
+ public MText SchemaFile;
+ public MPlist props;
+ public bool Supported;
+
+ static MDatabaseDefinition ()
+ {
+ Mversion = new MSymbol ("version");
+ }
+
+ public MDatabaseDefinition (MPlist plist)
+ {
+ MSymbol[] tags = new MSymbol[4];
+ int i;
+
+ for (i = 0; plist.IsSymbol; i++, plist = plist.Next)
+ tags[i] = plist.Symbol;
+ while (i < 4)
+ tags[i++] = MSymbol.nil;
+ Tag = new MDatabaseTag (tags[0], tags[1], tags[2], tags[3]);
+ if (plist.IsMText)
+ {
+ Filename = plist.Text;
+ plist = plist.Next;
+ }
+ else if (plist.IsPlist)
+ {
+ MPlist p = plist.Plist;
+
+ if (p.IsMText)
+ Filename = plist.Text;
+ p = p.Next;
+ if (! p.IsEmpty)
+ {
+ if (p.IsSymbol)
+ Format = p.Symbol;
+ p = p.Next;
+ if (! p.IsEmpty)
+ {
+ if (p.IsSymbol)
+ Schema = p.Symbol;
+ p = p.Next;
+ if (p.IsMText)
+ SchemaFile = p.Text;
+ }
+ }
+ plist = plist.Next;
+ }
+ Supported = true;
+ props = new MPlist ();
+ foreach (MPlist pl in plist)
+ {
+ if (pl.IsPlist)
+ {
+ MPlist p = pl.Plist;
+
+ if (p.IsSymbol && p.Symbol == Mversion
+ && ! check_version (p.Next))
+ Supported = false;
+ props.Put (pl);
+ }
+ }
+ }
+
+ private bool check_version (MPlist plist)
+ {
+ string[] str;
+ int major, minor, release;
+
+ if (! plist.IsMText)
+ return false;
+ str = plist.Text.ToString ().Split ('.');
+ if (str.Length != 3)
+ return false;
+ try { major = int.Parse (str[0]); } catch { return false; }
+ try { minor = int.Parse (str[1]); } catch { return false; }
+ try { release = int.Parse (str[2]); } catch { return false; }
+ return (M17N.MajorVersion > major
+ || (M17N.MajorVersion == major
+ && (M17N.MinorVersion > minor
+ || (M17N.MinorVersion == minor
+ && M17N.ReleaseNumber >= release))));
+ }
+ }
+
+ private static MDatabaseDir[] DBDirs = new MDatabaseDir[3];
+
+ private const string SystemDirectory = "/usr/share/m17n";
+
+ private static Dictionary<MDatabaseTag, MDatabase> DBDict
+ = new Dictionary<MDatabaseTag, MDatabase> ();
+
/// Type of database
private enum MDBType
{
INVALID
};
- private static Dictionary<MDatabaseTag, MDatabase> db_dict
- = new Dictionary<MDatabaseTag, MDatabase> ();
+ public readonly MDatabaseTag Tag;
+ private MDatabaseLoader Loader;
+ private object ExtraInfo;
- private MDatabaseTag tag;
- private MDatabaseLoader loader;
- private object extra_info;
-
- private bool system_database;
- private DirectoryInfo dir;
- private FileInfo file;
- private FileInfo validater;
- private int major_version, minor_version, release_number;
- private MDBType type;
- private MDBStatus status;
- private MSymbol format;
- private MSymbol schema;
- private DateTime mtime;
- private DateTime ltime;
- private MPlist props;
+ private bool IsSystemDatabase;
+ private DirectoryInfo Dir;
+ private MText Filename;
+ private FileInfo FileInfo;
+ private FileInfo Validater;
+ private int MajorVersion, MinorVersion, ReleaseNumber;
+ private MDBType DBType;
+ private MDBStatus DBStatus;
+ private MSymbol Format;
+ private MSymbol Schema;
+ private DateTime Mtime;
+ private DateTime Ltime;
+ private MPlist Props;
public static string ApplicationDirectory;
- public MDatabase (MDatabaseTag tag, MDatabaseLoader loader,
+ private MDatabase (MDatabaseTag tag, MDatabaseLoader loader,
object extra_info)
{
- this.tag = tag;
- this.loader = loader;
- this.extra_info = extra_info;
+ Tag = tag;
+ Loader = loader;
+ ExtraInfo = extra_info;
+ }
+
+ private MDatabase (MDatabaseTag tag, string filename)
+ {
+ Tag = tag;
+ Filename = new MText (filename);
}
- public MDatabase (MDatabaseTag tag, string filename)
+ public static MDatabase Define (MDatabaseTag tag, MDatabaseLoader loader,
+ object extra_info)
{
- this.tag = tag;
- this.loader = load;
+ MDatabase db = MDatabase.Find (tag);
+
+ if (db != null)
+ {
+ db.Loader = loader;
+ db.ExtraInfo = extra_info;
+ return db;
+ }
+ return new MDatabase (tag, loader, extra_info);
+ }
+
+ public static MDatabase Define (MDatabaseTag tag, string filename)
+ {
+ MDatabase db = MDatabase.Find (tag);
+
+ if (db != null)
+ {
+ db.Loader = null;
+ db.Filename = new MText (filename);
+ return db;
+ }
+ return new MDatabase (tag, filename);
+ }
+
+ static MDatabase ()
+ {
+ string share_dir = (Environment.GetFolderPath
+ (Environment.SpecialFolder.CommonApplicationData));
+ string usr_dir = (Environment.GetFolderPath
+ (Environment.SpecialFolder.ApplicationData));
+
+ try {
+ DBDirs[0] = new MDatabaseDir (Path.Combine (usr_dir, ".m17n.d"));
+ } catch (ArgumentException) {
+ DBDirs[0] = new MDatabaseDir (Path.Combine (usr_dir, "_m17n.d"));
+ }
+ DBDirs[1] = null;
+ DBDirs[2] = new MDatabaseDir (Path.Combine (share_dir, "m17n"));
+ }
+
+ internal static void Update ()
+ {
+
}
- public MDatabaseTag Tag { get { return tag; } }
public static MDatabase Find (MDatabaseTag tag)
{
MDatabase db;
- return (db_dict.TryGetValue (tag, out db) ? db : null);
+ return (DBDict.TryGetValue (tag, out db) ? db : null);
}
public object Load ()
{
- return loader (tag, extra_info);
+ return (Loader != null ? Loader (Tag, ExtraInfo)
+ : load (MSymbol.nil, MSymbol.nil));
+ }
+
+ public object Load (MSymbol key, MSymbol stop)
+ {
+ if (Loader != null)
+ return null;
+ return load (key, stop);
}
- private object load (MDatabaseTag tag, object extra_info)
+ private object load (MSymbol key, MSymbol stop)
{
- ltime = DateTime.Now;
+ Ltime = DateTime.Now;
+
+
+
return null;
}