rdomino 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+ module Rdomino
2
+
3
+ # Replicated
4
+ class DatabaseCollection
5
+ attr_reader :databases
6
+ include Enumerable
7
+
8
+ class << self
9
+ def create_by_path *db_strings
10
+ dbs = db_strings.flatten.map do |db_string|
11
+ Database.new( nil, db_string)
12
+ end
13
+ new dbs
14
+ end
15
+ end
16
+
17
+ def initialize(databases)
18
+ @databases = databases
19
+ end
20
+
21
+ def each
22
+ @databases.each do |database|
23
+ yield database
24
+ end
25
+ end
26
+
27
+ def get_all_documents_by_key(view,key)
28
+ @databases.each do |database|
29
+ database[view].get_all_documents_by_key(key).each do|doc|
30
+ yield database.server, doc
31
+ end
32
+ end
33
+ end
34
+
35
+ def method_missing(m,*args)
36
+ @databases.map do |database|
37
+ database.__send__(m,*args)
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,20 @@
1
+ module Rdomino
2
+
3
+ class DatabaseDirectory
4
+ include DomObject, Enumerable
5
+ def initialize(server,pattern=//)
6
+ @obj = Session.session.getdbdirectory(server)
7
+ @pattern = pattern
8
+ end
9
+
10
+ def each(pattern=nil)
11
+ db = @obj.getfirstdatabase(1247) # Any Notes database (NSF, NSG, or NSH file)
12
+ while db
13
+ yield(Database.new(nil,db)) if db.filepath.match(@pattern)
14
+ db = @obj.getnextdatabase
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,34 @@
1
+ module Rdomino
2
+
3
+ class DatabaseLibrary
4
+
5
+ include Enumerable
6
+ attr_reader :database,:view
7
+
8
+ def initialize(db)
9
+ @database = Database.new(db)
10
+ @view = database.get_view("DS2000/all")
11
+ @databases = {}
12
+ @views = {}
13
+ end
14
+
15
+ def find(dbkey,key=nil)
16
+ unless @databases[dbkey]
17
+ doc = view.get_document_by_key(dbkey)
18
+ @databases[dbkey] = Database.new(database.server,doc.getItemValue("pathname")[0])
19
+ end
20
+ if key
21
+ unless @views[dbkey]
22
+ @views[dbkey] = @databases[dbkey].get_view("(DirSync-G2)")
23
+ puts "| init view in #{dbkey}"
24
+ end
25
+ @views[dbkey].get_document_by_key(key)
26
+ else
27
+ @databases[dbkey]
28
+ end
29
+ #Openbyreplicaid(byval server as string, byval replicaid as string) as variant
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,9 @@
1
+ module Rdomino
2
+ module Databases
3
+ module Testdb
4
+ def foo
5
+ "bar"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,112 @@
1
+ module Rdomino
2
+
3
+ class Document
4
+
5
+ include DomObject, Enumerable, DbDcDoc
6
+
7
+ def created
8
+ DateTime.strptime(obj.created,'%Y/%m/%d %H:%M:%S')
9
+ end
10
+
11
+ def replace(h)
12
+ # puts "#{@obj}.send #{m} #{args.inspect}"
13
+ h.each do |item,value|
14
+ @obj.replaceItemValue(item.to_s,value)
15
+ end
16
+ self
17
+ end
18
+
19
+ def get(item)
20
+ # puts "#{@obj}.send #{m} #{args.inspect}"
21
+ @obj.getItemValue(item.to_s)
22
+ end
23
+
24
+ def g(item)
25
+ get(item)[0]
26
+ end
27
+
28
+ def form
29
+ getItemValue('Form')[0]
30
+ end
31
+
32
+ # returns array of changed items
33
+ def update_attributes(h)
34
+ changed = []
35
+ h.each do |key,value|
36
+ unless g(key) == value
37
+ changed << "#{key}:#{ self.g(key) }->#{value}"
38
+ @obj.replaceItemValue(key.to_s, value)
39
+ end
40
+ end
41
+ unless changed.empty?
42
+ save
43
+ changed.join(', ')
44
+ end
45
+ end
46
+
47
+ #
48
+ def pp(by_type=nil)
49
+ if @obj
50
+ puts "\n#{self.getItemValue('Form')[0]}"
51
+ puts " %-22s %-32s" % ['id',id]
52
+ puts " %-22s %-32s" % ['unid',unid]
53
+ items = self.items.map{|i| [i.name,i.type,i.text]}.sort_by{|a| ( by_type ? a[1].to_s : "" )+a[0] }
54
+ items.each do |i|
55
+ puts " %-22s %-10s %-30s" % i
56
+ end
57
+ else
58
+ puts "empty!"
59
+ end
60
+ self
61
+ end
62
+
63
+ def items
64
+ @obj.items.map{|i| Item.new(i)}
65
+ end
66
+
67
+ def find_or_create_item(i)
68
+ replace i => '' unless obj.hasitem i.to_s
69
+ self.[](i)
70
+ end
71
+
72
+ def [](itemname)
73
+ Item.new(@obj.getfirstitem(itemname.to_s))
74
+ end
75
+
76
+ def copy_to_database(destination) #as notesdocument
77
+ Document.new( obj.CopyToDatabase(destination.obj) )
78
+ end
79
+
80
+ def move_to_database(destination)
81
+ target = copy_to_database(destination)
82
+ obj.remove(true)
83
+ target
84
+ end
85
+
86
+ def create_empty_fields(fields)
87
+ changed = 0
88
+ fields.each do |field|
89
+ unless @obj.hasItem(field)
90
+ @obj.replaceItemValue(field,'')
91
+ changed += 1
92
+ end
93
+ end
94
+ save if changed > 0
95
+ changed
96
+ end
97
+
98
+ def save( force=true, make_response=false )
99
+ @obj.save(force, make_response)
100
+ end
101
+
102
+ def id
103
+ obj.noteid
104
+ end
105
+
106
+ def unid
107
+ obj.universalid
108
+ end
109
+
110
+ end
111
+
112
+ end
@@ -0,0 +1,41 @@
1
+ module Rdomino
2
+
3
+ class DocumentCollection
4
+ include DomObject, Enumerable, DcView, DbDcDoc
5
+ def initialize(o)
6
+ @obj = o
7
+ end
8
+
9
+ def first
10
+ Document.new(@obj.getfirstdocument )
11
+ end
12
+
13
+ def last
14
+ Document.new(@obj.getlastdocument )
15
+ end
16
+
17
+ def update_attributes( hash )
18
+ message = hash.map { |k,v| "FIELD #{k}:=#{v}"}.join("; ")
19
+ if obj.count == 0
20
+ 0
21
+ elsif ask("Should I stamp #{obj.count} Documents in #{obj.parent.title} () ? (y/n)") == "y"
22
+ update_attributes!( hash )
23
+ end
24
+ end
25
+
26
+ def each_limit(limit=2)
27
+ each_with_index do |doc,index|
28
+ break if index >= limit
29
+ yield doc
30
+ end
31
+ end
32
+
33
+ def update_attributes!( hash )
34
+ hash.each do |k,v|
35
+ obj.stampall(k.to_s, v )
36
+ end
37
+ obj.count
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,57 @@
1
+ module Rdomino
2
+
3
+ class Item
4
+ include DomObject
5
+ TYPES = {16 => :actioncd,
6
+ 17 => :assistantinfo,
7
+ 1084 => :attachment,
8
+ 1076 => :authors,
9
+ 2 => :collation,
10
+ 1024 => :datetimes,
11
+ 1090 => :embeddedobject,
12
+ 256 => :erroritem,
13
+ 1536 => :formula,
14
+ 21 => :html,
15
+ 6 => :icon,
16
+ 20 => :lsobject,
17
+ 25 => :mime_part,
18
+ 1074 => :names,
19
+ 7 => :notelinks,
20
+ 4 => :noterefs,
21
+ 768 => :numbers,
22
+ 1085 => :otherobject,
23
+ 15 => :querycd,
24
+ 1075 => :readers,
25
+ 1282 => :rfc822text,
26
+ 1 => :richtext,
27
+ 8 => :signature,
28
+ 1280 => :text,
29
+ 512 => :unavailable,
30
+ 0 => :unknown,
31
+ 14 => :userdata,
32
+ 1792 => :userid,
33
+ 18 => :viewmapdata,
34
+ 19 => :viewmaplayout}
35
+
36
+ def initialize(obj)
37
+ @obj = obj
38
+ end
39
+
40
+ def type
41
+ a = @obj.Type
42
+ TYPES[a] || a
43
+ end
44
+
45
+ def <<(s)
46
+ obj.AppendToTextList s
47
+ end
48
+
49
+ # RTELEM_TYPE_DOCLINK (5)
50
+ # RTELEM_TYPE_FILEATTACHMENT (8)
51
+ # RTELEM_TYPE_OLE (9)
52
+ # RTELEM_TYPE_SECTION (6)
53
+ # RTELEM_TYPE_TABLE (1)
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,9 @@
1
+ module Rdomino
2
+ class Name
3
+ class << self
4
+ def abbreviated(s)
5
+ Session.session.Createname(s).abbreviated
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Rdomino
2
+
3
+ class RichtextItem
4
+ include DomObject
5
+ end
6
+
7
+ end
@@ -0,0 +1,22 @@
1
+ module Rdomino
2
+ class Server
3
+ class << self
4
+ def [](a)
5
+ new(a)
6
+ end
7
+ end
8
+
9
+ # :days_ago
10
+ def log(pattern,time)
11
+ s = "Form='Events'"
12
+ @log.search(s,time).each{|d|
13
+ puts d.getItemValue("Eventlist").select{|line| line.match(pattern)}
14
+ }
15
+ end
16
+
17
+ def initialize(server='BY0000')
18
+ @log = Session.get["#{server}!!log.nsf"]
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,115 @@
1
+ module Rdomino
2
+
3
+ class Session
4
+
5
+ class << self
6
+
7
+ attr_reader :session
8
+
9
+ # This is the entrypoint to the library. Without a parameter it load the RAILS environment
10
+ # or the test environment
11
+ # * production,plog
12
+ # * development: !!imbeh/server/path
13
+ # * test: !!imbeh/test/server/path
14
+ #
15
+ # Session.get 'plog'
16
+ def get(env = ((defined? RAILS_ENV) ? RAILS_ENV.downcase : "test"), user=nil )
17
+ @session ||= begin
18
+ if env.kind_of? Symbol
19
+ user = env
20
+ env = "plog"
21
+ end
22
+ pw = prepare_notes_ini(user)
23
+ print "opening domino session in #{env} environment..."
24
+ s = WIN32OLE.new('Lotus.NotesSession')
25
+ s.Initialize( pw )
26
+ puts "#{s.commonUserName} logged in"
27
+ s
28
+ end
29
+ @singleton ||= new(env)
30
+ end
31
+
32
+ def reload!
33
+ env = @singleton.env
34
+ @singleton = @session = nil
35
+ get(env)
36
+ end
37
+
38
+ def prepare_notes_ini(user)
39
+ authentification = YAML.load_file(File.dirname(__FILE__)+"/../config/auth.yml")
40
+ unless user
41
+ return (respond_to?(:mypw) ? mypw : ask('Domino password ?') { |q| q.echo = '*' } )
42
+ end
43
+ authentification[:me][:pw] = mypw
44
+ content = nil
45
+ File.open( authentification[:notes_ini], 'r') { |f| content = f.readlines }
46
+ File.open( authentification[:notes_ini], 'w') do |f|
47
+ content.each do |line|
48
+ key = line.split('=')[0]
49
+ if authentification[user].keys.include?(key)
50
+ f.write("#{key}=#{authentification[user][key]}\n")
51
+ else
52
+ f.write(line)
53
+ end
54
+ end
55
+ end
56
+ authentification[user][:pw]
57
+ end
58
+
59
+ def addressbooks
60
+ @addressbooks ||= session.Addressbooks.map{|db| Database.new(nil,db) }
61
+ end
62
+
63
+ def private_addressbooks
64
+ addressbooks.select{|db| db.Isprivateaddressbook }
65
+ end
66
+
67
+ def locations
68
+ private_addressbooks[0].open!['search:form="Location"']
69
+ end
70
+
71
+ end
72
+
73
+ def initialize(env)
74
+ @env = env
75
+ @configuration = YAML.load_file(File.dirname(__FILE__)+"/../config/database.yml")
76
+ @configuration['test']={}
77
+ @configuration['development']={}
78
+ @configuration['production'].each do |k,v|
79
+ server = v.match(/^([^\/]*)/)[1]
80
+ path = v.split("!!")[1]
81
+ @configuration['test'][k] = "!!imbeh\\test\\#{server}\\#{path}" unless @configuration['test'][k]
82
+ @configuration['development'][k] = "!!imbeh\\#{server}\\#{path}" unless @configuration['development'][k]
83
+ end
84
+ @db_view_cache = {} #{ :testdb => { nil => db, :key => view, }, ....}
85
+ end
86
+
87
+ attr_reader :configuration, :env
88
+ # ses = Session.get "test"
89
+ # ses[:db], d['server!!path'] => Database
90
+ # ses[:db,:viewname], d[:name, 'All Documents'] => View
91
+ # Databases and views will be cached in @@db { :db { nil => LotusDatabase, :view => LotusView, .. }, ...}
92
+ def [](name, view=nil, key=nil)
93
+ if value = @db_view_cache[name]
94
+ db = value[nil]
95
+ else
96
+ db = Database.new(name,server_path(name))
97
+ value = @db_view_cache[name] = { nil => db}
98
+ end
99
+ unless cached = value[view]
100
+ view_string = ( view.kind_of?(Symbol) ? @configuration[name][view] : view )
101
+ cached = db[ view_string ]
102
+ @db_view_cache[name][view] = cached if view.kind_of?(Symbol)
103
+ end
104
+ ( key ?
105
+ cached.get_document_by_key(key,true) :
106
+ cached )
107
+ end
108
+
109
+ def server_path(name)
110
+ name.kind_of?(Symbol) ? @configuration[@env][name] : name
111
+ end
112
+
113
+ end
114
+
115
+ end