Programming Forums
User Name Password Register
 

RSS Feed
FORUM INDEX | TODAY'S POSTS | UNANSWERED THREADS | ADVANCED SEARCH

Reply
 
Thread Tools Display Modes
Old Apr 23rd, 2006, 1:29 AM   #1
Master
Programmer
 
Master's Avatar
 
Join Date: Sep 2005
Location: GA
Posts: 99
Rep Power: 3 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
Reply

Bookmarks

« Previous Thread in Forum | Next Thread in Forum »

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump




DaniWeb IT Discussion Community
All times are GMT -5. The time now is 9:10 PM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC