예제 #1
0
파일: Log.cs 프로젝트: teams2ua/SharpHSQL
        /// <summary>
        /// Opens the transaction log for writing.
        /// </summary>
        private void OpenScript()
        {
            if (TracingHelper.TraceEnabled)
            {
                TracingHelper.Write();
            }

            try
            {
                // opens the log file exclusively for writing
                _file = new FileStream(sFileScript, FileMode.Append, FileAccess.Write, FileShare.None);

                // todo: use a compressed stream
                wScript = new StreamWriter(_file, System.Text.Encoding.UTF8);

                                #if !POCKETPC
                tRunner = new Thread(new ThreadStart(Run));
                tRunner.IsBackground = true;
                tRunner.Start();
                                #endif
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on OpenScript.", e);
                TracingHelper.Error(TracingHelper.FILE_IO_ERROR, sFileScript);
            }
        }
예제 #2
0
        private int[] ProcessColumnList(Tokenizer tokenizer, Table table)
        {
            ArrayList v = new ArrayList();

            tokenizer.GetThis("(");

            while (true)
            {
                v.Add(tokenizer.GetString());

                string sToken = tokenizer.GetString();

                if (sToken.Equals(")"))
                {
                    break;
                }

                if (!sToken.Equals(","))
                {
                    throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
                }
            }

            int s = v.Count;

            int[] col = new int[s];

            for (int i = 0; i < s; i++)
            {
                col[i] = table.GetColumnNumber((string)v[i]);
            }

            return(col);
        }
예제 #3
0
        public static string InputStreamTostring(BinaryReader reader)
        {
            StringWriter write     = new StringWriter();
            int          blocksize = 8 * 1024;                     // todo: is this a good value?

            char[] buffer = new char[blocksize];

            try
            {
                while (true)
                {
                    int l = reader.Read(buffer, 0, blocksize);

                    if (l == -1)
                    {
                        break;
                    }

                    write.Write(buffer, 0, l);
                }

                write.Close();
                reader.Close();
            }
            catch (IOException e)
            {
                throw TracingHelper.Error(TracingHelper.INPUTSTREAM_ERROR, e.Message);
            }

            return(write.ToString());
        }
예제 #4
0
파일: Log.cs 프로젝트: teams2ua/SharpHSQL
        /// <summary>
        /// Close the transaction log file.
        /// </summary>
        private void CloseScript()
        {
            if (TracingHelper.TraceEnabled)
            {
                TracingHelper.Write();
            }

            try
            {
                if (wScript != null)
                {
                    Stop();

                    wScript.Close();
                    wScript = null;

                    _file = null;
                }
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on CloseScript.", e);
                TracingHelper.Error(TracingHelper.FILE_IO_ERROR, sFileScript);
            }
        }
예제 #5
0
        /// <summary>
        /// GetRight method declaration.
        /// This GetRight method takes a string argument of the name of the access right.
        /// </summary>
        /// <param name="right">A string representation of the right.</param>
        /// <returns>A static int representing the string right passed in.</returns>
        public static AccessType GetRight(string right)
        {
            if (right.Equals("ALL"))
            {
                return(AccessType.All);
            }
            else if (right.Equals("SELECT"))
            {
                return(AccessType.Select);
            }
            else if (right.Equals("UPDATE"))
            {
                return(AccessType.Update);
            }
            else if (right.Equals("DELETE"))
            {
                return(AccessType.Delete);
            }
            else if (right.Equals("INSERT"))
            {
                return(AccessType.Insert);
            }

            throw TracingHelper.Error(TracingHelper.UnexpectedToken, right);
        }
예제 #6
0
        /// <summary>
        /// Checks a database object for the specified right.
        /// </summary>
        /// <param name="dbobject">Database object checking.</param>
        /// <param name="right">Desired right.</param>
        internal void Check(string dbobject, AccessType right)
        {
            if (_administrator)
            {
                return;
            }

            AccessType n;

            n = (AccessType)_right[dbobject];

            if ((n & right) != 0)
            {
                return;
            }

            if (_public != null)
            {
                n = (AccessType)(_public._right)[dbobject];

                if ((n & right) != 0)
                {
                    return;
                }
            }

            throw TracingHelper.Error(TracingHelper.ACCESS_IS_DENIED);
        }
예제 #7
0
        /// <summary>
        /// Multiply two objects.
        /// </summary>
        /// <param name="one"></param>
        /// <param name="two"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        internal static object Multiply(object one, object two, ColumnType type)
        {
            if (one == null || two == null)
            {
                return(null);
            }

            switch (type)
            {
            case ColumnType.Null:
                return(null);

            case ColumnType.Integer:
                int ai = (int)one;
                int bi = (int)two;

                return(ai * bi);

            case ColumnType.Float:
            case ColumnType.Real:
                float floata = (float)one;
                float floatb = (float)two;

                return(floata * floatb);

            case ColumnType.DbDouble:
                double ad = (double)one;
                double bd = (double)two;

                return(ad * bd);

            case ColumnType.Numeric:
            case ColumnType.DbDecimal:
                decimal abd = (decimal)one;
                decimal bbd = (decimal)two;

                return(abd * bbd);

            case ColumnType.TinyInt:
                byte ba = (byte)one;
                byte bb = (byte)two;

                return(ba * bb);

            case ColumnType.SmallInt:
                short shorta = (short)one;
                short shortb = (short)two;

                return(shorta * shortb);

            case ColumnType.BigInt:
                long longa = (long)one;
                long longb = (long)two;

                return(longa * longb);

            default:
                throw TracingHelper.Error(TracingHelper.FUNCTION_NOT_SUPPORTED, (int)type);
            }
        }
예제 #8
0
        private static int GetElapsed(string part, DateTime d1, DateTime d2)
        {
            TimeSpan elapsed = d1.Subtract(d2);

            switch (part)
            {
            case "year":
                return(new DateTime(elapsed.Ticks).Year);

            case "month":
                return(new DateTime(elapsed.Ticks).Month);

            case "day":
                return(new DateTime(elapsed.Ticks).Day);

            case "hour":
                return(new DateTime(elapsed.Ticks).Hour);

            case "minute":
                return(new DateTime(elapsed.Ticks).Minute);

            case "second":
                return(new DateTime(elapsed.Ticks).Second);

            case "ms":
                return(new DateTime(elapsed.Ticks).Millisecond);

            default:
                throw TracingHelper.Error(TracingHelper.ERROR_IN_FUNCTION);
            }
        }
예제 #9
0
        private Result ProcessDrop(Tokenizer tokenizer, Channel channel)
        {
            channel.CheckReadWrite();
            channel.CheckAdmin();

            string sToken = tokenizer.GetString();

            if (sToken.Equals("TABLE"))
            {
                sToken = tokenizer.GetString();

                if (sToken.Equals("IF"))
                {
                    sToken = tokenizer.GetString();                        // EXISTS
                    sToken = tokenizer.GetString();                        // <table>

                    DropTable(sToken, true);
                }
                else
                {
                    DropTable(sToken, false);
                }
                channel.Commit();
            }
            else if (sToken.Equals("USER"))
            {
                _access.DropUser(tokenizer.GetStringToken());
            }
            else if (sToken.Equals("INDEX"))
            {
                sToken = tokenizer.GetString();

                if (!tokenizer.WasLongName)
                {
                    throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
                }

                string table = tokenizer.LongNameFirst;
                string index = tokenizer.LongNameLast;
                Table  t     = GetTable(table, channel);

                t.CheckDropIndex(index);

                Table tn = t.MoveDefinition(index);

                tn.MoveData(t);
                DropTable(table);
                LinkTable(tn);
                channel.Commit();
            }
            else
            {
                throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
            }

            return(new Result());
        }
예제 #10
0
        public void GetThis(string match)
        {
            GetToken();

            if (!sToken.Equals(match))
            {
                throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
            }
        }
예제 #11
0
        private Result ProcessGrantOrRevoke(Tokenizer c, Channel channel, bool grant)
        {
            channel.CheckReadWrite();
            channel.CheckAdmin();

            AccessType right = AccessType.None;
            string     sToken;

            do
            {
                string sRight = c.GetString();

                right |= Access.GetRight(sRight);
                sToken = c.GetString();
            } while (sToken.Equals(","));

            if (!sToken.Equals("ON"))
            {
                throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
            }

            string table = c.GetString();

            if (table.Equals("CLASS"))
            {
                // object is saved as 'CLASS "java.lang.Math"'
                // tables like 'CLASS "xy"' should not be created
                table += " \"" + c.GetString() + "\"";
            }
            else
            {
                GetTable(table, channel);                    // to make sure the table exists
            }

            c.GetThis("TO");

            string user = c.GetStringToken();

            //			string command;

            if (grant)
            {
                _access.Grant(user, table, right);

                //				command = "GRANT";
            }
            else
            {
                _access.Revoke(user, table, right);

                //				command = "REVOKE";
            }

            return(new Result());
        }
예제 #12
0
        public string GetName()
        {
            GetToken();

            if (!WasName)
            {
                throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
            }

            return(sToken);
        }
예제 #13
0
        /// <summary>
        /// Constructor for a result based on a byte stream.
        /// </summary>
        /// <param name="b"></param>
        internal Result(byte[] b)
        {
            MemoryStream bin = new MemoryStream(b);
            BinaryReader din = new BinaryReader(bin);

            try
            {
                                #if !POCKETPC
                _mode = (ResultType)Enum.Parse(typeof(ResultType), din.ReadInt32().ToString());
                                #else
                _mode = (ResultType)OpenNETCF.EnumEx.Parse(typeof(ResultType), din.ReadInt32().ToString());
                                #endif

                if (_mode == ResultType.Error)
                {
                    throw TracingHelper.GetError(din.ReadString());
                }
                else if (_mode == ResultType.UpdateCount)
                {
                    _updateCount = din.ReadInt32();
                }
                else if (_mode == ResultType.Data)
                {
                    int l = din.ReadInt32();

                    PrepareData(l);

                    _columnCount = l;

                    for (int i = 0; i < l; i++)
                    {
                                                #if !POCKETPC
                        Type[i] = (ColumnType)Enum.Parse(typeof(ColumnType), din.ReadInt32().ToString());
                                                #else
                        Type[i] = (ColumnType)OpenNETCF.EnumEx.Parse(typeof(ColumnType), din.ReadInt32().ToString());
                                                #endif

                        Label[i] = din.ReadString();
                        Table[i] = din.ReadString();
                        Name[i]  = din.ReadString();
                    }

                    while (din.PeekChar() != -1)
                    {
                        Add(Column.ReadData(din, l));
                    }
                }
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on Result.", e);
                TracingHelper.Error(TracingHelper.TRANSFER_CORRUPTED);
            }
        }
예제 #14
0
 /// <summary>
 /// Shutdown method declaration.
 /// The shutdown method closes the cache file.
 /// It does not flush pending writes.
 /// </summary>
 public void Shutdown()
 {
     try
     {
         _fileStream.Close();
     }
     catch (Exception e)
     {
         throw TracingHelper.Error(TracingHelper.FILE_IO_ERROR, "error " + e + " in shutdown " + _name);
     }
 }
예제 #15
0
        public int GetColumnNumber(string c)
        {
            int i = SearchColumn(c);

            if (i == -1)
            {
                throw TracingHelper.Error(TracingHelper.COLUMN_NOT_FOUND, c);
            }

            return(i);
        }
예제 #16
0
        /// <summary>
        /// Gets the Type code of the string representation of a data type.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        internal static ColumnType GetColumnType(string type)
        {
            FillTypes();

            if (_types.ContainsKey(type))
            {
                return((ColumnType)_types[type]);
            }
            else
            {
                throw TracingHelper.Error(TracingHelper.WRONG_DATA_TYPE, type);
            }
        }
예제 #17
0
파일: Log.cs 프로젝트: teams2ua/SharpHSQL
        /// <summary>
        /// Restores a previous backup.
        /// </summary>
        private void RestoreBackup()
        {
            if (TracingHelper.TraceEnabled)
            {
                TracingHelper.Write("Not closed last time!");
            }

            if (!(new FileInfo(sFileBackup)).Exists)
            {
                // the backup don't exists because it was never made or is empty
                // the cache file must be deleted in this case
                (new FileInfo(sFileCache)).Delete();

                return;
            }

            try
            {
                DateTime     time  = DateTime.Now;
                BinaryReader f     = new BinaryReader(new FileStream(sFileBackup, FileMode.Open, FileAccess.Read));
                BinaryWriter cache = new BinaryWriter(new FileStream(sFileCache, FileMode.OpenOrCreate, FileAccess.Write));
                byte[]       b     = new byte[COPY_BLOCK_SIZE];

                while (true)
                {
                    int l = f.Read(b, 0, COPY_BLOCK_SIZE);

                    if (l == 0)
                    {
                        break;
                    }

                    cache.Write(b, 0, l);
                }

                cache.Close();
                f.Close();

                TimeSpan execution = DateTime.Now.Subtract(time);

                if (TracingHelper.TraceEnabled)
                {
                    TracingHelper.Write((Int64)execution.TotalMilliseconds);
                }
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on RestoreBackup.", e);
                throw TracingHelper.Error(TracingHelper.FILE_IO_ERROR, sFileBackup);
            }
        }
예제 #18
0
        public void CheckDropIndex(string index)
        {
            for (int i = 0; i < iIndexCount; i++)
            {
                if (index.Equals(GetIndex(i).Name))
                {
                    TracingHelper.Check(i != 0, TracingHelper.DROP_PRIMARY_KEY);

                    return;
                }
            }

            throw TracingHelper.Error(TracingHelper.INDEX_NOT_FOUND, index);
        }
예제 #19
0
파일: Log.cs 프로젝트: teams2ua/SharpHSQL
 /// <summary>
 /// Close the database properties file.
 /// </summary>
 private void CloseProperties()
 {
     try
     {
         if (TracingHelper.TraceEnabled)
         {
             TracingHelper.Write();
         }
     }
     catch (Exception e)
     {
         throw TracingHelper.Error(TracingHelper.FILE_IO_ERROR, sFileProperties + " " + e);
     }
 }
예제 #20
0
파일: Log.cs 프로젝트: teams2ua/SharpHSQL
        /// <summary>
        /// Performs a backup of the current database.
        /// </summary>
        private void Backup()
        {
            if (TracingHelper.TraceEnabled)
            {
                TracingHelper.Write();
            }

            // if there is no cache file then backup is not necessary
            if (!(new FileInfo(sFileCache)).Exists)
            {
                return;
            }

            try
            {
                DateTime time = DateTime.Now;

                // create a '.new' file; rename later
                BinaryWriter f   = new BinaryWriter(new FileStream(sFileBackup + ".new", FileMode.OpenOrCreate, FileAccess.Write));
                byte[]       b   = new byte[COPY_BLOCK_SIZE];
                BinaryReader fin = new BinaryReader(new FileStream(sFileCache, FileMode.Open, FileAccess.Read));

                while (true)
                {
                    int l = fin.Read(b, 0, COPY_BLOCK_SIZE);

                    if (l == 0)
                    {
                        break;
                    }

                    f.Write(b, 0, l);
                }

                f.Close();
                fin.Close();

                TimeSpan execution = DateTime.Now.Subtract(time);

                if (TracingHelper.TraceEnabled)
                {
                    TracingHelper.Write((Int64)execution.TotalMilliseconds);
                }
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on Backup.", e);
                throw TracingHelper.Error(TracingHelper.FILE_IO_ERROR, sFileBackup);
            }
        }
예제 #21
0
        /// <summary>
        /// This private method is used to access the User objects in the collection
        /// and perform operations on them.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private User Get(string name)
        {
            for (int i = 0; i < uUser.Count; i++)
            {
                User u = (User)uUser[i];

                if (u != null && u.Name.Equals(name))
                {
                    return(u);
                }
            }

            throw TracingHelper.Error(TracingHelper.USER_NOT_FOUND, name);
        }
예제 #22
0
        /// <summary>
        /// Serializes the result into a byte array.
        /// </summary>
        /// <returns></returns>
        internal byte[] GetBytes()
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            try
            {
                writer.Write((int)_mode);

                if (_mode == ResultType.UpdateCount)
                {
                    writer.Write(_updateCount);
                }
                else if (_mode == ResultType.Error)
                {
                    writer.Write(_error);
                }
                else
                {
                    int l = _columnCount;

                    writer.Write(l);

                    Record n = _root;

                    for (int i = 0; i < l; i++)
                    {
                        writer.Write((int)Type[i]);
                        writer.Write(Label[i]);
                        writer.Write(Table[i]);
                        writer.Write(Name[i]);
                    }

                    while (n != null)
                    {
                        Column.WriteData(writer, l, Type, n.Data);

                        n = n.Next;
                    }
                }

                return(stream.ToArray());
            }
            catch (Exception e)
            {
                LogHelper.Publish("Unexpected error on getBytes.", e);
                throw TracingHelper.Error(TracingHelper.TRANSFER_CORRUPTED);
            }
        }
예제 #23
0
 /// <summary>
 /// Flush method declaration.
 /// The flush method saves all cached data to the file, saves the free position
 /// and closes the file.
 /// </summary>
 public void Flush()
 {
     try
     {
         _fileStream.Seek(FREE_POS_POS, SeekOrigin.Begin);
         BinaryWriter b = new BinaryWriter(_fileStream);
         b.Write(_freePos);
         SaveAll();
         _fileStream.Close();
     }
     catch (Exception e)
     {
         throw TracingHelper.Error(TracingHelper.FILE_IO_ERROR, "error " + e + " closing " + _name);
     }
 }
예제 #24
0
        /// <summary>
        /// Gets a declare object value.
        /// </summary>
        /// <param name="name"></param>
        internal object GetDeclareValue(string name)
        {
            TracingHelper.Check(!_closed, TracingHelper.CONNECTION_IS_CLOSED);

            Declare declare = _variables[name] as Declare;

            if (declare != null)
            {
                return(declare.Value);
            }
            else
            {
                throw TracingHelper.Error(TracingHelper.VARIABLE_NOT_DECLARED);
            }
        }
예제 #25
0
        /// <summary>
        /// Sets a declare object value.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        internal void SetDeclareValue(string name, object value)
        {
            TracingHelper.Check(!_closed, TracingHelper.CONNECTION_IS_CLOSED);

            Declare declare = _variables[name] as Declare;

            if (declare != null)
            {
                declare.Value = value;
                declare.Expression.SetArg(value);
            }
            else
            {
                throw TracingHelper.Error(TracingHelper.VARIABLE_NOT_DECLARED);
            }
        }
예제 #26
0
        internal void LinkTable(Table table)
        {
            string name = table.Name;

            for (int i = 0; i < _table.Count; i++)
            {
                Table o = (Table)_table[i];

                if (o.Name.Equals(name))
                {
                    throw TracingHelper.Error(TracingHelper.TABLE_ALREADY_EXISTS, name);
                }
            }

            _table.Add(table);
        }
예제 #27
0
        private bool ProcessTrueOrFalse(Tokenizer tokenizer)
        {
            string sToken = tokenizer.GetString();

            switch (sToken)
            {
            case "TRUE":
                return(true);

            case "FALSE":
                return(false);

            default:
                throw TracingHelper.Error(TracingHelper.UnexpectedToken, sToken);
            }
        }
예제 #28
0
        /// <summary>
        /// Sum two objects.
        /// </summary>
        /// <param name="one"></param>
        /// <param name="two"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        internal static object Sum(object one, object two, ColumnType type)
        {
            if (one == null)
            {
                return(two);
            }

            if (two == null)
            {
                return(one);
            }

            switch (type)
            {
            case ColumnType.Null:
                return(null);

            case ColumnType.Integer:
                return(((int)one) + ((int)two));

            case ColumnType.Float:
            case ColumnType.Real:
                return(((float)one) + ((float)two));

            case ColumnType.DbDouble:
                return(((double)one) + ((double)two));

            case ColumnType.Numeric:
            case ColumnType.DbDecimal:
                return(((decimal)one) + ((decimal)two));

            case ColumnType.TinyInt:
                return(((byte)one) + ((byte)two));

            case ColumnType.SmallInt:
                return(((short)one) + ((short)two));

            case ColumnType.BigInt:
                return(((long)one) + ((long)two));

            default:
                TracingHelper.Error(TracingHelper.SUM_OF_NON_NUMERIC);
                break;
            }

            return(null);
        }
예제 #29
0
        /// <summary>
        /// Deserialize method declaration.
        /// This method returns the array of bytes stored in the instance of
        /// ByteArray class as an object instance.
        /// </summary>
        /// <returns>The deserialized object</returns>
        public static object Deserialize(byte[] data)
        {
            try
            {
                                #if !POCKETPC
                MemoryStream    ms = new MemoryStream(data);
                BinaryFormatter b  = new BinaryFormatter();

                return(b.Deserialize(ms));
                                #else
                throw new NotSupportedException();
                                #endif
            }
            catch (Exception e)
            {
                throw TracingHelper.Error(TracingHelper.SERIALIZATION_FAILURE, e.Message);
            }
        }
예제 #30
0
        /// <summary>
        /// CreateUser method declaration.
        /// This method is used to create a new user.  The collection of users
        /// is first checked for a duplicate name, and an exception will be thrown
        /// if a user of the same name already exists.
        /// </summary>
        /// <param name="name">User login</param>
        /// <param name="password">Plaintext password</param>
        /// <param name="admin">Is this a database admin user?</param>
        /// <returns>An instance of the newly created User object</returns>
        public User CreateUser(string name, string password, bool admin)
        {
            for (int i = 0; i < uUser.Count; i++)
            {
                User u = (User)uUser[i];

                if (u != null && u.Name.Equals(name))
                {
                    throw TracingHelper.Error(TracingHelper.USER_ALREADY_EXISTS, name);
                }
            }

            User unew = new User(name, password, admin, uPublic);

            uUser.Add(unew);

            return(unew);
        }