rdomino 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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