class Hoaxdb::Table
Public Class Methods
new(name,args)
click to toggle source
# File lib/hoaxdb/table.rb, line 33 def initialize(name,args) @name = name @base = {} if !args.class.eql? Hash raise "Incorrect base for your database" else args.each{|k,v| if self.valid_type(v["type"]) self.validate(v) @base.store(k,v) else raise "Invalid data type #{v}" end } end @data = [] end
Public Instance Methods
add_column(col,type)
click to toggle source
# File lib/hoaxdb/table.rb, line 160 def add_column(col,type) if @base.has_key? col raise "Column #{col} already exists" end if valid_type(type['type']) self.validate(type) @base.store(col,type) @data.each do |row| row.store(col,@base[col]['default']) end end end
alter_default(col,default)
click to toggle source
# File lib/hoaxdb/table.rb, line 153 def alter_default(col,default) if default.class.eql? eval(@base[col]['type']) @base[col]['default'] = default else raise "#{default} is not of data type #{@base[col]['type']}" end end
avg(k)
click to toggle source
# File lib/hoaxdb/table.rb, line 245 def avg(k) if @base[k]['type'].eql? 'Integer' or @base[k]['type'].eql? 'Float' sum = 0 @data.each{|row| sum += row[k]} return (sum.to_f/@data.size) else raise "column #{k} is not of type Float or Integer" end end
base()
click to toggle source
# File lib/hoaxdb/table.rb, line 68 def base @base.clone end
data()
click to toggle source
# File lib/hoaxdb/table.rb, line 65 def data @data.clone end
del_if(query)
click to toggle source
# File lib/hoaxdb/table.rb, line 218 def del_if(query) rm = [] @data = self.load(@data) d = Query.new.parse(query) for x in 0...@data.size row = @data[x] if eval(d) rm.push(x) end end rm.reverse.each{|o| @data.delete_at(o)} @data = self.dump_array(@data) end
drop_column(col)
click to toggle source
# File lib/hoaxdb/table.rb, line 198 def drop_column(col) @base.delete(col) @data.each do |row| row.delete(col) end end
dump_array(data)
click to toggle source
# File lib/hoaxdb/table.rb, line 109 def dump_array(data) data.each do |row| row.each do |k,v| if @base[k]['type'].eql? 'Date' or @base[k]['type'].eql? 'DateTime' row[k] = "#{v}" end end end data end
dump_hash(data)
click to toggle source
# File lib/hoaxdb/table.rb, line 119 def dump_hash(data) data.each do |k,v| if @base[k]['type'].eql? 'Date' or @base[k]['type'].eql? 'DateTime' data[k] = "#{v}" end end data end
fields()
click to toggle source
# File lib/hoaxdb/table.rb, line 71 def fields @base.keys end
insert(data)
click to toggle source
# File lib/hoaxdb/table.rb, line 127 def insert(data) data.each{|k,v| if @base[k] if @base[k]['type'].eql? 'Boolean' if v.class.eql? FalseClass or v.class.eql? TrueClass correct = true else raise "#{v} is not a Boolean value" end elsif !v.class.eql? eval(@base[k]['type']) raise "Incorrect data type for #{v} to #{@base[k]}" end else raise "This field #{k} is not in #{@name} table" end } data = self.dump_hash(data) dt = {} @base.each_key{|k| if !data[k] then dt.store(k,@base[k]['default']) else dt.store(k,data[k]) end } @data.push(dt) end
load(data)
click to toggle source
# File lib/hoaxdb/table.rb, line 80 def load(data) data.each do |row| row.each do |k,v| if !v.nil? if @base[k]['type'].eql? 'Date' row[k] = Date.parse(v) elsif @base[k]['type'].eql? 'DateTime' row[k] = DateTime.parse(v) elsif !@base[k]['type'].eql? 'String' and v.class.eql? String row[k] = eval(v) end end end end data end
load_hash(data)
click to toggle source
# File lib/hoaxdb/table.rb, line 96 def load_hash(data) data.each do |k,v| if !v.nil? if @base[k]['type'].eql? 'Date' data[k] = Date.parse(v) elsif @base[k]['type'].eql? 'DateTime' data[k] = DateTime.parse(v) elsif !@base[k]['type'].eql? 'String' and v.class.eql? String data[k] = eval(v) end end end end
max(k)
click to toggle source
# File lib/hoaxdb/table.rb, line 231 def max(k) if !@base[k]['type'].eql? 'Array' or !@base[k]['type'].eql? 'Hash' max = @data[0][k] || 0 @data.each{|row| if row[k] > max then max = row[k] end} return max end end
min(k)
click to toggle source
# File lib/hoaxdb/table.rb, line 238 def min(k) if !@base[k]['type'].eql? 'Array' or !@base[k].eql? 'Hash' min = @data[0][k] || 0 @data.each{|row| if row[k] < min then min = row[k] end} return min end end
rename_column(col,ncol)
click to toggle source
# File lib/hoaxdb/table.rb, line 204 def rename_column(col,ncol) if @base.has_key? col val = @base[col] @base.delete(col) @base.store(ncol,val) @data.each do |row| val = row[col] row.delete(col) row.store(ncol,val) end else raise "Column #{col} does not exist" end end
select_if(query,cols,limit=-1,sort=false,desc=false)
click to toggle source
# File lib/hoaxdb/table.rb, line 263 def select_if(query,cols,limit=-1,sort=false,desc=false) result = [] @data = self.load(@data) x = Query.new.parse(query) res = @data.select{|row| eval(x)} g = false if cols[0].strip.eql? "*" then g = true end res.each do |row| col = {} if !g cols.each do |e| col.store(e,row[e]) end result.push(col) else result.push(row) end end if sort result = result.sort{|a,b| a[sort] <=> b[sort]} end if desc result.reverse! end if limit != -1 then result = result[0...limit] end @data = self.dump_array(@data) result = self.load(result) result end
sum(k)
click to toggle source
# File lib/hoaxdb/table.rb, line 254 def sum(k) if @base[k]['type'].eql? 'Integer' or @base[k]['type'].eql? 'Float' sum = 0 @data.each{|row| sum += row[k]} return sum else raise "column #{k} is not of type Float or Integer" end end
update(query,values)
click to toggle source
# File lib/hoaxdb/table.rb, line 172 def update(query,values) @data = self.load(@data) @data.each{|row| if eval(Query.new.parse(query)) values.each{|k,v| if v.class.eql? String and v[0].eql? "$" f = Query.new.parse_complex(v.delete("$")) temp = (row[k]).clone eval("temp#{f}") if temp.class.eql? eval(@base[k]['type']) row[k] = temp else raise "Invalid data #{temp} to #{@base[k]['type']}" end else if v.class.eql? eval(@base[k]['type']) row[k] = v else raise "Invalid data #{v} to #{@base[k]['type']}" end end } end } @data = self.dump_array(@data) end
valid_type(type)
click to toggle source
# File lib/hoaxdb/table.rb, line 74 def valid_type(type) types = ['String','Integer','Float','DateTime','Date','Boolean','Array','Hash'] found = false types.each{|e| if e.eql? type then found = true;break end} found end
validate(v)
click to toggle source
# File lib/hoaxdb/table.rb, line 50 def validate(v) if v["type"].eql? 'Date' or v["type"].eql? 'DateTime' and v["default"] v["default"] = "#{v["default"]}" elsif v["type"].eql? 'Boolean' and !v["default"].nil? if v["default"].class.eql? TrueClass or v["default"].class.eql? FalseClass else raise "Invalid default #{v["default"]} to #{v["type"]}" end else if !v["default"].nil? and !v["default"].class.eql? eval(v["type"]) raise "Invalid default #{v["default"]} to #{v["type"]}" end end if v["default"].nil? then v["default"] = nil end end