View Single Post
Old Apr 23rd, 2006, 1:29 AM   #1
Master
Programmer
 
Master's Avatar
 
Join Date: Sep 2005
Location: GA
Posts: 99
Rep Power: 4 Master is on a distinguished road
MyDatabase Program called Tribute

I made a little module that act just like sql does. here is the code. But it is not completed it. you can only ADD, MakeTable, DROP TABLE and DISPLAY table

I added sample on how to use it
module Tribute
	
	require 'zlib'
	$DATABASE = Array.new()
	PRIMARY_KEY = 0x003
	FOREIGN_KEY = 0x005
	$INDEX = 0
	module_function

	def MakeTable(name, values)
		for data in $DATABASE
			if data.include?(name)
				print "\n#{name} Table Exist Already\n"
				return
			end
		end
	  data = {}
		values.each{|v| data.store(v,[])}
		$DATABASE << [name,data]
		$INDEX += 1
		print "\n #{name} Table Created\n"
	end
	
	def save_data(name)
		filename = name+".tdb"
		f = File.open(filename,"wb")
Marshal.dump(Zlib::Deflate.deflate($DATABASE.inspect,Zlib::BEST_COMPRESSION),f)
Marshal.dump(Zlib::Deflate.deflate($INDEX.inspect,Zlib::BEST_COMPRESSION),f)
		f.close()
		print "\n #{name} Database Created\n"
	end
	
	def load_data(name)
		filename = name+".tdb"
		f = File.open(filename,"rb")
		$DATABASE = eval(Zlib::Inflate.inflate(Marshal.load(f)))
		$INDEX = eval(Zlib::Inflate.inflate(Marshal.load(f)))
		f.close()
		print "\n #{name} Database Loaded\n"
	end
	
	def query_dropTable(v)
		info = v.to_s.split(' ')
		table_name = info[2]
		for data in $DATABASE
			if data.include?(table_name)
				$DATABASE.delete(data)
				$INDEX -= 1 if $DATABASE.index(data) == $DATABASE.size - 1
				break
			end
		end
		print "\n #{table_name} Table Dropped\n"
	end
	
	def query_data(str)
		data = str.split(/\n/)
		info = data[0].split(' ')
		value = info[0]
		case value
			when "MakeTable"
				query_table(data)
			when "ADD"
				query_addValue(data)
			when "DROP"
				query_dropTable(data)
			when "DISPLAY"
				query_display(data)
		end
	end
	
	def setIndex(str)
		for data in $DATABASE
			if data.include?(str)
				$INDEX = $DATABASE.index(data)
				break
			end
		end
	end
	
	def tableExist?(name)
		bool = false
		for data in $DATABASE
			if data.include?(name)
				bool = true
				break
			end
		end
		return bool
	end
	
	def query_addValue(v)
		info = Array.new()
		data = Array.new()
		strInfo = String.new()
		table_name = String.new()
		for str in v
			info += str.split(' ')
		end
		table_name = info[-1]
		if !tableExist?(table_name)
			print "\n#{table_name} Table Does Not Exist\n" 
			return
		end
		setIndex(table_name)
		info.each{|i| 
		if i.include?("Values(") || i.include?("values(")
			strInfo = i
			break
		end}
		strInfo.slice!("values(")
		strInfo.slice!("Values(")
		strInfo.slice!(")")
		strInfo = strInfo.split(',')
		strInfo.sort!
		strInfo.reverse!
		if (strInfo.size < $DATABASE[$INDEX][1].length || 
			strInfo.size > $DATABASE[$INDEX][1].length)
			print "\nTotal Values Not Fulfilled\n" 
			return
		end
		for data in $DATABASE[$INDEX]
			if data.is_a?(Hash)
				for i in 0...strInfo.size()
					data[data.keys[i]] << strInfo[i]
					print "\n 1 row Added To #{table_name}(#{data.keys[i]})\n"
				end
			end
		end
	end
	
	def query_table(v)
		info = Array.new()
		data = String.new()
		table_name = String.new()
		value = Array.new()
		for str in v
			info = str.split(' ')
			if info.include?("MakeTable")
				table_name = info[1]
			else
				info = info.to_s.to_a
				info.each{|i| data += i if (i != "(" || i != ")")}
			end
		end
		data = data.split(',')
		data.each{|i| i.slice!("(");i.slice!(")");value << i}
		MakeTable(table_name,value)
	end
	
	def query(str)
		return query_data(str)
	end
	
	def getTable(name)
		for data in $DATABASE
			if data.include?(name)
				return data
			end
		end
	end
	
	def query_display(v)
		info = v.to_s.split(' ')
		table_name = info[1]
		if !tableExist?(table_name)
			print "\n#{table_name} Table Does Not Exist\n" 
			return
		end
		table = getTable(table_name)
		data = table[1]
		print "\n"*2
		data.each{|k,v| print "\n","-"*k.size(),"\n"+k,"\n","-"*k.size(),"\n";v.each{|i| print i,"\n"}}
		print "\n"*2
	end

	def to_s()
		return $DATABASE.inspect()
	end
end
#=begin sample
Tribute.query(
"MakeTable Student
(name,
age,
ID)")
Tribute.query(
"MakeTable Class
(title,
teacher)")
Tribute.query(
"MakeTable Grade
(letter,
value)")
Tribute.query(
"ADD values(olamide,21,15)
TO Student")
Tribute.query(
"ADD Values(Science,Jame_Madison)
TO Class")
Tribute.query(
"ADD Values(Math,Matthew_Thomas)
TO Class")
Tribute.query(
"ADD Values(A,90)
TO Grade")
Tribute.query(
"ADD Values(B,86)
TO Grade")
Tribute.query("DISPLAY Student")
Tribute.query("DISPLAY Class")
Tribute.query("DISPLAY Grade")
#=end sample
#command line sample
#Tribute.load_data("School")
@str = ""
while get = STDIN.gets
 @str += get
 get.chop!
 if get == ";"
  @str.slice!(";")
	Tribute.query(@str)
	@str = ""
 end
 break if get == "done"
end
Tribute.save_data("School")
print Tribute.to_s
Master is offline   Reply With Quote