#!/usr/bin/perl if($#ARGV < 0) { exit; } # file name must be TABLENAME.csv @names = split(/\./, $ARGV[0]); @path = split(/\//, $names[$#path-1]); $table = $path[$#path]; my $TABLENAME = $table; my $PACKAGENAME = lc($TABLENAME); my $CLASSNAME = ""; my @pkg_struct = split(/_/, $PACKAGENAME); foreach my $pkg (@pkg_struct) { $CLASSNAME .= ucfirst($pkg); } $CLASSNAME .= "Base"; @columns = (); @pks = (); @comments = (); %type_map; my $has_bigdecimal = 0; my $has_time = 0; my $has_date = 0; my $has_timestamp = 0; my $head = <<"_EOT_"; package dao.$PACKAGENAME.base; _EOT_ my $body = <<"_EOT_"; import dao.common.AbstractDto; import java.util.Map; import java.util.HashMap; import java.sql.Types; /** * $TABLENAME DTO クラス * \@author abe */ public abstract class $CLASSNAME extends AbstractDto { _EOT_ my $accessor = ""; open(IN, $ARGV[0]); while(my $line = ) { my $tmp = $line; $tmp =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; my @data = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_} ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); my $field = $data[1]; my $comment = $data[2]; my $is_pk = $data[3]; my $is_null = $data[6]; my $type = $data[7]; my $size = $data[8]; my $COLUMNTITLE = $comment; my $PRIMTYPE; my $TYPE; my $SQLTYPE; if($type eq "bigint" || $type eq "bigserial") { $PRIMTYPE = "long"; $TYPE = "Long"; $SQLTYPE = "BIGINT"; } elsif($type eq "smallint") { $PRIMTYPE = "short"; $TYPE = "Short"; $SQLTYPE = "SMALLINT"; } elsif($type eq "bool") { $PRIMTYPE = "boolean"; $TYPE = "Boolean"; $SQLTYPE = "BOOLEAN"; } elsif($type eq "date") { $PRIMTYPE = "Date"; $TYPE = "Date"; $SQLTYPE = "DATE"; $has_date = 1; } elsif($type eq "real" || $type eq "double") { $PRIMTYPE = "double"; $TYPE = "Double"; $SQLTYPE = "DOUBLE"; } elsif($type eq "float") { $PRIMTYPE = "float"; $TYPE = "Float"; $SQLTYPE = "FLOAT"; } elsif($type eq "tinyint") { $PRIMTYPE = "byte"; $TYPE = "Byte"; $SQLTYPE = "TINYINT"; } elsif($type eq "integer") { $PRIMTYPE = "int"; $TYPE = "Integer"; $SQLTYPE = "INTEGER"; } elsif($type =~ /^numeric/ || $type =~ /^decimal/) { $PRIMTYPE = "BigDecimal"; $TYPE = "BigDecimal"; $SQLTYPE = "BIGINT"; $has_bigdecimal = 1; } elsif($type eq "time") { $PRIMTYPE = "Time"; $TYPE = "Time"; $SQLTYPE = "TIME"; $has_time = 1; } elsif($type eq "timestamp") { $PRIMTYPE = "Timestamp"; $TYPE = "Timestamp"; $SQLTYPE = "TIMESTAMP"; $has_timestamp = 1; } else { $PRIMTYPE = "String"; $TYPE = "String"; $SQLTYPE = "VARCHAR"; } my @struct = split(/_/, lc($field)); my $METHOD; foreach my $str (@struct) { $METHOD .= ucfirst($str); } my $COLUMN = $field; $type_map{$COLUMN} = $SQLTYPE; push(@columns, $field); $accessor .= <<"_EOT_"; /** * $COLUMNTITLE を取得します * \@return $COLUMNTITLE */ public $TYPE get$METHOD() { return get$TYPE("$COLUMN"); } /** * $COLUMNTITLE を設定します * \@param value $COLUMNTITLE */ public void set$METHOD($TYPE value) { set("$COLUMN", value); } _EOT_ } close(IN); my @_columns; my @_fields; foreach my $column (@columns) { push(@_fields, " static public final String $column = \"$TABLENAME.$column\";"); push(@_columns, " \"$TABLENAME.$column\""); } my $column_defs = join("\r\n", @_fields) . "\r\n\r\n"; $column_defs .= " static private final String[] columns = {\r\n"; $column_defs .= join(",\r\n", @_columns) . "\r\n\t};\n"; $column_defs .= <<_EOT_; /** * カラム名を配列で取得する * @return カラム名の配列 */ static public String[] getColumns() { return columns; } _EOT_ my $type_defs = " static private final Map typeMap = new HashMap();\r\n"; $type_defs .= " static\r\n {\r\n"; foreach my $key (keys(%type_map)) { $type_defs .= " typeMap.put(\"$key\", Types." . $type_map{$key} . ");\r\n"; } $type_defs .= " }\r\n"; $type_defs .= <<_EOT_; /** * カラムの型情報を保持するMapを取得 * @return カラムの型情報を保持するMap */ public Map getTypeMap() { return typeMap; } _EOT_ $body .= $column_defs . $type_defs . $accessor . "}\r\n"; print $head; if($has_bigdecimal) { print "import java.math.BigDecimal;\r\n"; } if($has_date) { print "import java.sql.Date;\r\n"; } if($has_time) { print "import java.sql.Time;\r\n"; } if($has_timestamp) { print "import java.sql.Timestamp;\r\n"; } print $body;