|
Programmer
Join Date: Sep 2005
Location: GA
Posts: 99
Rep Power: 4 
|
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
|