21
21
import org .casbin .jcasbin .persist .Helper ;
22
22
23
23
import javax .sql .DataSource ;
24
+ import java .math .BigDecimal ;
24
25
import java .sql .*;
25
26
import java .util .*;
26
27
27
28
class CasbinRule {
29
+ int id ; //Fields reserved for compatibility with other adapters, and the primary key is automatically incremented.
28
30
String ptype ;
29
31
String v0 ;
30
32
String v1 ;
@@ -40,6 +42,7 @@ class CasbinRule {
40
42
*/
41
43
public class JDBCAdapter implements Adapter {
42
44
private DataSource dataSource = null ;
45
+ private final int batchSize = 1000 ;
43
46
44
47
/**
45
48
* JDBCAdapter is the constructor for JDBCAdapter.
@@ -65,19 +68,61 @@ public JDBCAdapter(DataSource dataSource) throws Exception {
65
68
66
69
private void migrate () throws SQLException {
67
70
try (Connection conn = dataSource .getConnection (); Statement stmt = conn .createStatement ()) {
68
- String sql = "CREATE TABLE IF NOT EXISTS casbin_rule(ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))" ;
71
+ String sql = "CREATE TABLE IF NOT EXISTS casbin_rule(id int NOT NULL PRIMARY KEY auto_increment, ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))" ;
69
72
String productName = conn .getMetaData ().getDatabaseProductName ();
70
73
71
74
switch (productName ) {
72
- case "Oracle" : {
73
- sql = "declare begin execute immediate 'CREATE TABLE CASBIN_RULE(ptype VARCHAR(100) not NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))'; exception when others then if SQLCODE = -955 then null; else raise; end if; end;" ;
74
- }
75
- case "Microsoft SQL Server" : {
76
- sql = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='casbin_rule' and xtype='U') CREATE TABLE casbin_rule(ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))" ;
77
- }
75
+ case "Oracle" :
76
+ sql = "declare begin execute immediate 'CREATE TABLE CASBIN_RULE(id NUMBER(5, 0) not NULL primary key, ptype VARCHAR(100) not NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))'; " +
77
+ "exception when others then " +
78
+ "if SQLCODE = -955 then " +
79
+ "null; " +
80
+ "else raise; " +
81
+ "end if; " +
82
+ "end;" ;
83
+ break ;
84
+ case "Microsoft SQL Server" :
85
+ sql = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='casbin_rule' and xtype='U') CREATE TABLE casbin_rule(id int NOT NULL primary key identity(1, 1), ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))" ;
86
+ break ;
87
+ case "PostgreSQL" :
88
+ sql = "CREATE SEQUENCE IF NOT EXISTS CASBIN_SEQUENCE START 1;" ;
89
+ break ;
78
90
}
79
91
80
92
stmt .executeUpdate (sql );
93
+ if (productName .equals ("Oracle" )) {
94
+ sql = "declare " +
95
+ "V_NUM number;" +
96
+ "BEGIN " +
97
+ "V_NUM := 0; " +
98
+ "select count(0) into V_NUM from user_sequences where sequence_name = 'CASBIN_SEQUENCE';" +
99
+ "if V_NUM > 0 then " +
100
+ "null;" +
101
+ "else " +
102
+ "execute immediate 'CREATE SEQUENCE casbin_sequence increment by 1 start with 1 nomaxvalue nocycle nocache';" +
103
+ "end if;END;" ;
104
+ stmt .executeUpdate (sql );
105
+ sql = "declare " +
106
+ "V_NUM number;" +
107
+ "BEGIN " +
108
+ "V_NUM := 0;" +
109
+ "select count(0) into V_NUM from user_triggers where trigger_name = 'CASBIN_ID_AUTOINCREMENT';" +
110
+ "if V_NUM > 0 then " +
111
+ "null;" +
112
+ "else " +
113
+ "execute immediate 'create trigger casbin_id_autoincrement before " +
114
+ " insert on CASBIN_RULE for each row " +
115
+ " when (new.id is null) " +
116
+ " begin " +
117
+ " select casbin_sequence.nextval into:new.id from dual;" +
118
+ " end;';" +
119
+ "end if;" +
120
+ "END;" ;
121
+ stmt .executeUpdate (sql );
122
+ } else if (productName .equals ("PostgreSQL" )) {
123
+ sql = "CREATE TABLE IF NOT EXISTS casbin_rule(id int NOT NULL PRIMARY KEY default nextval('CASBIN_SEQUENCE'::regclass), ptype VARCHAR(100) NOT NULL, v0 VARCHAR(100), v1 VARCHAR(100), v2 VARCHAR(100), v3 VARCHAR(100), v4 VARCHAR(100), v5 VARCHAR(100))" ;
124
+ stmt .executeUpdate (sql );
125
+ }
81
126
}
82
127
}
83
128
@@ -117,19 +162,19 @@ public void loadPolicy(Model model) {
117
162
while (rSet .next ()) {
118
163
CasbinRule line = new CasbinRule ();
119
164
for (int i = 1 ; i <= rData .getColumnCount (); i ++) {
120
- if (i == 1 ) {
165
+ if (i == 2 ) {
121
166
line .ptype = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
122
- } else if (i == 2 ) {
123
- line .v0 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
124
167
} else if (i == 3 ) {
125
- line .v1 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
168
+ line .v0 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
126
169
} else if (i == 4 ) {
127
- line .v2 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
170
+ line .v1 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
128
171
} else if (i == 5 ) {
129
- line .v3 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
172
+ line .v2 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
130
173
} else if (i == 6 ) {
131
- line .v4 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
174
+ line .v3 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
132
175
} else if (i == 7 ) {
176
+ line .v4 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
177
+ } else if (i == 8 ) {
133
178
line .v5 = rSet .getObject (i ) == null ? "" : (String ) rSet .getObject (i );
134
179
}
135
180
}
@@ -179,12 +224,10 @@ public void savePolicy(Model model) {
179
224
try (Connection conn = dataSource .getConnection ()) {
180
225
conn .setAutoCommit (false );
181
226
182
- final int batchSize = 1000 ;
183
227
int count = 0 ;
184
228
185
229
try (Statement statement = conn .createStatement (); PreparedStatement ps = conn .prepareStatement (addSql )) {
186
230
statement .execute (cleanSql );
187
-
188
231
for (Map .Entry <String , Assertion > entry : model .model .get ("p" ).entrySet ()) {
189
232
String ptype = entry .getKey ();
190
233
Assertion ast = entry .getValue ();
0 commit comments