using System; using System.Collections.Generic; using System.IO; using M17N; using M17N.Core; namespace M17N.Core { public delegate object MDatabaseLoader (MDatabaseTag tag, object extra_info); public struct MDatabaseTag { public MSymbol Tag0, Tag1, Tag2, Tag3; public MDatabaseTag (MSymbol tag0) { Tag0 = tag0; Tag1 = Tag2 = Tag3 = MSymbol.nil; } public MDatabaseTag (MSymbol tag0, MSymbol tag1) { Tag0 = tag0; Tag1 = tag1; Tag2 = Tag3 = MSymbol.nil; } public MDatabaseTag (MSymbol tag0, MSymbol tag1, MSymbol tag2) { Tag0 = tag0; Tag1 = tag1; Tag2 = tag2; Tag3 = MSymbol.nil; } public MDatabaseTag (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3) { Tag0 = tag0; Tag1 = tag1; Tag2 = tag2; Tag3 = tag3; } } public class MDatabase { /// Type of database private enum MDBType { /// The database was defined automatically (from mdb.dir /// file(s)) with no wildcard tag. AUTO, /// The database was defined automatically (from mdb.dir /// file(s)) with a wildcard tag to define multiple databases /// of the same kind. AUTO_WILDCARD, /// The database was defined explicitely (by MDatabaseDefine). EXPLICIT }; /// Status of database private enum MDBStatus { // The database file is currently disabled. It means that the // database file is not readable or the database is deleted by // the modification of "mdb.dir". DISABLED, // The database file has not yet been loaded, or was modified // after the previous loading. OUTDATED, // The database file has not been modified after the previous // loading. UPDATED, // The database file is updated but the validation was failed. // If this is for a database directory, the directory is // readable but "mdb.dir" doesn't exist in it. INVALID }; private static Dictionary db_dict = new Dictionary (); 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; public static string ApplicationDirectory; public MDatabase (MDatabaseTag tag, MDatabaseLoader loader, object extra_info) { this.tag = tag; this.loader = loader; this.extra_info = extra_info; } public MDatabase (MDatabaseTag tag, string filename) { this.tag = tag; this.loader = load; } public MDatabaseTag Tag { get { return tag; } } public static MDatabase Find (MDatabaseTag tag) { MDatabase db; return (db_dict.TryGetValue (tag, out db) ? db : null); } public object Load () { return loader (tag, extra_info); } private object load (MDatabaseTag tag, object extra_info) { ltime = DateTime.Now; return null; } } }