transactd 1.0.1-x86-mswin32-100

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,113 @@
1
+ # coding : utf-8
2
+ =begin =============================================================
3
+ Copyright (C) 2013 BizStation Corp All rights reserved.
4
+
5
+ This program is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU General Public License
7
+ as published by the Free Software Foundation; either version 2
8
+ of the License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18
+ 02111-1307, USA.
19
+ ===================================================================
20
+ =end
21
+ def to_native_path(path)
22
+ return File::ALT_SEPARATOR ? path.gsub('/', File::ALT_SEPARATOR) : path
23
+ end
24
+
25
+ def to_slash_path(path)
26
+ return File::ALT_SEPARATOR ? path.gsub(File::ALT_SEPARATOR, '/') : path
27
+ end
28
+
29
+ def get_ruby_bitness
30
+ return ['a'].pack('P').length > 4 ? 64 : 32
31
+ end
32
+
33
+ def get_windows_bitness
34
+ return ENV.has_key?('ProgramFiles(x86)') ? 64 : 32
35
+ end
36
+
37
+ def get_windows_sysdir()
38
+ ruby_bitness = get_ruby_bitness()
39
+ windows_bitness = get_windows_bitness()
40
+ if windows_bitness == 32
41
+ return to_native_path(File.join(ENV['Systemroot'], 'System32/'))
42
+ else
43
+ if ruby_bitness == 32
44
+ return to_native_path(File.join(ENV['Systemroot'], 'SysWOW64/'))
45
+ else
46
+ return to_native_path(File.join(ENV['Systemroot'], 'System32/'))
47
+ end
48
+ end
49
+ end
50
+
51
+ def get_common_binary_files(transactd_gem_root)
52
+ ruby_bitness = get_ruby_bitness()
53
+ windows_bitness = get_windows_bitness()
54
+ ruby_bitness = 32 if windows_bitness == 32
55
+ bin_files = Dir.glob(File.join(transactd_gem_root, 'bin/common/tdclc_' + ruby_bitness.to_s + '_*.dll'))
56
+ bin_files += Dir.glob(File.join(transactd_gem_root, 'bin/common/tdclcpp_*_' + ruby_bitness.to_s + 'm_*.dll'))
57
+ sysdir = get_windows_sysdir()
58
+ bin_files = bin_files.map{ |i| '"' + to_native_path(i) + '" "' + sysdir + '"' }
59
+ return bin_files
60
+ end
61
+
62
+ def make_makefile_prebuilt_win32(ruby_bin_path, transactd_gem_root)
63
+ bin_files = get_common_binary_files(transactd_gem_root)
64
+ begin
65
+ mkfile_dummy = open('Makefile', 'w')
66
+ mkfile = open('nmake.cmd', 'w')
67
+ srcpath = File.join(transactd_gem_root, 'build/tdclrb/gem/Makefile.win32-prebuilt')
68
+ copycmd = File.join(transactd_gem_root, 'build/common/copyifgreater.cmd')
69
+ source = open(srcpath, 'r')
70
+ mkfile.puts '@echo off'
71
+ mkfile.puts 'set TRANSACTD_GEM_ROOT=' + to_native_path(transactd_gem_root)
72
+ mkfile.puts 'set RUBY_BIN_PATH=' + to_native_path(ruby_bin_path)
73
+ mkfile.puts 'set COPYCMD=' + to_native_path(copycmd)
74
+ mkfile.puts source.read
75
+ mkfile.puts ''
76
+ bin_files.each{ |i|
77
+ files = i.split(' ').map{ |i| i.strip.gsub!(/(^(\s|\"|)+)|((\s|\")+$)/, '')}
78
+ srcfile = (files.length > 0) ? files[0] : 'unknown error'
79
+ dstfile = (files.length > 1) ? files[1] : 'unknown error'
80
+ mkfile.puts <<EOS
81
+ call "%COPYCMD%" #{i} >> "%INSTALLLOG%" 2>> "%ERRMSG%"
82
+ call :getsize "%ERRMSG%"
83
+ if !getsize_ret! GTR 0 (
84
+ if ERRORLEVEL 1 (
85
+ echo ************************************************************** 1>&2
86
+ echo EROOR MESSAGE 1>&2
87
+ echo Failed to Install. 1>&2
88
+ echo Perhaps it require to run as Administrator, or file is in use. 1>&2
89
+ type "%ERRMSG%" 1>&2
90
+ echo ************************************************************** 1>&2
91
+ exit /b 1
92
+ ) else (
93
+ echo ************************************************************** >> "%INSTALLLOG%"
94
+ echo WARNING MESSAGE >> "%INSTALLLOG%"
95
+ echo Files not copied because it could not read the version from the binary. >> "%INSTALLLOG%"
96
+ echo There is a possibility that the program does not work properly. >> "%INSTALLLOG%"
97
+ echo Please check the compatibility of following binaries. >> "%INSTALLLOG%"
98
+ type "%ERRMSG%" >> "%INSTALLLOG%"
99
+ echo ************************************************************** >> "%INSTALLLOG%"
100
+ del "%ERRMSG%"
101
+ )
102
+ )
103
+ EOS
104
+ }
105
+ mkfile.puts 'exit /b 0'
106
+ mkfile.puts 'endlocal'
107
+ $makefile_created = true
108
+ ensure
109
+ source.close
110
+ mkfile.close
111
+ mkfile_dummy.close
112
+ end
113
+ end
@@ -0,0 +1,22 @@
1
+ # coding : utf-8
2
+ =begin =============================================================
3
+ Copyright (C) 2013 BizStation Corp All rights reserved.
4
+
5
+ This program is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU General Public License
7
+ as published by the Free Software Foundation; either version 2
8
+ of the License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18
+ 02111-1307, USA.
19
+ ===================================================================
20
+ =end
21
+ require File.expand_path(File.join(File.dirname(__FILE__), 'detect.rb'))
22
+ require File.expand_path(File.join(File.dirname(__FILE__), '../bin', get_binary_path()))
@@ -0,0 +1,375 @@
1
+ # coding : utf-8
2
+ =begin =============================================================
3
+ Copyright (C) 2013 BizStation Corp All rights reserved.
4
+
5
+ This program is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU General Public License
7
+ as published by the Free Software Foundation; either version 2
8
+ of the License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18
+ 02111-1307, USA.
19
+ ===================================================================
20
+ =end
21
+ require 'date'
22
+ require 'transactd'
23
+
24
+ TYPE_SCHEMA_BDF = 0
25
+
26
+ USE_NORMAL = 0
27
+ USE_TRANS = 1
28
+ USE_BALKINS = 2
29
+ USE_SNAPSHOT = 4
30
+
31
+ FN_ID = 0
32
+ FN_NAME = 1
33
+
34
+ AUTO_CREATE_TABLE = true
35
+ PARALLEL_TRN = 1000
36
+ LOCK_SINGLE_NOWAIT = 200
37
+ TRANS_BIAS = PARALLEL_TRN + LOCK_SINGLE_NOWAIT
38
+
39
+ BULKBUFSIZE = 65535 - 1000
40
+
41
+ ## --------------------------------------------------------------------------------
42
+ def showTableError(tb, description)
43
+ if (tb.stat() != 0)
44
+ puts("#{description} error #{tb.tableDef().fileName()}:No.#{tb.stat().to_s}")
45
+ end
46
+ end
47
+
48
+ ## --------------------------------------------------------------------------------
49
+ def showEnginError(db, tableName)
50
+ if (db.stat() != 0)
51
+ puts("#{tableName} error No.#{db.stat().to_s}")
52
+ end
53
+ end
54
+
55
+ ## --------------------------------------------------------------------------------
56
+ def openTable(db, tableName, mode)
57
+ tb = db.openTable(tableName, mode, AUTO_CREATE_TABLE)
58
+ showEnginError(db, tableName) if (tb == nil)
59
+ return tb
60
+ end
61
+
62
+ ## --------------------------------------------------------------------------------
63
+ def createDataBase(db, uri)
64
+ db.create(uri)
65
+ return (db.stat() == 0)
66
+ end
67
+
68
+ ## --------------------------------------------------------------------------------
69
+ def write(tb, start, endid)
70
+ tb.setKeyNum(0)
71
+ for i in start..(endid - 1) do
72
+ tb.clearBuffer()
73
+ tb.setFV(FN_ID, i)
74
+ tb.setFV(FN_NAME, i)
75
+ tb.insert()
76
+ if (tb.stat() != 0)
77
+ showTableError(tb, 'write')
78
+ return false
79
+ end
80
+ end
81
+ return true
82
+ end
83
+
84
+ ## --------------------------------------------------------------------------------
85
+ def deleteAll(db, tb, start, endid)
86
+ db.beginTrn(TRANS_BIAS)
87
+ tb.clearBuffer()
88
+ for i in start..(endid - 1) do
89
+ tb.setFV(FN_ID, i)
90
+ tb.seek()
91
+ if (tb.stat() == 0)
92
+ tb.del()
93
+ if (tb.stat() != 0)
94
+ showTableError(tb, 'deleteAll')
95
+ db.endTrn()
96
+ return false
97
+ end
98
+ end
99
+ end
100
+ db.endTrn()
101
+ return true
102
+ end
103
+
104
+ ## --------------------------------------------------------------------------------
105
+ def Inserts(db, tb, start, endid, mode, unit)
106
+ ret = true
107
+ total = endid - start
108
+ count = total / unit
109
+ st = start
110
+ en = st
111
+ while (en != endid) do
112
+ en = st + unit
113
+ db.beginTrn(TRANS_BIAS) if (mode == USE_TRANS)
114
+ tb.beginBulkInsert(BULKBUFSIZE) if (mode == USE_BALKINS)
115
+ ret = write(tb, st, en)
116
+ tb.commitBulkInsert() if (mode == USE_BALKINS)
117
+ db.endTrn() if (mode == USE_TRANS)
118
+ break if (ret == false)
119
+ st = en
120
+ end
121
+ return ret
122
+ end
123
+
124
+ ## --------------------------------------------------------------------------------
125
+ def Read(db, tb, start, endid, shapshot)
126
+ ret = true
127
+ tb.clearBuffer()
128
+ db.beginSnapshot() if (shapshot == USE_SNAPSHOT)
129
+ for i in start..(endid - 1) do
130
+ tb.setFV(FN_ID, i)
131
+ tb.seek()
132
+ if ((tb.stat() != 0) || (tb.getFVlng(FN_ID) != i))
133
+ puts("GetEqual Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVlng(FN_ID).to_s}")
134
+ ret = false
135
+ break
136
+ end
137
+ end
138
+ db.endSnapshot() if (shapshot == USE_SNAPSHOT)
139
+ return ret
140
+ end
141
+
142
+ ## --------------------------------------------------------------------------------
143
+ def Reads(db, tb, start, endid, unit, shapshot)
144
+ ret = true
145
+ total = endid - start
146
+ count = total / unit
147
+ st = start
148
+ en = st
149
+ db.beginSnapshot() if (shapshot == USE_SNAPSHOT)
150
+ tb.setKeyNum(0)
151
+ tb.setFilter('*', 1, 20)
152
+ tb.clearBuffer()
153
+ tb.setFV(FN_ID, st)
154
+ tb.find(Transactd::Table::FindForword)
155
+ while (en != endid)
156
+ en = st + unit
157
+ for i in st..(en - 1) do
158
+ if (tb.getFVlng(FN_ID) != i)
159
+ puts("findNext Error stat() = #{tb.stat().to_s} Value #{i.to_s} = #{tb.getFVlng(FN_ID).to_s}")
160
+ ret = false
161
+ break
162
+ end
163
+ tb.findNext()
164
+ end
165
+ break if (ret == false)
166
+ st = en
167
+ end
168
+ db.endSnapshot() if (shapshot == USE_SNAPSHOT)
169
+ return ret
170
+ end
171
+
172
+ ## --------------------------------------------------------------------------------
173
+ def Updates(db, tb, start, endid, tran, unit)
174
+ ret = true
175
+ tb.setKeyNum(0)
176
+ total = endid - start
177
+ count = total / unit
178
+ st = start
179
+ en = st
180
+ while (en != endid)
181
+ en = st + unit
182
+ db.beginTrn(TRANS_BIAS) if (tran == USE_TRANS)
183
+ for i in st..(en - 1) do
184
+ tb.setFV(FN_ID, i)
185
+ tb.setFV(FN_NAME, "#{i + 1 + tran}")
186
+ tb.update(Transactd::Table::ChangeInKey)
187
+ if (tb.stat() != 0)
188
+ ret = false
189
+ break
190
+ end
191
+ end
192
+ db.endTrn() if (tran == USE_TRANS)
193
+ break if (ret == false)
194
+ st = en
195
+ end
196
+ return ret
197
+ end
198
+
199
+ ## --------------------------------------------------------------------------------
200
+ def createTestDataBase(db, uri)
201
+ db.create(uri)
202
+ if (db.stat() != 0)
203
+ puts("createTestDataBase erorr:No.#{db.stat().to_s} #{uri}")
204
+ return false
205
+ end
206
+ if (db.open(uri, TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL, '', ''))
207
+ dbdef = db.dbDef()
208
+ td = Transactd::Tabledef.new()
209
+ td.setTableName('user')
210
+ td.setFileName('user.dat')
211
+ td.id = 1
212
+ # td.primaryKeyNum = -1
213
+ # td.parentKeyNum = -1
214
+ # td.replicaKeyNum = -1
215
+ td.pageSize = 2048
216
+ dbdef.insertTable(td)
217
+
218
+ fd = dbdef.insertField(td.id, 0)
219
+ fd.setName('id')
220
+ fd.type = Transactd::Ft_integer
221
+ fd.len = 4
222
+ dbdef.updateTableDef(1)
223
+
224
+ fd = dbdef.insertField(td.id, 1)
225
+ fd.setName('name')
226
+ fd.type = Transactd::Ft_myvarchar
227
+ fd.len = 100
228
+ dbdef.updateTableDef(td.id)
229
+
230
+ kd = dbdef.insertKey(td.id, 0)
231
+ kd.segment(0).fieldNum = 0
232
+ kd.segment(0).flags.bit8 = 1 # extend key type
233
+ kd.segment(0).flags.bit1 = 1 # changeable
234
+ kd.segmentCount = 1
235
+
236
+ td.primaryKeyNum = 0
237
+ dbdef.updateTableDef(td.id)
238
+ return true
239
+ else
240
+ puts("open daatabse erorr No:#{db.stat().to_s}")
241
+ end
242
+ return false
243
+ end
244
+
245
+ ## --------------------------------------------------------------------------------
246
+ def printDateTime()
247
+ puts(DateTime.now.strftime('%Y/%m/%d %H:%M:%S'))
248
+ end
249
+
250
+ ## --------------------------------------------------------------------------------
251
+ def printHeader(uri, count)
252
+ puts("Start Bench mark Insert Items = #{count.to_s}")
253
+ printDateTime()
254
+ puts(uri)
255
+ puts("----------------------------------------")
256
+ end
257
+
258
+ ## --------------------------------------------------------------------------------
259
+ def printTail()
260
+ puts("----------------------------------------")
261
+ end
262
+
263
+ ## --------------------------------------------------------------------------------
264
+ def main(argv)
265
+ if (argv.length < 4)
266
+ puts("usage: ruby bench_tdclcpp.rb databaseUri processNumber functionNumber noDeleteFlag")
267
+ puts("\t --- functionNumber list ---")
268
+ puts("\t-1: all function")
269
+ puts("\t 0: Insert")
270
+ puts("\t 1: Insert in transaction. 20rec x 1000times")
271
+ puts("\t 2: Insert by bulkmode. 20rec x 1000times")
272
+ puts("\t 3: read each record")
273
+ puts("\t 4: read each record with snapshot")
274
+ puts("\t 5: read range. 20rec x 1000times")
275
+ puts("\t 6: read range with snapshpot. 20rec x 1000times")
276
+ puts("\t 7: update")
277
+ puts("\t 8: update in transaction. 20rec x 1000times")
278
+ puts("example : ruby bench_tdclcpp.rb \"tdap://localhost/test?dbfile=test.bdf\" 0 -1 1")
279
+ return
280
+ end
281
+ uri = argv[1] # "tdap://localhost/test?dbfile=test.bdf"
282
+ procID = Integer(argv[2]) # 0
283
+ count = 20000
284
+ start = procID * count + 1
285
+ endid = start + count
286
+ exeType = Integer(argv[3]) # -1
287
+ insertBeforeNoDelete = ((argv.length > 4) && (Integer(argv[4]) != 0))
288
+
289
+ db = Transactd::Database.createObject()
290
+ if (db.open(uri, TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL, '', '') == false)
291
+ if (!createTestDataBase(db, uri))
292
+ db.close()
293
+ return
294
+ end
295
+ puts("CreateDataBase success.")
296
+ end
297
+ printHeader(uri, count)
298
+
299
+ if (!db.open(uri, TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL, '', ''))
300
+ puts("open table erorr No:#{db.stat().to_s}")
301
+ else
302
+ tb = openTable(db, 'user', Transactd::TD_OPEN_NORMAL)
303
+ if tb == nil
304
+ puts "can not open table 'user'"
305
+ db.close()
306
+ return
307
+ end
308
+
309
+ if ((exeType == -1) || (exeType == 0))
310
+ if (insertBeforeNoDelete || deleteAll(db, tb, start, endid))
311
+ Transactd::Benchmark::start()
312
+ succeed = Inserts(db, tb, start, endid, USE_NORMAL, 1)
313
+ Transactd::Benchmark::showTimeSec(succeed, ': Insert')
314
+ else
315
+ puts("deleteAll erorr No:#{tb.stat().to_s}")
316
+ end
317
+ end
318
+ if ((exeType == -1) || (exeType == 1))
319
+ if (insertBeforeNoDelete || deleteAll(db, tb, start, endid))
320
+ Transactd::Benchmark::start()
321
+ succeed = Inserts(db, tb, start, endid, USE_TRANS, 20)
322
+ Transactd::Benchmark::showTimeSec(succeed, ': Insert in transaction. 20rec x 1000times.')
323
+ else
324
+ puts("deleteAll erorr No:#{tb.stat().to_s}")
325
+ end
326
+ end
327
+ if ((exeType == -1) || (exeType == 2))
328
+ if (insertBeforeNoDelete || deleteAll(db, tb, start, endid))
329
+ Transactd::Benchmark::start()
330
+ succeed = Inserts(db, tb, start, endid, USE_BALKINS, 20)
331
+ Transactd::Benchmark::showTimeSec(succeed, ': Insert by bulkmode. 20rec x 1000times.')
332
+ else
333
+ puts("deleteAll erorr No:#{tb.stat().to_s}")
334
+ end
335
+ end
336
+ if ((exeType == -1) || (exeType == 3))
337
+ Transactd::Benchmark::start()
338
+ succeed = Read(db, tb, start, endid, USE_NORMAL)
339
+ Transactd::Benchmark::showTimeSec(succeed, 'read each record.')
340
+ end
341
+ if ((exeType == -1) || (exeType == 4))
342
+ Transactd::Benchmark::start()
343
+ succeed = Read(db, tb, start, endid, USE_SNAPSHOT)
344
+ Transactd::Benchmark::showTimeSec(succeed, ': read each record with snapshot.')
345
+ end
346
+ if ((exeType == -1) || (exeType == 5))
347
+ Transactd::Benchmark::start()
348
+ succeed = Reads(db, tb, start, endid, 20, USE_NORMAL)
349
+ Transactd::Benchmark::showTimeSec(succeed, ': read range. 20rec x 1000times.')
350
+ end
351
+ if ((exeType == -1) || (exeType == 6))
352
+ Transactd::Benchmark::start()
353
+ succeed = Reads(db, tb, start, endid, 20, USE_SNAPSHOT)
354
+ Transactd::Benchmark::showTimeSec(succeed, ': read range with snapshpot. 20rec x 1000times.')
355
+ end
356
+ if ((exeType == -1) || (exeType == 7))
357
+ Transactd::Benchmark::start()
358
+ succeed = Updates(db, tb, start, endid, USE_NORMAL, 1)
359
+ Transactd::Benchmark::showTimeSec(succeed, ': update.')
360
+ end
361
+ if ((exeType == -1) || (exeType == 8))
362
+ Transactd::Benchmark::start()
363
+ succeed = Updates(db, tb, start, endid, USE_TRANS, 20)
364
+ Transactd::Benchmark::showTimeSec(succeed, ': update in transaction. 20rec x 1000times.')
365
+ end
366
+ end
367
+ tb.close()
368
+ db.close()
369
+ printTail()
370
+ return
371
+ end
372
+
373
+ args = ARGV
374
+ args.unshift(__FILE__)
375
+ main(args)