OSDN Git Service

i
[luz/luz.git] / lacoder / src / com / lavans / lacoder / writer / DaoXmlWriter.java
1 package com.lavans.lacoder.writer;\r
2 \r
3 import java.util.List;\r
4 \r
5 import org.apache.commons.logging.Log;\r
6 import org.apache.commons.logging.LogFactory;\r
7 \r
8 import com.lavans.lacoder.db.OracleDialect;\r
9 import com.lavans.lacoder.db.TypeManager;\r
10 import com.lavans.lacoder.model.Attribute;\r
11 import com.lavans.lacoder.model.Entity;\r
12 import com.lavans.luz2.commons.StringUtils;\r
13 \r
14 public class DaoXmlWriter {\r
15         private static Log logger = LogFactory.getLog(DaoXmlWriter.class);\r
16         private Entity entity;\r
17         private String pkWhere;\r
18         String tableName;\r
19 \r
20         private String pkSelectColumns;\r
21         private String allSelectColumns;\r
22         private String allInsertColumns;\r
23         private String allUpdateColumns;\r
24 \r
25         public DaoXmlWriter(Entity entity){\r
26                 this.entity = entity;\r
27                 parse();\r
28         }\r
29 \r
30         public Entity getEntity() {\r
31                 return entity;\r
32         }\r
33 \r
34         public void setEntity(Entity entity) {\r
35                 this.entity = entity;\r
36                 parse();\r
37         }\r
38 \r
39         public void parse(){\r
40                 tableName = StringUtils.toUnderscore(entity.getName()).toUpperCase();\r
41                 // primaryKeyが2つ以上の場合はとりあえず両方ともStringとして扱う?。\r
42                 List<Attribute> primaryKeyList = entity.getPrimaryKeyList();\r
43                 logger.info("--pk数:"+primaryKeyList.size());\r
44 \r
45                 // WHERE句における更新条件作成\r
46                 StringBuffer whereBuf = new StringBuffer();\r
47                 StringBuffer pkBuf = new StringBuffer();\r
48                 // 全カラム名\r
49                 StringBuffer allSelectBuf = new StringBuffer();\r
50                 StringBuffer allInsertBuf = new StringBuffer();\r
51                 StringBuffer allUpdateBuf = new StringBuffer();\r
52                 for(Attribute attr: entity.getAttrList()){\r
53                         if(attr.isPrimaryKey()){\r
54                                 whereBuf.append(" AND "+ attr.getConstName() +"=:"+ attr.getName());\r
55                                 pkBuf.append(", ").append(tableName).append(".").append(attr.getConstName());\r
56                         }\r
57                         allSelectBuf.append(", ").append(tableName).append(".").append(attr.getConstName());\r
58                         allInsertBuf.append(attr.getInsertSql());\r
59                         allUpdateBuf.append(attr.getUpdateSql());\r
60                 }\r
61                 pkWhere = whereBuf.substring(5);\r
62                 pkSelectColumns  = pkBuf.substring(2);\r
63                 allSelectColumns = allSelectBuf.substring(2);\r
64                 allInsertColumns = allInsertBuf.substring(2);\r
65                 allUpdateColumns = allUpdateBuf.substring(2);\r
66         }\r
67 \r
68         public String writeSelectSql(){\r
69                 return "SELECT "+ allSelectColumns +" FROM "+ tableName +" WHERE "+ pkWhere;\r
70         }\r
71 \r
72         public String writeNextValSql(){\r
73                 return entity.getTypeManager().getNextval(entity.get(0));\r
74         }\r
75 \r
76         public String writeInsertSql(){\r
77                 StringBuffer buf = new StringBuffer();\r
78                 buf.append("INSERT INTO "+ tableName +" VALUES(");\r
79                 buf.append(""+ allInsertColumns +")");\r
80                 return buf.toString();\r
81         }\r
82         public String writeUpdateSql(){\r
83                 StringBuffer buf = new StringBuffer();\r
84                 buf.append("UPDATE "+ tableName +" SET ");\r
85                 buf.append(""+ allUpdateColumns +" WHERE "+ pkWhere);\r
86                 return buf.toString();\r
87         }\r
88 \r
89         // 削除\r
90         public String writeDeleteSql(){\r
91                 StringBuffer buf = new StringBuffer();\r
92                 buf.append("DELETE FROM "+ tableName +" WHERE "+ pkWhere);\r
93                 return buf.toString();\r
94         }\r
95         public String writeDeleteAnySql(){\r
96                 StringBuffer buf = new StringBuffer();\r
97                 buf.append("DELETE FROM "+ tableName +" $condition");\r
98                 return buf.toString();\r
99         }\r
100 \r
101         // 一覧\r
102         public String writeListCountSql(){\r
103                 StringBuffer buf = new StringBuffer();\r
104                 buf.append("SELECT COUNT(1) FROM "+ tableName +" $condition");\r
105                 return buf.toString();\r
106         }\r
107         public String writeListPagerSql(){\r
108                 TypeManager typeManager = entity.getTypeManager();\r
109                 StringBuffer buf = new StringBuffer();\r
110                 if(typeManager instanceof OracleDialect){\r
111                         buf.append("SELECT * FROM (SELECT A.*, ROWNUM AS NUM FROM (\n ");\r
112                 }\r
113                 buf.append(writeListAnySql()).append("\n$condition \n");\r
114                 if(typeManager instanceof OracleDialect){\r
115                         buf.append(") A ) WHERE NUM>:_start AND NUM<=:_end\n");\r
116                 }else{\r
117                         // Postgres/H2DB用 MySQLもOK?\r
118                         buf.append("LIMIT :_rows OFFSET :_offset\n");\r
119                 }\r
120                 return buf.toString();\r
121         }\r
122         public String writeListPagerPkSql(){\r
123                 TypeManager typeManager = entity.getTypeManager();\r
124                 StringBuffer buf = new StringBuffer();\r
125                 if(typeManager instanceof OracleDialect){\r
126                         buf.append("SELECT * FROM (SELECT A.*, ROWNUM AS NUM FROM (\n ");\r
127                 }\r
128                 buf.append(writeListAnySql()).append("\n$condition \n");\r
129                 if(typeManager instanceof OracleDialect){\r
130                         buf.append(") A ) WHERE NUM>:_start AND NUM<=:_end");\r
131                 }else{\r
132                         // Postgres用 MySQLもOK?\r
133                         buf.append("LIMIT :_rows OFFSET :_offset");\r
134                 }\r
135                 return buf.toString();\r
136         }\r
137         public String writeListAnySql(){\r
138                 StringBuffer buf = new StringBuffer();\r
139                 buf.append("SELECT "+ allSelectColumns +"\nFROM "+ tableName);  // $condition\n$order"\r
140                 return buf.toString();\r
141         }\r
142 \r
143         public String writeListAnyPkSql(){\r
144                 StringBuffer buf = new StringBuffer();\r
145                 buf.append("SELECT "+ pkSelectColumns +"\nFROM "+ tableName);   // $condition\n$order"\r
146                 return buf.toString();\r
147         }\r
148 \r
149         public String writeBackupSql(){\r
150                 StringBuffer buf = new StringBuffer();\r
151                 buf.append("INSERT INTO "+ tableName +"_BAK SELECT :pk,"+ allSelectColumns +"\nFROM "+ tableName +" WHERE "+ pkWhere);  // $condition\n$order"\r
152                 return buf.toString();\r
153         }\r
154         public String writeBackupNextValSql(){\r
155                 return entity.getTypeManager().getNextval(entity.get(0)).replace(tableName +"_PK_SEQ", tableName +"_BAK_PK_SEQ");\r
156         }\r
157 \r
158         public String writePagerBakSql(){\r
159                 TypeManager typeManager = entity.getTypeManager();\r
160                 StringBuffer buf = new StringBuffer();\r
161                 if(typeManager instanceof OracleDialect){\r
162                         buf.append("SELECT * FROM (SELECT A.*, ROWNUM AS NUM FROM (\n ");\r
163                 }\r
164                 buf.append("SELECT BACKUP_ID,BACKUP_DATE,"+ allSelectColumns +"\nFROM "+ tableName +"_BAK");\r
165                 buf.append("\n$condition \n");\r
166                 if(typeManager instanceof OracleDialect){\r
167                         buf.append(") A ) WHERE NUM>:_start AND NUM<=:_end\n");\r
168                 }else{\r
169                         // Postgres/H2DB用 MySQLもOK?\r
170                         buf.append("LIMIT :_rows OFFSET :_offset\n");\r
171                 }\r
172                 return buf.toString();\r
173         }\r
174 \r
175         public String writeRestoreSql(){\r
176                 StringBuffer buf = new StringBuffer();\r
177                 buf.append("INSERT INTO "+ tableName +"_BAK");\r
178                 buf.append("SELECT "+ pkSelectColumns + allSelectColumns +"\nFROM "+ tableName +"_BAK \nWHERE "+ pkWhere);\r
179                 return buf.toString();\r
180         }\r
181 \r
182 }\r