4 ## all the sql queries are supposed to be here
5 ## TODO: THIS NEEDS A LOT WORK
10 COLUMNS = %w(prio tags key value descr onchg ctime mtime info1 info2 info3)
11 TYPES = %w(cmd map opt tag txt)
13 CREATE = "INSERT INTO nyu (type, key, value) VALUES (?, ?, ?)"
14 CREATE_OPT = "INSERT INTO nyu (type, key, value, info2) VALUES ('opt', ?, ?, ?)"
15 DELETE_ALL_CONFIG_DATA = "DELETE FROM nyu WHERE NOT (type='txt' or type='tag')"
17 TIME_LEFT = "SELECT info1 FROM nyu WHERE type='txt' AND (NOT info1='') AND info1>? AND tags GLOB '*/i/*' ORDER BY info1 LIMIT 1;"
18 GET_ALL_CONFIG_DATA = "SELECT * FROM nyu WHERE NOT (type='txt' OR type='tag')"
19 INSERT_WITHOUT_ROWID = "INSERT INTO nyu (key,type,ctime,mtime,prio,tags,value,descr,onchg,info1,info2,info3) VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?)"
20 UPDATE_CONFIG_DATA = "UPDATE nyu SET key=?, type=?, ctime=?, mtime=?, prio=?, tags=?, value=?, descr=?, onchg=?, info1=?, info2=?, info3=? WHERE type=? AND key=?"
22 TABLE_CREATION = <<SQL
24 rowid INTEGER PRIMARY KEY ASC,
41 INSERT = "INSERT INTO nyu"
42 INSERT2 = "#{INSERT} (key, type, value) VALUES"
44 SELECT = "SELECT * FROM nyu"
45 SELECT_VALUE = "SELECT value FROM nyu"
47 GET_NYURONS = "#{SELECT}"
50 SET[column] = "UPDATE nyu SET #{column}=? WHERE rowid=?"
56 sql_each_line DEFAULTS
61 x = sql_first(TIME_LEFT, Time.now.to_i)
62 # x = @@time_left.execute(Time.now.to_i).first
70 def export_options( fname )
71 fname = File.expand_path(fname)
72 assert_neq fname, File.expand_path(Info.dbfile),
73 "Cannot export to current database!"
75 db = SQLite3::Database.new( fname )
76 db.execute TABLE_CREATION
78 sql GET_ALL_CONFIG_DATA do |row|
80 db.execute(INSERT_WITHOUT_ROWID, *row)
86 def import_options( fname, loop_detected = false )
87 fname = File.expand_path(fname)
88 assert_neq fname, File.expand_path(Info.dbfile),
89 "Cannot import from current database!"
91 bk = "/tmp/nyu_backup_#{rand 100000}"
94 db = SQLite3::Database.new( fname )
96 sql DELETE_ALL_CONFIG_DATA
97 db.execute GET_ALL_CONFIG_DATA do |row|
99 sql(INSERT_WITHOUT_ROWID, *row)
105 Console.error "import failed"
107 import_options(bk, true)
115 def merge_options( fname )
116 fname = File.expand_path(fname)
117 assert_neq fname, File.expand_path(Info.dbfile),
118 "Cannot merge from current database!"
123 db = SQLite3::Database.new( fname )
124 db.execute GET_ALL_CONFIG_DATA do |row|
128 if mtime = Query.get_mtime_from_type_key(othertype, otherkey)
132 if mtime.nil? or (othertime and mtime < othertime)
133 sql UPDATE_CONFIG_DATA, *(row + [othertype, otherkey])
136 sql INSERT_WITHOUT_ROWID, *row
145 def exists?(type, key=nil)
146 sql_first("SELECT value FROM nyu WHERE type=? AND key=?", type, key)
149 def get_neurons(filter)
151 addnyurons = proc do |row|
152 list << Neuron.new(row)
156 query += " WHERE #{filter}" unless filter.strip.empty?
158 sql(query, &addnyurons)
159 rescue SQLite3::SQLException
162 sql(query, &addnyurons)
173 def set(rowid, key, val)
177 # option = nyuron.option? if key == 'value'
178 elsif SQLite3::ResultSet::ArrayWithTypesAndFields === rowid
179 rowid = rowid.first.to_i
182 assert rowid, Numeric
185 # set_option(nyuron.key, val) ## this will also eval the code of some options
187 # sql("UPDATE nyu SET #{key}=\"#{val.sql}\" WHERE rowid=#{rowid}")
189 sql SET[key], val, rowid
190 # @@set[key].execute(val, rowid)
194 # sql("UPDATE nyu SET #{key}=? WHERE rowid=?", val, rowid)
199 def create(type, key=nil, val=nil)
200 sql CREATE, type, key, val
201 # @@create.execute(type, key, val)
202 neuron = Neuron.from_rowid(sql_last_row)
206 alias create_and_return create
208 def create_opt(key=nil, val=nil, info2=nil)
209 sql CREATE_OPT, key, nil, info2
210 opt = Neuron.from_rowid(sql_last_row)
215 alias create_opt_and_return create_opt
218 rowid = rowid.rowid if Neuron === rowid
219 assert rowid, Numeric
221 sql_first("SELECT #{key} FROM nyu WHERE rowid=#{rowid}")
224 def get_mtime_from_type_key(type, key)
225 sql_first("SELECT mtime FROM nyu WHERE type=? AND key=?", type, key)
228 def get_all_where(str)
229 sql("SELECT * FROM nyu WHERE " + str)
232 def get_all_tagged_rows()
233 sql("SELECT tags FROM nyu WHERE tags IS NOT NULL")
238 sql("SELECT key FROM nyu WHERE type='tag'").map!{|x| x.first}
241 def get_key_val_of_type(type, &block)
242 sql("SELECT key, value FROM nyu WHERE type=?", type, &block)
245 def get_where(str, *args)
246 sql_first("SELECT * FROM nyu WHERE " + str, *args)
249 def get_mapping(keybuffer)
250 result = sql("#{SELECT_VALUE} WHERE type='map' AND key='#{keybuffer}' LIMIT 1").first
251 return result ? result.first : nil
254 def get_command(command)
255 result = sql("#{SELECT_VALUE} WHERE type='cmd' AND key='#{command}' LIMIT 1").first
256 return result ? result.first : nil
260 sql_first("SELECT info1 FROM nyu WHERE type='cmd' AND key='#{cmd}'")
263 def get_option_info(key)
264 sql_first("SELECT value, info2, info3 FROM nyu WHERE type='opt' AND key='#{key}'")
267 def all_reoccuring_notes(&block)
268 sql("SELECT * FROM nyu WHERE type='txt' AND NOT info2='' AND tags GLOB '*/r/*'", &block)
272 sql_first("SELECT count(*) FROM nyu").first.to_i
281 sql("DELETE FROM nyu WHERE rowid=#{what}")
284 def set_option(key, val)
285 result = Query.get_option_info(key)
286 oldval, types, code = result
290 if code.strip =~ /^alias (\w+)$/
291 code = Query.get_option_code($1)
292 throw :break unless String === code
294 env = Environment.new
298 env.oldvalue = oldval
300 result = env.run(code)
301 val = result unless result.nil?
305 Cache.opt[key.to_sym] = Convert.option(val,types)
306 sql("UPDATE nyu SET value=? WHERE type='opt' AND key=?", val, key)
309 def manage_tag(name, number = nil, rowid = nil)
310 return unless String === name and not name.empty?
311 assert number, Integer, NilClass
313 number = sql("SELECT count(*) FROM nyu WHERE tags glob '*#{Convert::TAG_SPLIT_STRING}#{name}#{Convert::TAG_SPLIT_STRING}*'")
317 rowid = sql_first("SELECT rowid FROM nyu WHERE type='tag' AND key=?", name)
320 set(rowid, "value", number)
322 create('tag', name, number)