nysol 3.0.1
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.
- checksums.yaml +7 -0
- data/bin/blueKiller.rb +17 -0
- data/bin/mdistcopy.rb +89 -0
- data/bin/meach.rb +284 -0
- data/bin/meachc.rb +288 -0
- data/bin/msend.rb +95 -0
- data/bin/mtempclean.rb +33 -0
- data/ext/mcsvin/extconf.rb +14 -0
- data/ext/mcsvin/mcsvin.cpp +857 -0
- data/ext/mcsvout/extconf.rb +14 -0
- data/ext/mcsvout/mcsvout.cpp +401 -0
- data/ext/mmethods/extconf.rb +12 -0
- data/ext/mmethods/mmethods.cpp +259 -0
- data/ext/mtable/extconf.rb +12 -0
- data/ext/mtable/mtable.cpp +555 -0
- data/lib/nysol/margs.rb +402 -0
- data/lib/nysol/mcmd.rb +44 -0
- data/lib/nysol/mnettools.rb +220 -0
- data/lib/nysol/mparallel.rb +359 -0
- data/lib/nysol/mparallelmanager.rb +300 -0
- data/lib/nysol/mrubyparse.rb +538 -0
- data/lib/nysol/msysteminfo.rb +216 -0
- data/lib/nysol/mtemp.rb +268 -0
- data/lib/nysol/mutils.rb +218 -0
- metadata +89 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "mkmf"
|
3
|
+
|
4
|
+
unless have_library("kgmod3")
|
5
|
+
puts("-----------------------------")
|
6
|
+
puts("need libkgmod3.")
|
7
|
+
puts("refer https://github.com/nysol/mcmd")
|
8
|
+
puts("-----------------------------")
|
9
|
+
exit 1
|
10
|
+
end
|
11
|
+
|
12
|
+
$LOCAL_LIBS += "-lkgmod3"
|
13
|
+
create_makefile("nysol/mcsvout")
|
14
|
+
|
@@ -0,0 +1,401 @@
|
|
1
|
+
/* ////////// LICENSE INFO ////////////////////
|
2
|
+
|
3
|
+
* Copyright (C) 2013 by NYSOL CORPORATION
|
4
|
+
*
|
5
|
+
* Unless you have received this program directly from NYSOL pursuant
|
6
|
+
* to the terms of a commercial license agreement with NYSOL, then
|
7
|
+
* this program is licensed to you under the terms of the GNU Affero General
|
8
|
+
* Public License (AGPL) as published by the Free Software Foundation,
|
9
|
+
* either version 3 of the License, or (at your option) any later version.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful, but
|
12
|
+
* WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
|
13
|
+
* NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
14
|
+
*
|
15
|
+
* Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
|
16
|
+
* for more details.
|
17
|
+
|
18
|
+
////////// LICENSE INFO ////////////////////*/
|
19
|
+
// =============================================================================
|
20
|
+
// mcsvout.cpp CSV入力クラス
|
21
|
+
// =============================================================================
|
22
|
+
#include <unistd.h>
|
23
|
+
#include <sys/types.h>
|
24
|
+
#include <ruby.h>
|
25
|
+
#include <kgmod.h>
|
26
|
+
#include <kgCSVout.h>
|
27
|
+
#include <kgArgFld.h>
|
28
|
+
#include <kgMethod.h>
|
29
|
+
|
30
|
+
using namespace std;
|
31
|
+
using namespace kglib;
|
32
|
+
|
33
|
+
extern "C" {
|
34
|
+
void Init_mcsvout(void);
|
35
|
+
}
|
36
|
+
|
37
|
+
// =============================================================================
|
38
|
+
// CSV出力クラス
|
39
|
+
// =============================================================================
|
40
|
+
class mcsvout : public kgMod
|
41
|
+
{
|
42
|
+
vector<kgstr_t> fldNames_; // f=引数
|
43
|
+
|
44
|
+
public:
|
45
|
+
VALUE object_; // mcsvoutオブジェクト(rb_yieldで必要)
|
46
|
+
kgCSVout oFile_; // 出力ファイル(o=)
|
47
|
+
int sigDigits_; // float型有効桁数(sig=)
|
48
|
+
size_t fldSize_; // 出力項目数(size=)
|
49
|
+
bool noFldName_; // 項目名出力なしフラグ(-nfn)
|
50
|
+
string fsName_;
|
51
|
+
string boolStr_;
|
52
|
+
vector<char *> bools_;
|
53
|
+
kgArgFld fld_;
|
54
|
+
|
55
|
+
mcsvout(void){
|
56
|
+
_name = "mcsvout";
|
57
|
+
_version = "1.0";
|
58
|
+
};
|
59
|
+
|
60
|
+
virtual ~mcsvout(void){
|
61
|
+
}
|
62
|
+
|
63
|
+
size_t oRecNo(void) const{
|
64
|
+
return oFile_.recNo();
|
65
|
+
}
|
66
|
+
|
67
|
+
void addFldName(const char* fldName){
|
68
|
+
fldNames_.push_back(fldName);
|
69
|
+
}
|
70
|
+
|
71
|
+
// ファイルオープン&項目名出力
|
72
|
+
void open() try {
|
73
|
+
|
74
|
+
oFile_.open(fsName_.c_str(), _env, noFldName_);
|
75
|
+
if(! noFldName_) oFile_.writeFldNameCHK(fldNames_);
|
76
|
+
oFile_.flush();
|
77
|
+
}catch(...){
|
78
|
+
throw;
|
79
|
+
}
|
80
|
+
|
81
|
+
// pure virtual関数なので定義だけしておく。
|
82
|
+
int run(){ return 0;}
|
83
|
+
|
84
|
+
// ファイルクローズ
|
85
|
+
void close(void) try
|
86
|
+
{
|
87
|
+
oFile_.close();
|
88
|
+
}catch(...){
|
89
|
+
throw;
|
90
|
+
}
|
91
|
+
|
92
|
+
};
|
93
|
+
|
94
|
+
// =============================================================================
|
95
|
+
// rMmcsvout クラス(mcsvoutクラスのrubyラッパ)
|
96
|
+
// 機能: 1) kgEnvとコマンドライン引数のメモリを確保する
|
97
|
+
// 2) 正常終了,エラー終了の統一的メソッドを提供する
|
98
|
+
// =============================================================================
|
99
|
+
class rMcsvout
|
100
|
+
{
|
101
|
+
public:
|
102
|
+
kgEnv env;
|
103
|
+
string argstr; // rubyの引数をコピーして格納するための変数
|
104
|
+
kgAutoPtr2<char*> argv;
|
105
|
+
mcsvout* mod; // 一度実行(RUN)されると0となる.
|
106
|
+
|
107
|
+
private:
|
108
|
+
void freeMod() try
|
109
|
+
{
|
110
|
+
if(mod!=0){ delete mod; }
|
111
|
+
mod=0;
|
112
|
+
}catch(...){
|
113
|
+
rb_raise(rb_eRuntimeError,"Error at freeMod()");
|
114
|
+
}
|
115
|
+
|
116
|
+
public:
|
117
|
+
~rMcsvout(void){
|
118
|
+
if(mod!=0){
|
119
|
+
successEnd();
|
120
|
+
mod=0;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
// エラー終了メソッド
|
125
|
+
void errorEnd(kgError& err) try
|
126
|
+
{
|
127
|
+
mod->close();
|
128
|
+
mod->errorEnd(err);
|
129
|
+
freeMod();
|
130
|
+
}catch(...){
|
131
|
+
rb_raise(rb_eRuntimeError,"Error at errorEnd()");
|
132
|
+
}
|
133
|
+
|
134
|
+
// 正常終了メソッド
|
135
|
+
void successEnd() try
|
136
|
+
{
|
137
|
+
mod->close();
|
138
|
+
mod->successEnd();
|
139
|
+
freeMod();
|
140
|
+
}catch(...){
|
141
|
+
rb_raise(rb_eRuntimeError,"Error at successEnd()");
|
142
|
+
}
|
143
|
+
};
|
144
|
+
|
145
|
+
// =============================================================================
|
146
|
+
// 公開メソッド
|
147
|
+
// =============================================================================
|
148
|
+
// -----------------------------------------------------------------------------
|
149
|
+
// NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW
|
150
|
+
// def initialize(args,arrayHashFlag)
|
151
|
+
// 引数の設定(rubyで指定されたargvをkgmodにchar*として渡す)
|
152
|
+
// -----------------------------------------------------------------------------
|
153
|
+
VALUE csvout_init(int argc, VALUE *argv, VALUE self) try
|
154
|
+
{
|
155
|
+
rMcsvout* rmod;
|
156
|
+
Data_Get_Struct(self,rMcsvout,rmod);
|
157
|
+
|
158
|
+
try {
|
159
|
+
|
160
|
+
// 引数をoptionsにセット
|
161
|
+
VALUE options;
|
162
|
+
rb_scan_args(argc, argv,"01",&options);
|
163
|
+
|
164
|
+
// rubyの引数文字列を一旦rmod->argstrに退避させてからtoken分割する。
|
165
|
+
// 退避させないと、ruby変数としての文字列を変更してしまうことになる。
|
166
|
+
if(TYPE(options)==T_NIL){
|
167
|
+
rmod->argstr="";
|
168
|
+
}else if(TYPE(options)==T_STRING){
|
169
|
+
rmod->argstr=RSTRING_PTR(options);
|
170
|
+
}else{
|
171
|
+
rb_raise(rb_eRuntimeError,"1st argument must be String");
|
172
|
+
}
|
173
|
+
vector<char *> opts = splitToken(const_cast<char*>(rmod->argstr.c_str()), ' ',true);
|
174
|
+
|
175
|
+
// 引数文字列へのポインタの領域はここでauto変数に確保する
|
176
|
+
char** vv;
|
177
|
+
try{
|
178
|
+
rmod->argv.set(new char*[opts.size()+1]);
|
179
|
+
vv = rmod->argv.get();
|
180
|
+
}catch(...){
|
181
|
+
throw kgError("memory allocation error");
|
182
|
+
}
|
183
|
+
|
184
|
+
// 引数セット vv配列0番目はコマンド名
|
185
|
+
vv[0]=const_cast<char*>(rmod->mod->name());
|
186
|
+
size_t vvSize;
|
187
|
+
for(vvSize=0; vvSize<opts.size(); vvSize++){
|
188
|
+
vv[vvSize+1] = opts.at(vvSize);
|
189
|
+
}
|
190
|
+
vvSize+=1;
|
191
|
+
|
192
|
+
// modの初期化引数チェック
|
193
|
+
rmod->mod->init(vvSize, const_cast<const char**>(vv), &rmod->env);
|
194
|
+
rmod->mod->args()->paramcheck("o=,f=,size=,precision=,bool=",false);
|
195
|
+
|
196
|
+
// -----------------------------------------------------
|
197
|
+
// 各種引数の設定 o=,f=,size=,precision=,bool=
|
198
|
+
// -----------------------------------------------------
|
199
|
+
rmod->mod->fsName_ = rmod->mod->args()->toString("o=",false);
|
200
|
+
|
201
|
+
rmod->mod->fldSize_ =0;
|
202
|
+
vector<kgstr_t> vs;
|
203
|
+
vs = rmod->mod->args()->toStringVector("f=",false);
|
204
|
+
if(vs.size()>0){
|
205
|
+
rmod->mod->noFldName_=false;
|
206
|
+
rmod->mod->fldSize_ = vs.size();
|
207
|
+
for(size_t i=0; i<rmod->mod->fldSize_; i++){
|
208
|
+
rmod->mod->addFldName(vs.at(i).c_str());
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
string sizeStr = rmod->mod->args()->toString("size=",false);
|
213
|
+
if(sizeStr.size()>0){
|
214
|
+
rmod->mod->noFldName_=true;
|
215
|
+
rmod->mod->fldSize_ = atoi(sizeStr.c_str());
|
216
|
+
}
|
217
|
+
if(vs.size()==0&&sizeStr.size()==0){
|
218
|
+
throw kgError("f= or size= must be specified ");
|
219
|
+
}
|
220
|
+
|
221
|
+
string sigStr = rmod->mod->args()->toString("precision=",false);
|
222
|
+
string boolStr = rmod->mod->args()->toString("bool=",false);
|
223
|
+
|
224
|
+
// sig=: 有効桁数
|
225
|
+
if(sigStr.size()>0){
|
226
|
+
int precision=atoi(sigStr.c_str());
|
227
|
+
rmod->mod->env()->precision(precision);
|
228
|
+
}
|
229
|
+
|
230
|
+
// bool=: true,falseの文字列
|
231
|
+
if(boolStr.size()>0){
|
232
|
+
rmod->mod->boolStr_=boolStr;
|
233
|
+
rmod->mod->bools_ = splitToken(const_cast<char*>(rmod->mod->boolStr_.c_str()), ',');
|
234
|
+
if(rmod->mod->bools_.size()!=2){
|
235
|
+
rb_raise(rb_eRuntimeError,"bools= takes two values(ex. bools=true,false) separated by comma.");
|
236
|
+
}
|
237
|
+
}else{
|
238
|
+
rmod->mod->bools_.push_back(const_cast<char*>("1"));
|
239
|
+
rmod->mod->bools_.push_back(const_cast<char*>("0"));
|
240
|
+
}
|
241
|
+
|
242
|
+
// ファイルオープン
|
243
|
+
rmod->mod->open();
|
244
|
+
|
245
|
+
// ブロック引数があればyield実行
|
246
|
+
if(rb_block_given_p()){
|
247
|
+
rb_yield(rmod->mod->object_);
|
248
|
+
rmod->successEnd();
|
249
|
+
}
|
250
|
+
|
251
|
+
}catch(kgError& err){ // kgmod関係エラーのchatch
|
252
|
+
rmod->errorEnd(err); throw;
|
253
|
+
}
|
254
|
+
return self;
|
255
|
+
|
256
|
+
}catch(...){
|
257
|
+
rb_raise(rb_eRuntimeError,"Error at csvout_init");
|
258
|
+
}
|
259
|
+
|
260
|
+
// ------------------------------------------------------------------
|
261
|
+
// WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE
|
262
|
+
// ------------------------------------------------------------------
|
263
|
+
VALUE csvout_write(int argc, VALUE *argv, VALUE self) try
|
264
|
+
{
|
265
|
+
rMcsvout* rmod;
|
266
|
+
Data_Get_Struct(self,rMcsvout,rmod);
|
267
|
+
|
268
|
+
try
|
269
|
+
{
|
270
|
+
if(rmod->mod == 0){
|
271
|
+
rb_raise(rb_eRuntimeError,"csv file is not opened");
|
272
|
+
}
|
273
|
+
|
274
|
+
// 引数をvalsにセット
|
275
|
+
VALUE vals;
|
276
|
+
rb_scan_args(argc, argv,"1",&vals);
|
277
|
+
|
278
|
+
size_t size =RARRAY_LEN(vals);
|
279
|
+
size_t fldSize=rmod->mod->fldSize_;
|
280
|
+
kgCSVout& oFile =rmod->mod->oFile_;
|
281
|
+
|
282
|
+
// 配列の内容の出力
|
283
|
+
if(TYPE(vals)==T_ARRAY){
|
284
|
+
|
285
|
+
// 配列のサイズが項目名サイズより大きい時は、項目名サイズ分のみ出力する。
|
286
|
+
if(size>fldSize) size=fldSize;
|
287
|
+
for(size_t i=0; i<size; i++){
|
288
|
+
|
289
|
+
VALUE v = RARRAY_PTR(vals)[i];
|
290
|
+
|
291
|
+
switch(TYPE(v)){
|
292
|
+
case T_STRING:
|
293
|
+
if(i==fldSize-1) oFile.writeStr(RSTRING_PTR(v),true);
|
294
|
+
else oFile.writeStr(RSTRING_PTR(v),false);
|
295
|
+
break;
|
296
|
+
case T_FIXNUM:
|
297
|
+
if(i==fldSize-1) oFile.writeLong(FIX2LONG(v),true);
|
298
|
+
else oFile.writeLong(FIX2LONG(v),false);
|
299
|
+
break;
|
300
|
+
case T_BIGNUM:
|
301
|
+
if(i==fldSize-1) oFile.writeLong(NUM2LONG(v),true);
|
302
|
+
else oFile.writeLong(NUM2LONG(v),false);
|
303
|
+
break;
|
304
|
+
case T_FLOAT:
|
305
|
+
if(i==fldSize-1) oFile.writeDbl(NUM2DBL(v),true);
|
306
|
+
else oFile.writeDbl(NUM2DBL(v),false);
|
307
|
+
break;
|
308
|
+
case T_TRUE:
|
309
|
+
if(i==fldSize-1) oFile.writeStr(rmod->mod->bools_.at(0),true);
|
310
|
+
else oFile.writeStr(rmod->mod->bools_.at(0),false);
|
311
|
+
break;
|
312
|
+
case T_FALSE:
|
313
|
+
if(i==fldSize-1) oFile.writeStr(rmod->mod->bools_.at(1),true);
|
314
|
+
else oFile.writeStr(rmod->mod->bools_.at(1),false);
|
315
|
+
break;
|
316
|
+
default:
|
317
|
+
if(i==fldSize-1) oFile.writeStr("",true);
|
318
|
+
else oFile.writeStr("",false);
|
319
|
+
}
|
320
|
+
}
|
321
|
+
}else{
|
322
|
+
rb_raise(rb_eRuntimeError,"write() function takes Array");
|
323
|
+
}
|
324
|
+
|
325
|
+
// 配列のサイズが項目名サイズより小さい時は、null値を出力。
|
326
|
+
if(size<fldSize){
|
327
|
+
for(size_t i=size; i<fldSize; i++){
|
328
|
+
if(i==fldSize-1) oFile.writeStr("",true);
|
329
|
+
else oFile.writeStr("",false);
|
330
|
+
}
|
331
|
+
}
|
332
|
+
|
333
|
+
}catch(kgError& err){ // kgmod関係エラーのchatch
|
334
|
+
rmod->errorEnd(err); throw;
|
335
|
+
}
|
336
|
+
|
337
|
+
return Qtrue;
|
338
|
+
|
339
|
+
}catch(...){
|
340
|
+
rb_raise(rb_eRuntimeError,"at csvout_write()");
|
341
|
+
}
|
342
|
+
|
343
|
+
// ------------------------------------------------------------------
|
344
|
+
// CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE
|
345
|
+
// ------------------------------------------------------------------
|
346
|
+
VALUE csvout_close(VALUE self) try
|
347
|
+
{
|
348
|
+
rMcsvout* rmod;
|
349
|
+
Data_Get_Struct(self,rMcsvout,rmod);
|
350
|
+
|
351
|
+
try {
|
352
|
+
rmod->successEnd();
|
353
|
+
|
354
|
+
}catch(kgError& err){
|
355
|
+
|
356
|
+
rmod->errorEnd(err); throw;
|
357
|
+
|
358
|
+
}
|
359
|
+
|
360
|
+
return Qtrue;
|
361
|
+
|
362
|
+
}catch(...){
|
363
|
+
rb_raise(rb_eRuntimeError,"at csvout_close()");
|
364
|
+
}
|
365
|
+
// =============================================================================
|
366
|
+
// メモリ解放
|
367
|
+
// kgRubyModの領域開放(GC時にrubyにより実行される)(xxx_alloc()にて登録される)
|
368
|
+
// =============================================================================
|
369
|
+
void csvout_free(rMcsvout* rmod) try {
|
370
|
+
if(rmod!=0){
|
371
|
+
delete rmod;
|
372
|
+
}
|
373
|
+
}catch(...){
|
374
|
+
rb_raise(rb_eRuntimeError,"Error at csvout_free()");
|
375
|
+
}
|
376
|
+
|
377
|
+
// =============================================================================
|
378
|
+
// インスタンス化される時のメモリ確保
|
379
|
+
// =============================================================================
|
380
|
+
VALUE mcsvout_alloc(VALUE klass) try {
|
381
|
+
rMcsvout* rmod=new rMcsvout;
|
382
|
+
rmod->mod = new mcsvout;
|
383
|
+
VALUE object=Data_Wrap_Struct(klass,0,csvout_free,rmod);
|
384
|
+
rmod->mod->object_ = object;
|
385
|
+
return object;
|
386
|
+
}catch(...){
|
387
|
+
rb_raise(rb_eRuntimeError,"Error at csvout_alloc()");
|
388
|
+
}
|
389
|
+
|
390
|
+
void Init_mcsvout(void) {
|
391
|
+
// モジュール定義:MCMD::xxxxの部分
|
392
|
+
VALUE mcmd=rb_define_module("MCMD");
|
393
|
+
|
394
|
+
VALUE mcsvout;
|
395
|
+
mcsvout=rb_define_class_under(mcmd,"Mcsvout",rb_cObject);
|
396
|
+
rb_define_alloc_func(mcsvout, mcsvout_alloc);
|
397
|
+
rb_define_method(mcsvout,"initialize", (VALUE (*)(...))csvout_init ,-1);
|
398
|
+
rb_define_method(mcsvout,"write", (VALUE (*)(...))csvout_write,-1);
|
399
|
+
rb_define_method(mcsvout,"close", (VALUE (*)(...))csvout_close,0);
|
400
|
+
}
|
401
|
+
|
@@ -0,0 +1,259 @@
|
|
1
|
+
/* ////////// LICENSE INFO ////////////////////
|
2
|
+
|
3
|
+
* Copyright (C) 2013 by NYSOL CORPORATION
|
4
|
+
*
|
5
|
+
* Unless you have received this program directly from NYSOL pursuant
|
6
|
+
* to the terms of a commercial license agreement with NYSOL, then
|
7
|
+
* this program is licensed to you under the terms of the GNU Affero General
|
8
|
+
* Public License (AGPL) as published by the Free Software Foundation,
|
9
|
+
* either version 3 of the License, or (at your option) any later version.
|
10
|
+
*
|
11
|
+
* This program is distributed in the hope that it will be useful, but
|
12
|
+
* WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
|
13
|
+
* NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
14
|
+
*
|
15
|
+
* Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
|
16
|
+
* for more details.
|
17
|
+
|
18
|
+
////////// LICENSE INFO ////////////////////*/
|
19
|
+
// mcmd
|
20
|
+
// 1.0.0 : 2011/9/16 初期リリース
|
21
|
+
//
|
22
|
+
#include <stdio.h>
|
23
|
+
#include <unistd.h>
|
24
|
+
#include <sys/types.h>
|
25
|
+
#include <sys/stat.h>
|
26
|
+
#include <fcntl.h>
|
27
|
+
#include <cstdlib>
|
28
|
+
|
29
|
+
#include <iostream>
|
30
|
+
#include <unistd.h>
|
31
|
+
#include <sys/types.h>
|
32
|
+
#include <ruby.h>
|
33
|
+
#include <kgmod.h>
|
34
|
+
#include <kgCSV.h>
|
35
|
+
#include <kgArgs.h>
|
36
|
+
#include <kgMessage.h>
|
37
|
+
#include <kgMethod.h>
|
38
|
+
|
39
|
+
using namespace std;
|
40
|
+
using namespace kglib;
|
41
|
+
|
42
|
+
extern "C" {
|
43
|
+
void Init_mmethods(void);
|
44
|
+
}
|
45
|
+
|
46
|
+
// =============================================================================
|
47
|
+
// mrecountメソッド
|
48
|
+
// =============================================================================
|
49
|
+
/*
|
50
|
+
* call-seq:
|
51
|
+
* MCMD::mrecount -> int
|
52
|
+
*
|
53
|
+
* <b>説明</b> レコード数を返す。
|
54
|
+
*
|
55
|
+
* <b>書式</b> MCMD::mrecount(options)
|
56
|
+
*
|
57
|
+
* i=ファイル名
|
58
|
+
* -nfn : 一行目を項目名行とみなさない。
|
59
|
+
*/
|
60
|
+
VALUE mrecount(int argc, VALUE *argv) try {
|
61
|
+
kgArgs args;
|
62
|
+
kgEnv env;
|
63
|
+
string name; // rubyスクリプト名
|
64
|
+
string argstr;
|
65
|
+
int recNo=0; // 返値
|
66
|
+
|
67
|
+
try { // kgmodのエラーはrubyのエラーとは別に検知する(メッセージ表示のため)
|
68
|
+
|
69
|
+
// 引数をopetionsにセット
|
70
|
+
VALUE options;
|
71
|
+
rb_scan_args(argc, argv,"01",&options);
|
72
|
+
|
73
|
+
// rubyの引数文字列を一旦argstrに退避させてからtoken分割する。
|
74
|
+
// 退避させないと、ruby変数としての文字列を変更してしまうことになる。
|
75
|
+
if(TYPE(options)==T_NIL){
|
76
|
+
argstr="";
|
77
|
+
}else if(TYPE(options)==T_STRING){
|
78
|
+
argstr=RSTRING_PTR(options);
|
79
|
+
}else{
|
80
|
+
rb_raise(rb_eRuntimeError,"1st argument must be String");
|
81
|
+
}
|
82
|
+
vector<char *> opts = splitToken(const_cast<char*>(argstr.c_str()), ' ');
|
83
|
+
|
84
|
+
// 引数文字列へのポインタの領域はここでauto変数に確保する
|
85
|
+
kgAutoPtr2<char*> argv;
|
86
|
+
char** vv;
|
87
|
+
try{
|
88
|
+
argv.set(new char*[opts.size()+1]);
|
89
|
+
vv = argv.get();
|
90
|
+
}catch(...){
|
91
|
+
rb_raise(rb_eRuntimeError,"memory allocation error");
|
92
|
+
}
|
93
|
+
|
94
|
+
// vv配列0番目はコマンド名
|
95
|
+
vv[0]=const_cast<char*>("mrecount");
|
96
|
+
|
97
|
+
size_t vvSize;
|
98
|
+
for(vvSize=0; vvSize<opts.size(); vvSize++){
|
99
|
+
vv[vvSize+1] = opts.at(vvSize);
|
100
|
+
}
|
101
|
+
vvSize+=1;
|
102
|
+
|
103
|
+
// 引数をセット!!
|
104
|
+
args.add(vvSize,const_cast<const char**>(vv));
|
105
|
+
|
106
|
+
// argsに指定した引数の存在チェック
|
107
|
+
args.paramcheck("i=,-nfn",false);
|
108
|
+
|
109
|
+
// -----------------------------------------------------
|
110
|
+
// 各種引数の設定
|
111
|
+
|
112
|
+
// i=
|
113
|
+
string iName = args.toString("i=",false).c_str();
|
114
|
+
|
115
|
+
// -nfn
|
116
|
+
bool nfn = args.toBool("-nfn");
|
117
|
+
|
118
|
+
kgCSVrec csv;
|
119
|
+
csv.open( iName, &env, nfn, 4 );
|
120
|
+
csv.read_header();
|
121
|
+
|
122
|
+
while(EOF!=csv.read()) recNo++;
|
123
|
+
csv.close();
|
124
|
+
|
125
|
+
}catch(kgError& err){ // kgmod関係エラーのchatch
|
126
|
+
err.addModName(name);
|
127
|
+
kgMsg msg(kgMsg::ERR, &env);
|
128
|
+
msg.output(err.message());
|
129
|
+
throw;
|
130
|
+
}
|
131
|
+
|
132
|
+
// 件数を返す
|
133
|
+
return INT2NUM(recNo);
|
134
|
+
|
135
|
+
}catch(...){
|
136
|
+
rb_raise(rb_eRuntimeError,"Error at csvin_init()");
|
137
|
+
}
|
138
|
+
|
139
|
+
//encodingを考慮した文字列生成
|
140
|
+
static VALUE str2rbstr(string ptr)
|
141
|
+
{
|
142
|
+
// rb_external_str_new_cstrが定義されているばそちらを使う
|
143
|
+
#if defined(rb_external_str_new_cstr)
|
144
|
+
return rb_external_str_new_cstr(ptr.c_str());
|
145
|
+
#else
|
146
|
+
return rb_str_new2(ptr.c_str());
|
147
|
+
#endif
|
148
|
+
}
|
149
|
+
|
150
|
+
// =============================================================================
|
151
|
+
// mheaderメソッド
|
152
|
+
// =============================================================================
|
153
|
+
/*
|
154
|
+
* call-seq:
|
155
|
+
* MCMD::mheader -> int
|
156
|
+
*
|
157
|
+
* <b>説明</b> 項目名配列を返す。
|
158
|
+
*
|
159
|
+
* <b>書式</b> MCMD::mheader(options)
|
160
|
+
*
|
161
|
+
* i=ファイル名
|
162
|
+
*/
|
163
|
+
|
164
|
+
VALUE mheader(int argc, VALUE *argv) try {
|
165
|
+
kgArgs args;
|
166
|
+
kgEnv env;
|
167
|
+
string name; // rubyスクリプト名
|
168
|
+
string argstr;
|
169
|
+
|
170
|
+
try { // kgmodのエラーはrubyのエラーとは別に検知する(メッセージ表示のため)
|
171
|
+
|
172
|
+
// 引数をopetionsにセット
|
173
|
+
VALUE options;
|
174
|
+
rb_scan_args(argc, argv,"10",&options);
|
175
|
+
|
176
|
+
// rubyの引数文字列を一旦argstrに退避させてからtoken分割する。
|
177
|
+
// 退避させないと、ruby変数としての文字列を変更してしまうことになる。
|
178
|
+
argstr=RSTRING_PTR(options);
|
179
|
+
if(TYPE(options)!=T_STRING){
|
180
|
+
rb_raise(rb_eRuntimeError,"1st argument must be String");
|
181
|
+
}
|
182
|
+
vector<char *> opts = splitToken(const_cast<char*>(argstr.c_str()), ' ');
|
183
|
+
|
184
|
+
// 引数文字列へのポインタの領域はここでauto変数に確保する
|
185
|
+
kgAutoPtr2<char*> argv;
|
186
|
+
char** vv;
|
187
|
+
try{
|
188
|
+
argv.set(new char*[opts.size()+1]);
|
189
|
+
vv = argv.get();
|
190
|
+
}catch(...){
|
191
|
+
rb_raise(rb_eRuntimeError,"memory allocation error");
|
192
|
+
}
|
193
|
+
|
194
|
+
// vv配列0番目はコマンド名
|
195
|
+
vv[0]=const_cast<char*>("mheader");
|
196
|
+
|
197
|
+
size_t vvSize;
|
198
|
+
for(vvSize=0; vvSize<opts.size(); vvSize++){
|
199
|
+
vv[vvSize+1] = opts.at(vvSize);
|
200
|
+
}
|
201
|
+
vvSize+=1;
|
202
|
+
|
203
|
+
// 引数をセット!!
|
204
|
+
args.add(vvSize,const_cast<const char**>(vv));
|
205
|
+
|
206
|
+
// argsに指定した引数の存在チェック
|
207
|
+
args.paramcheck("i=,-nfn",false);
|
208
|
+
|
209
|
+
// -----------------------------------------------------
|
210
|
+
// 各種引数の設定
|
211
|
+
|
212
|
+
// i=
|
213
|
+
string iName = args.toString("i=",false);
|
214
|
+
|
215
|
+
// -nfn
|
216
|
+
bool nfn = args.toBool("-nfn");
|
217
|
+
|
218
|
+
kgCSVrec csv;
|
219
|
+
csv.open( iName, &env, nfn, 4 );
|
220
|
+
csv.read_header();
|
221
|
+
|
222
|
+
size_t fldSize=csv.fldSize();
|
223
|
+
VALUE names=rb_ary_new2(fldSize);
|
224
|
+
|
225
|
+
if(nfn){
|
226
|
+
for(size_t i=0; i<fldSize; i++){
|
227
|
+
rb_ary_store( names, i, INT2FIX(i) );
|
228
|
+
}
|
229
|
+
}else{
|
230
|
+
for(size_t i=0; i<fldSize; i++){
|
231
|
+
rb_ary_store( names, i, str2rbstr( csv.fldName(i).c_str()) );
|
232
|
+
}
|
233
|
+
}
|
234
|
+
csv.close();
|
235
|
+
|
236
|
+
return names;
|
237
|
+
|
238
|
+
}catch(kgError& err){ // kgmod関係エラーのchatch
|
239
|
+
err.addModName(name);
|
240
|
+
kgMsg msg(kgMsg::ERR, &env);
|
241
|
+
msg.output(err.message());
|
242
|
+
throw;
|
243
|
+
}
|
244
|
+
|
245
|
+
// 件数を返す
|
246
|
+
//return INT2NUM(recNo);
|
247
|
+
|
248
|
+
}catch(...){
|
249
|
+
rb_raise(rb_eRuntimeError,"Error at csvin_init()");
|
250
|
+
}
|
251
|
+
|
252
|
+
void Init_mmethods(void) {
|
253
|
+
// モジュール定義:MCMD::xxxxの部分
|
254
|
+
VALUE mcmd=rb_define_module("MCMD");
|
255
|
+
|
256
|
+
rb_define_module_function(mcmd,"mrecount" , (VALUE (*)(...))mrecount , -1);
|
257
|
+
rb_define_module_function(mcmd,"mheader" , (VALUE (*)(...))mheader , -1);
|
258
|
+
}
|
259
|
+
|