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.
- data/lib/rdomino.rb +32 -0
- data/lib/rdomino/1modules.rb +77 -0
- data/lib/rdomino/database.rb +380 -0
- data/lib/rdomino/database_collection.rb +43 -0
- data/lib/rdomino/database_directory.rb +20 -0
- data/lib/rdomino/database_library.rb +34 -0
- data/lib/rdomino/databases/testdb.rb +9 -0
- data/lib/rdomino/document.rb +112 -0
- data/lib/rdomino/document_collection.rb +41 -0
- data/lib/rdomino/item.rb +57 -0
- data/lib/rdomino/name.rb +9 -0
- data/lib/rdomino/richtext_item.rb +7 -0
- data/lib/rdomino/server.rb +22 -0
- data/lib/rdomino/session.rb +115 -0
- data/lib/rdomino/version.rb +3 -0
- data/lib/rdomino/view.rb +89 -0
- data/readme.rdoc +1 -0
- data/spec/helper.rb +1 -0
- data/spec/rdomino/database_directory_spec.rb +14 -0
- data/spec/rdomino/database_helper_spec.rb +17 -0
- data/spec/rdomino/database_spec.rb +111 -0
- data/spec/rdomino/datetime_spec.rb +12 -0
- data/spec/rdomino/document_collection_spec.rb +56 -0
- data/spec/rdomino/document_spec.rb +55 -0
- data/spec/rdomino/dxl_spec.rb +16 -0
- data/spec/rdomino/item_spec.rb +26 -0
- data/spec/rdomino/name_spec.rb +13 -0
- data/spec/rdomino/session_spec.rb +46 -0
- data/spec/rdomino/view_spec.rb +43 -0
- metadata +132 -0
@@ -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,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
|
data/lib/rdomino/item.rb
ADDED
@@ -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
|
data/lib/rdomino/name.rb
ADDED
@@ -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
|