p2ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.gitignore +27 -0
  2. data/HISTORY +7 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +24 -0
  5. data/Rakefile +42 -0
  6. data/VERSION +1 -0
  7. data/bin/olegen.rb +368 -0
  8. data/features/p2ruby.feature +9 -0
  9. data/features/step_definitions/p2ruby_steps.rb +0 -0
  10. data/features/support/env.rb +10 -0
  11. data/features/support/world.rb +12 -0
  12. data/lib/extension.rb +19 -0
  13. data/lib/ole20110223-013209.rb +1677 -0
  14. data/lib/p2ruby/application.rb +111 -0
  15. data/lib/p2ruby/base.rb +59 -0
  16. data/lib/p2ruby/connection.rb +250 -0
  17. data/lib/p2ruby/data_stream.rb +215 -0
  18. data/lib/p2ruby/library.rb +24 -0
  19. data/lib/p2ruby/message.rb +150 -0
  20. data/lib/p2ruby/message_factory.rb +70 -0
  21. data/lib/p2ruby/record.rb +104 -0
  22. data/lib/p2ruby/router.rb +45 -0
  23. data/lib/p2ruby/table_set.rb +166 -0
  24. data/lib/p2ruby.rb +156 -0
  25. data/lib/version.rb +8 -0
  26. data/lib/win32ole-pr.rb +5540 -0
  27. data/spec/encoding_spec.rb +15 -0
  28. data/spec/p2ruby/application_spec.rb +35 -0
  29. data/spec/p2ruby/connection_spec.rb +293 -0
  30. data/spec/p2ruby/data_stream_spec.rb +218 -0
  31. data/spec/p2ruby/library_spec.rb +42 -0
  32. data/spec/p2ruby/message_factory_spec.rb +69 -0
  33. data/spec/p2ruby/message_spec.rb +159 -0
  34. data/spec/p2ruby/record_spec.rb +85 -0
  35. data/spec/p2ruby/router_spec.rb +54 -0
  36. data/spec/p2ruby/table_set_spec.rb +132 -0
  37. data/spec/p2ruby_spec.rb +46 -0
  38. data/spec/spec_helper.rb +78 -0
  39. data/tasks/common.rake +18 -0
  40. data/tasks/doc.rake +14 -0
  41. data/tasks/gem.rake +40 -0
  42. data/tasks/git.rake +34 -0
  43. data/tasks/spec.rake +16 -0
  44. data/tasks/version.rake +71 -0
  45. metadata +149 -0
@@ -0,0 +1,150 @@
1
+ module P2
2
+ # Represents P2 Message
3
+ # ������ ������������ ��� �������� ���������. ��� ���� �� ��������� ��� �������� ���������
4
+ # ����������� �� ������ ������ ��������� �� ��������� (�������� � P2ClientGate.ini),
5
+ # � ������������� ����� ������� ���������, ����������� �� ��������� ������.
6
+ # ���� ��������� ������������ ������ ����� ���������, ������� ��� ������������� �������
7
+ # ������� ���������������� ini-����, ���������� ����� �����.
8
+ #
9
+ class Message < Base
10
+ CLSID = '{A9A6C936-5A12-4518-9A92-90D75B41AF18}'
11
+ PROGID = 'P2ClientGate.P2BLMessage.1'
12
+
13
+ def initialize opts = {}
14
+ super opts
15
+ end
16
+
17
+ # analyses message as a server reply, returns result text
18
+ def parse_reply(encode = nil)
19
+ category = self.Field["P2_Category"]
20
+ type = self.Field["P2_Type"]
21
+
22
+ res = "Reply category: #{category}, type #{type}. " +
23
+ if category == "FORTS_MSG" && type == 101
24
+ code = self.Field["code"]
25
+ if code == 0
26
+ "Adding order Ok, Order_id: #{self.Field["order_id"]}."
27
+ else
28
+ "Adding order fail, logic error: #{self.Field["message"]}"
29
+ end
30
+ elsif category == "FORTS_MSG" && type == 100
31
+ "Adding order fail, system level error: " +
32
+ "#{self.Field["code"]} #{self.Field["message"]}"
33
+ else
34
+ "Unexpected MQ message recieved."
35
+ end
36
+
37
+ if encode
38
+ res.force_encoding('IBM866').encode(encode, :undef => :replace)
39
+ else
40
+ res
41
+ end
42
+ end
43
+
44
+ # Auto-generated OLE methods:
45
+
46
+ # property BSTR Name
47
+ # ��� ��������� - �������� ini-�����
48
+ def Name()
49
+ @ole._getproperty(1, [], [])
50
+ end
51
+
52
+ # property UI4 Id
53
+ def Id()
54
+ @ole._getproperty(2, [], [])
55
+ end
56
+
57
+ # property BSTR Version
58
+ def Version()
59
+ @ole._getproperty(3, [], [])
60
+ end
61
+
62
+ # property BSTR DestAddr
63
+ # ����� ����������.
64
+ def DestAddr()
65
+ @ole._getproperty(4, [], [])
66
+ end
67
+
68
+ # property VOID DestAddr
69
+ # ����� ����������.
70
+ def DestAddr=(val)
71
+ @ole._setproperty(4, [val], [VT_BSTR])
72
+ end
73
+
74
+ # property VARIANT Field
75
+ # ��������, ����������� ���� ���������. ��� ��������� �� ����� ���� ��������
76
+ # ��� ������ ��� ��������. � ����������� ��������� �������������� ��������� ����:
77
+ # ? P2_From � ��������� ���� � ����������� ���������.
78
+ # ? P2_To � ��������� ���� � ���������� ���������.
79
+ # ? P2_Type � ������ ����� � ��� ���������.
80
+ # ? P2_SendId � ������ ���� � ������������� ���������� ���������.
81
+ # ? P2_ReplyId � ������ ���� � ������ �� ������������� ������������� ���������.
82
+ # ? P2_Category � ��������� ���� � ��������� ���������.
83
+ # ? P2_Body � ���� ���������� ����� � ���� ���������.
84
+ # ������������ ����� ��������� ���� ���� � ���������.
85
+ # � ��������� ���� ����� ���������� ��� � ���� ���������, ��������, ����������������
86
+ # � ���������������� ����, ��� � ���������� �� ����� � ���� Body. ����� ���������
87
+ # �������� � ini-����� (�� ��������� P2ClientGate.ini). �� ��������� ����� ���������
88
+ # ������ ��� ����� �� � ������ message. ����� ��������� ������������� ���������
89
+ # ������, ������������� � �����. ��� �������� ����� ��������� ������������� �����������
90
+ # �������� �������� ���� �� ���������. �������� �� ��������� ������������� �������������
91
+ # � ��������� ��� ��� ��������. ��� ��������� �� �������� ������ ��� ��� ���� ���������.
92
+ # ������ ��������: field=<��� ����>,<���>,,<�������� �� ���������>.
93
+ # BSTR name [IN]
94
+ def Field
95
+ @_Field ||= OLEProperty.new(@ole, 5, [VT_BSTR], [VT_BSTR, VT_VARIANT])
96
+ end
97
+
98
+ # I8 FieldAsLONGLONG: property FieldAsULONGLONG
99
+ # ������ �������� ����, ����������������� � LONGLONG � ��������� ������� ��������.
100
+ # ������� ��� ����� ���� u1, u2, u4, u8, i1, i2, i4, i8, a, d, s, t, f.
101
+ # BSTR name [IN]
102
+ def FieldAsLONGLONG
103
+ @_FieldAsLONGLONG ||= OLEProperty.new(@ole, 10, [VT_BSTR], [VT_BSTR, VT_I8])
104
+ end
105
+
106
+ # method IP2BLMessage Send
107
+ # �������� ��������� ���� Send.
108
+ # IP2Connection conn [IN]
109
+ # UI4 timeout [IN]
110
+ # [out,retval] IP2BLMessage** reply);
111
+ def Send(conn, timeout)
112
+ conn = conn.respond_to?(:ole) ? conn.ole : conn
113
+ reply = @ole._invoke(6, [conn, timeout], [VT_BYREF|VT_DISPATCH, VT_UI4])
114
+ P2::Message.new :ole => reply
115
+ end
116
+
117
+ # method VOID Post
118
+ # �������� ��������� ���� Post.
119
+ # IP2Connection conn [IN]
120
+ def Post(conn)
121
+ @ole._invoke(7, [conn], [VT_BYREF|VT_DISPATCH])
122
+ end
123
+
124
+ # method VOID SendAsync
125
+ # ����������� �������� ��������� ���� Send (��� ���������� ������).
126
+ # � conn � ��������� �� ��������� ����������;
127
+ # � timeout � ������� � �������������, � ������� �������� ��������� �������� ���������;
128
+ # � event � ��������� �� ��������� ��������� ������ (��������� IP2AsyncMessageEvents).
129
+ # IP2Connection conn [IN]
130
+ # UI4 timeout [IN]
131
+ # DISPATCH event [IN]
132
+ def SendAsync(conn, timeout, event)
133
+ @ole._invoke(8, [conn, timeout, event], [VT_BYREF|VT_DISPATCH, VT_UI4, VT_DISPATCH])
134
+ end
135
+
136
+ # method VOID SendAsync2
137
+ # ����������� �������� ��������� ���� Send. ������� � ���������� � ������ SendAsync.
138
+ # � ��� ������������ ������ ��������� ��������� ������ (��������� IP2AsyncSendEvent2),
139
+ # � ����� ���������� �������������� ��������, ��� ��������� ������� ���� ����������
140
+ # �� ��������� ���������.
141
+ # IP2Connection conn [IN]
142
+ # UI4 timeout [IN]
143
+ # DISPATCH event [IN]
144
+ # I8 event_param [IN]
145
+ def SendAsync2(conn, timeout, event, event_param)
146
+ @ole._invoke(9, [conn, timeout, event, event_param], [VT_BYREF|VT_DISPATCH, VT_UI4, VT_DISPATCH, VT_I8])
147
+ end
148
+ end
149
+ end # module P2
150
+
@@ -0,0 +1,70 @@
1
+ module P2
2
+ # Represents P2 Message Factory
3
+ # ������ ������������ ��� �������� ���������. ��� ���� �� ��������� ��� �������� ���������
4
+ # ����������� �� ������ ������ ��������� �� ��������� (�������� � P2ClientGate.ini),
5
+ # � ������������� ����� ������� ���������, ����������� �� ��������� ������.
6
+ # ���� ��������� ������������ ������ ����� ���������, ������� ��� ������������� �������
7
+ # ������� ���������������� ini-����, ���������� ����� �����.
8
+ #
9
+ class MessageFactory < Base
10
+ CLSID = '{501786DA-CA02-45C1-B815-1C58C383265D}'
11
+ PROGID = 'P2ClientGate.P2BLMessageFactory.1'
12
+
13
+ def initialize opts = {}
14
+ # # First we need to obtain Application instance... Yes, it IS freaking weird.
15
+ error "Connection/Application should be created first" unless P2::Application.instance
16
+
17
+ @ini = Pathname(opts[:ini] || "./p2fortsgate_messages.ini")
18
+ error "Wrong ini file name" unless @ini.expand_path.exist?
19
+
20
+ super opts
21
+
22
+ @ole.Init @ini.to_s, "Not used"
23
+ end
24
+
25
+ # Creates wrapped OLE Message object (by name or options Hash)
26
+ def message *args
27
+ case args.size
28
+ when 1
29
+ if args.last.is_a? Hash
30
+ opts = args.last
31
+ name = opts[:name]
32
+ else
33
+ opts = {}
34
+ name = args.last
35
+ end
36
+ when 2
37
+ opts = args.last
38
+ name = args.first
39
+ else
40
+ raise ArgumentError.new
41
+ end
42
+ message = name ? CreateMessageByName(name) : CreateMessageById(opts[:id])
43
+ P2::Message.new opts.merge(:ole => message)
44
+ end
45
+
46
+ # Auto-generated OLE methods:
47
+
48
+ # method VOID Init - ������������� �������.
49
+ # BSTR struct_file [IN] � ����, ���������� ����� ���������.
50
+ # BSTR sign_file [IN] � �� ������������.
51
+ def Init(struct_file, sign_file)
52
+ @ole._invoke(1, [struct_file, sign_file], [VT_BSTR, VT_BSTR])
53
+ end
54
+
55
+ # method IP2BLMessage CreateMessageByName - �������� ��������� �� �����.
56
+ # !!! creates raw (unwrapped) OLE message objects
57
+ # BSTR msg_name [IN]
58
+ # [out,retval] IP2BLMessage** newMsg)
59
+ def CreateMessageByName(msg_name)
60
+ @ole._invoke(2, [msg_name], [VT_BSTR])
61
+ end
62
+
63
+ # method IP2BLMessage CreateMessageById
64
+ # UI4 msg_id [IN]
65
+ def CreateMessageById(msg_id)
66
+ @ole._invoke(3, [msg_id], [VT_UI4])
67
+ end
68
+
69
+ end
70
+ end # module P2
@@ -0,0 +1,104 @@
1
+ module P2
2
+
3
+ # Represents single Table Record.
4
+ # ������ ������������ ��� ������ � ��������.
5
+ #
6
+ class Record < Base
7
+ CLSID = '{76033FC9-8BB0-4415-A785-9BF86AAF4E99}'
8
+ PROGID = nil
9
+
10
+ include Enumerable
11
+
12
+ def initialize opts = {}
13
+ super opts
14
+ end
15
+
16
+ # Record text representation
17
+ def to_s
18
+ each.join '|' || ''
19
+ end
20
+
21
+ # Access Record's fields by either name or index, encoding is
22
+ # converted to Windows-1251
23
+ def [] id
24
+ case id
25
+ when Integer
26
+ GetValAsStringByIndex(id)
27
+ else
28
+ GetValAsString(id.to_s)
29
+ end.force_encoding('IBM866').encode('CP1251', :undef => :replace)
30
+ end
31
+
32
+ # Yields all fields (basis for mixed in Enumerable methods)
33
+ def each
34
+ if block_given?
35
+ (0...Count()).each { |i| yield self[i] }
36
+ else
37
+ (0...Count()).map { |i| self[i] }
38
+ end
39
+ end
40
+
41
+ # Auto-generated OLE methods:
42
+
43
+ # property UI4 Count
44
+ def Count()
45
+ _getproperty(1, [], [])
46
+ end
47
+
48
+ # method BSTR GetValAsString
49
+ # BSTR field_name [IN]
50
+ def GetValAsString(field_name)
51
+ _invoke(2, [field_name], [VT_BSTR])
52
+ end
53
+
54
+ # method BSTR GetValAsStringByIndex
55
+ # UI4 field_index [IN]
56
+ def GetValAsStringByIndex(field_index)
57
+ _invoke(3, [field_index], [VT_UI4])
58
+ end
59
+
60
+ # method I4 GetValAsLong
61
+ # BSTR field_name [IN]
62
+ def GetValAsLong(field_name)
63
+ _invoke(4, [field_name], [VT_BSTR])
64
+ end
65
+
66
+ # method I4 GetValAsLongByIndex
67
+ # UI4 field_index [IN]
68
+ def GetValAsLongByIndex(field_index)
69
+ _invoke(5, [field_index], [VT_UI4])
70
+ end
71
+
72
+ # method I2 GetValAsShort
73
+ # BSTR field_name [IN]
74
+ def GetValAsShort(field_name)
75
+ _invoke(6, [field_name], [VT_BSTR])
76
+ end
77
+
78
+ # method I2 GetValAsShortByIndex
79
+ # UI4 field_index [IN]
80
+ def GetValAsShortByIndex(field_index)
81
+ _invoke(7, [field_index], [VT_UI4])
82
+ end
83
+
84
+ # method VARIANT GetValAsVariant
85
+ # BSTR field_name [IN]
86
+ def GetValAsVariant(field_name)
87
+ _invoke(8, [field_name], [VT_BSTR])
88
+ end
89
+
90
+ # method VARIANT GetValAsVariantByIndex
91
+ # UI4 field_index [IN]
92
+ def GetValAsVariantByIndex(field_index)
93
+ _invoke(9, [field_index], [VT_UI4])
94
+ end
95
+
96
+ # HRESULT GetRec
97
+ # OLE_HANDLE p_val [OUT]
98
+ def GetRec(p_val)
99
+ keep_lastargs _invoke(1610678272, [p_val], [VT_BYREF|VT_BYREF|VT_DISPATCH])
100
+ end
101
+ end
102
+ end # module P2
103
+
104
+
@@ -0,0 +1,45 @@
1
+ module P2
2
+ # Represents external Driver for P2 Router server app
3
+ class Router
4
+ ROUTER_TITLE = Regexp.new('P2MQRouter - ')
5
+ include P2
6
+
7
+ def self.find
8
+ router = WinGui::App.find :title => ROUTER_TITLE
9
+ router ? new(:app => router) : nil
10
+ end
11
+
12
+ attr_reader :opts, :app
13
+
14
+ def initialize opts = {}
15
+ @opts = opts.dup
16
+ if @opts[:app]
17
+ @app = @opts[:app]
18
+ else
19
+ @opts[:ini] = Pathname(@opts[:ini] || @opts[:ini_file] || "./client_router.ini")
20
+ error "Wrong ini file name" unless @opts[:ini].expand_path.exist? || @opts[:args]
21
+
22
+ @opts[:title] ||= ROUTER_TITLE
23
+ @opts[:path] ||= @opts[:dir] && @opts[:dir] + 'P2MQRouter.exe'
24
+ @opts[:args] ||= "/ini:#{@opts[:ini]}"
25
+ @opts[:timeout] ||= 3
26
+
27
+ @app = WinGui::App.launch(:dir => @opts[:dir],
28
+ :path => @opts[:path],
29
+ :args => @opts[:args],
30
+ :title => @opts[:title],
31
+ :timeout => @opts[:timeout])
32
+ end
33
+ end
34
+
35
+ def method_missing *args
36
+ @app.send *args
37
+ end
38
+
39
+ def title
40
+ @app.main_window.title
41
+ end
42
+
43
+ end # class Router
44
+ end # module P2
45
+
@@ -0,0 +1,166 @@
1
+ module P2
2
+
3
+ # Represents TableSet.
4
+ # ������ ������������ ��� ������ � ���������� ������ ����������.
5
+ # ������ TableSet �������� ���� ������������ ��������� � IP2TableSet.
6
+ # ������ ������ ������������ ����������� ���������� ������������ � ���.
7
+ #
8
+ class TableSet < Base
9
+ CLSID = '{C52E4892-894B-4C03-841F-97E893F7BCAE}'
10
+ PROGID = 'P2ClientGate.P2TableSet.1'
11
+
12
+ # include Enumerable
13
+
14
+ def initialize opts = {}
15
+ super(opts) do
16
+ if opts[:ini] && opts[:scheme]
17
+ InitFromIni2(opts[:ini], opts[:scheme])
18
+ elsif opts[:ini]
19
+ InitFromIni(opts[:ini], '')
20
+ end
21
+ end
22
+ end
23
+
24
+ # # Record text representation
25
+ # def to_s
26
+ # each.join '|' || ''
27
+ # end
28
+ #
29
+ # # Access Record's fields by either name or index, encoding is
30
+ # # converted to Windows-1251
31
+ # def [] id
32
+ # case id
33
+ # when Integer
34
+ # GetValAsStringByIndex(id)
35
+ # else
36
+ # GetValAsString(id.to_s)
37
+ # end.force_encoding('IBM866').encode('CP1251', :undef => :replace)
38
+ # end
39
+ #
40
+ # # Yields all fields (basis for mixed in Enumerable methods)
41
+ # def each
42
+ # if block_given?
43
+ # (0...Count()).each { |i| yield self[i] }
44
+ # else
45
+ # (0...Count()).map { |i| self[i] }
46
+ # end
47
+ # end
48
+ #
49
+
50
+ # Auto-generated OLE methods:
51
+
52
+ # property I4 Count - ��������� ����� ������, ������������ � ����� ����������.
53
+ def Count()
54
+ @ole._getproperty(7, [], [])
55
+ end
56
+
57
+ # property I4 LifeNum � ����� ����� ����� ���� ������.
58
+ def LifeNum()
59
+ @ole._getproperty(11, [], [])
60
+ end
61
+
62
+ # property VOID LifeNum � ����� ����� ����� ���� ������.
63
+ def LifeNum=(val)
64
+ @ole._setproperty(11, [val], [VT_I4])
65
+ end
66
+
67
+ # property BSTR FieldList
68
+ # ����� ����� �� �������� �������. ��������� ��� ������� ����� �������� ������,
69
+ # � ������� ������������� ��� ���� � ���� �������.
70
+ # BSTR table_name [IN]
71
+ def FieldList
72
+ @_FieldList ||= OLEProperty.new(@ole, 4, [VT_BSTR], [VT_BSTR, VT_BSTR])
73
+ end
74
+
75
+ # I8 rev: property Rev
76
+ # ������������ �������� ���������� ���� rev (revision) � �������. ���� rev �
77
+ # ������������� ��������� ������ � �������. ������ ������������� ������������
78
+ # ��� ������������ ��������������� ������ � ��������� �� � ���������� �����.
79
+ # ��������� ����� rev �������� �������� � ������ ����� �������. ��� ��������
80
+ # � ��������� ������ ���� rev ������������� ��������, ������� �������������
81
+ # �������� ���� rev � �������.
82
+ #
83
+ # �������� ���������, ��� ������ ���� ��������, ��� � �������� ���. �����������
84
+ # �������� �������� ��������� ������������ ��������� ������ �� ��������� ������,
85
+ # ������� � ������������ �������� ���������. ��� ����� ������� � ������ ��������
86
+ # ��� ��������� ������ ������ �������� ���������, � ����� ���������� ������ TableSet
87
+ # � IP2DataStream ��� �������� ������ ������. � ��������� ��������� ��������, �
88
+ # ������� �������� ��������� �������� � �������, ������� �������� ��� �����������
89
+ # �������.
90
+ #
91
+ # BSTR table_name [IN]
92
+ def Rev
93
+ @_rev ||= OLEProperty.new(@ole, 5, [VT_BSTR], [VT_BSTR, VT_I8])
94
+ end
95
+
96
+ alias rev Rev
97
+
98
+ # property BSTR FieldTypes
99
+ # ???????? Not documected.............
100
+ # BSTR table_name [IN]
101
+ def FieldTypes
102
+ @_FieldTypes ||= OLEProperty.new(@ole, 9, [VT_BSTR], [VT_BSTR, VT_BSTR])
103
+ end
104
+
105
+ # method VOID InitFromIni
106
+ # ������������� ������� � �������� �� ini-����� ���������� ����� ����������.
107
+ # ��� ����� (CustReplScheme) ������ ������� � ����. ���� ������������ ���������
108
+ # �����, �� �������� ���������� ����� �� ���������.
109
+ #
110
+ # BSTR struct_file [IN] � ����, ���������� ���������� ����� ����������.
111
+ # BSTR sign_file [IN] � �� ������������.
112
+ def InitFromIni(struct_file, sign_file)
113
+ @ole._invoke(1, [struct_file.to_s, sign_file.to_s], [VT_BSTR, VT_BSTR])
114
+ end
115
+
116
+ # method VOID InitFromIni2
117
+ # ������������� ������� � �������� �� ini-����� ���������� ����� ����������.
118
+ # � ������� �� ������ InitFromIni ������ ������� ��������� ������� � �����
119
+ # ini-����� ��������� ���� ��� ������ ������� ���������� � �����������
120
+ # ����������� ������ ���� �����.
121
+ #
122
+ # BSTR ini_file_name [IN] � ����, ���������� ���������� ����� ����������.
123
+ # BSTR scheme_name [IN] � ��� ���������� ����� ����������.
124
+ def InitFromIni2(ini_file_name, scheme_name)
125
+ @ole._invoke(10, [ini_file_name.to_s, scheme_name.to_s], [VT_BSTR, VT_BSTR])
126
+ end
127
+
128
+ # method VOID InitFromDB
129
+ # BSTR connect_string [IN]
130
+ # BSTR sign_file [IN]
131
+ def InitFromDB(connect_string, sign_file)
132
+ @ole._invoke(2, [connect_string.to_s, sign_file.to_s], [VT_BSTR, VT_BSTR])
133
+ end
134
+
135
+ # method VOID SetLifeNumToIni - ���������� ������ ����� ����� � ��� �����.
136
+ # BSTR ini_file_name [IN] � ����, ���������� ���������� ����� ����������.
137
+ def SetLifeNumToIni(ini_file_name)
138
+ @ole._invoke(12, [ini_file_name.to_s], [VT_BSTR])
139
+ end
140
+
141
+ # method VOID AddTable
142
+ # BSTR table_name [IN]
143
+ # BSTR fieldl_list [IN]
144
+ # UI8 rev [IN]
145
+ def AddTable(table_name, fieldl_list, rev)
146
+ @ole._invoke(3, [table_name, fieldl_list, rev], [VT_BSTR, VT_BSTR, VT_UI8])
147
+ end
148
+
149
+ # method VOID DeleteTable
150
+ # BSTR table_name [IN]
151
+ def DeleteTable(table_name)
152
+ @ole._invoke(6, [table_name], [VT_BSTR])
153
+ end
154
+
155
+ def NewEnum
156
+ @ole._invoke(8, [], [])
157
+ end
158
+
159
+ # HRESULT GetScheme
160
+ # OLE_HANDLE p_val [OUT]
161
+ def GetScheme(p_val)
162
+ keep_lastargs @ole._invoke(1610678272, [p_val], [VT_BYREF|VT_BYREF|VT_DISPATCH])
163
+ end
164
+
165
+ end
166
+ end # module P2