#!/usr/local/bin/ruby # $Revision: 1.29 $ # $Date: 2003/12/04 23:25:31 $ # $Author: mikeman2, jefus $ #cfile.rb -- Simple filesystem on top of MySQL #***Avoid using wierd symbols in owners, drawers, and files like ";", "::" and ":"*** #usage: # cfile = CFile.new("disco:mobs:secretary") # cfile.write("name", "disco's secretary") # @secretaryname = cfile.attributes['name'] # @secretaryname = "name" # array << stuff # array << morestuff # cfile.write("anarray", array) # CFile.write("disco:mob:secretary", "anarray", array) # shortcut # cfile.attributes['anarray'].each{|element| p element } #outputs: "stuff\nmorestuff" # eqarray = cfile.attributes['aneqarray'] # eqarray = CFile.attributes("disco:mob:secretary")['eqarray'] #shortcut # # Note: files and drawers will be created on demand by CFile::new require 'mysql' begin address = File.open("mysql.dat", "r").gets.chomp.split(/:/) rescue Logger.log("Couldn't load database info from mysql.dat!") exit end DB = Mysql.new(address[0], address[1], address[2], address[3]) class CFile def initialize(fname) @filename = fname fname = fname.split(":") @owner = fname[0] @drawer = fname[1] @file = fname[2] @table = "#{@owner}_#{@drawer}_#{@file}" @db = DB createTable if !tableExists? return self end def filename return @filename end def CFile.files(owner, drawer) filearr = Array.new DB.query("SELECT files,owner FROM drawers WHERE drawer LIKE '#{drawer}'").each_hash do |a| if a['owner'] == owner if a['files'].include?(";") a['files'].split(";").each{|file| filearr << file } else filearr << a['files'] end else return "This CFile does not have access to #{owner}:#{drawer}." #raise exception end end return filearr end def getData(owner = @owner, drawer = @drawer, file = @file, table = @table) datahash = Hash.new DB.query("SELECT * FROM #{table}").each_hash do |a| if a['value'].include?("::") datahash.store(a['key_'], a['value'].split("::")) else datahash.store(a['key_'], a['value']) if a['key_'] != nil end end return datahash end def attributes return CFile.new(@filename).getData end def [](key) data = CFile.new(@filename).getData return data.fetch(key) if data.key?(key) end def []=(key, value) if value.instance_of?(Array) @db.query("UPDATE `#{@table}` SET value='#{value.join("::")}' WHERE key_='#{key}'") if attributes.key?(key) @db.query("INSERT INTO `#{@table}` VALUES ('#{key}', '#{value.join("::")}')") if !attributes.key?(key) elsif value.instance_of?(String) @db.query("UPDATE #{@table} SET value='#{value}' WHERE key_='#{key}'") if attributes.key?(key) @db.query("INSERT INTO `#{@table}` VALUES ('#{key}', '#{value}')") if !attributes.key?(key) end return end def createTable @db.query("CREATE TABLE `#{@table}` (`key_` VARCHAR(50) NOT NULL, `value` TEXT, UNIQUE KEY `key_` (`key_`))") end def tableExists?(table = @table) begin @db.query("SELECT `key_` FROM `#{table}`") rescue return false else return true end end def CFile.write(fname, key, value) CFile.new(fname)[key] = value return end end