// temp //private bool isDbReadOnly; //public bool IsDbReadOnly { get { return isDbReadOnly; } } public DbAccess(DbLogin dbLogin) { if (dbLogin == null) { database = "C:\\PROJECTS\\DATA\\PROLOGDATA.FDB"; userID = "SYSDBA"; password = "******"; } else { database = dbLogin.Dbc; userID = dbLogin.Uid; password = dbLogin.Pwd; } OpenDbConnection (database, userID, password); }
private enum PredEnum { session, table, execproc, selproc } // table and view are treated identically #if persistent public void SetPersistent (Term t) { Term pred = null; Term db_info = null; // table( <name>) or procedure( <name>, <executable/selectable>) bool isTable = false; bool isExec = false; // executable stored procedure (as opposed to selectable) Term dbEntity = null; DbLogin dbLogin = null; ArrayList args = null; PredEnum predType; t.IsPacked = false; if (t != null) args = t.ArgumentsToArrayList (false); //for (int i = 0; i < args.Count; i++) Console.WriteLine ("args [{0}] = {1}", i, args [i]); bool OK = t != null && (args.Count == 2 || args.Count == 5) && (pred = (Term)args [0]).Arity == 2 && pred.Functor == SLASH && pred.Arg (0).IsAtom && pred.Arg (1).IsInteger; if (!OK) IO.Error ("Bad first argument '{0}' for persistent( <predicate>/<arity>, ...)", t.Arg (0)); OK = (db_info = (Term)args [1]) != null && ( (isTable = (db_info.Functor == "table" || db_info.Functor == "view")) || db_info.Functor == "procedure" || db_info.Functor == "proc") && db_info.Arity > 0 && ( (dbEntity = db_info.Arg (0)).IsAtom || dbEntity.IsString ); if (!OK) IO.Error ("Bad second argument '{0}' for persistent( ..., table/view/procedure(...))", db_info); if (isTable) { if (db_info.Arity != 1) IO.Error ("Bad second argument '{0}' for persistent( ..., table/view( <db_entity_name>))", db_info); predType = PredEnum.table; } else { string invocation; OK = (db_info.Arity == 2) && // procedure( <name>, <executable/selectable>) ( (isExec = ((invocation = db_info.Arg (1).Functor) == "executable" || invocation == "exec")) || invocation == "selectable" || invocation == "select" ); if (!OK) IO.Error ("Bad second argument '{0}' for persistent( ..., procedure( <db_entity_name>, [selectable|executable]))", t.Arg (1)); predType = isExec ? PredEnum.execproc : PredEnum.selproc; } string functor = pred.Arg (0).Functor; int arity = Convert.ToInt32 (pred.Arg (1).Functor); string index = Term.Key (functor, arity); if (predefineds [index] != null) IO.Error ("Predefined predicate '{0}/{1}' cannot be declared as persistent", functor, arity); if (args.Count == 5) { for (int i = 2; i <= 4; i++) if (!(((Term)args [i]).IsAtom || ((Term)args [i]).IsString)) IO.Error ("Argument '{0}' not an atom or string", (Term)args [i]); dbLogin = new DbLogin (((Term)args [2]).Functor, ((Term)args [3]).Functor, ((Term)args [4]).Functor); } PredicateDescr pd = this [index]; if (pd != null) // apparently already defined { string definingFile = (pd.DefiningFile == Globals.ConsultFileName) ? "this file" : pd.DefiningFile; if (!(pd is PersistentPredDescr)) IO.Error ("Predicate '{0}/{1}' cannot be declared as persistent (predicate defined in {2})", functor, arity, definingFile); } pd = SetClauseList (predType, functor, arity, null); ((PersistentPredDescr)pd).DbEntity = dbEntity.Functor; ((PersistentPredDescr)pd).DbLogin = dbLogin; }