Subject | Re: DDL Scripts |
---|---|
Author | Roman Rokytskyy |
Post date | 2003-07-14T12:18:05Z |
> I need an application to manage my production database, in order toNo. My applications generates all tables and procedures on the fly.
> insert some client's data every time I get a new client. There is no
> problem on it. Besides, I need to create some per client specific
> tables in the same process. So I need to execute DDL scripts within
> my manager java application.
>
> Is this really a very strange situation?
> Anyway, how should I best do it?JayBird does not have a separate component to execute scripts.
However, you can easily write your own. Only keep in mind that usually
Firebird scripts contain following "control commands":
- "SET NAMES XXXX;" can happen only on the begining of the script, set
the lc_ctype property of the connection accordingly;
- "COMMIT;" and "COMMIT WORK;"; commit.
- "SET TERM XXXYYYY"; change current terminating character sequence
from YYY to XXX, default statement terminating sequence is ";"
(semicolon).
- if statement to execute is DDL statement(i.e. starts with "CREATE",
"ALTER" or "DROP"), commit after executing it (unless script contains
"SET AUTODDL OFF;").
Then you simply parse your script, split it into the statements and
execute using normal java.sql.Statement instance:
Properties props = new Properties();
props.setProperty("user", "sysdba");
props.setProperty("password", "masterkey");
MyFirebirdScriptTokenizer st = new MyFirebirdScriptTokenizer(script);
if (st.getNames() != null)
props.setProperty("lc_ctype", st.getNames());
Connection con = DriverManager.getConnection(myUrl, props);
con.setAutoCommit(false);
Statement stmt = con.createStatement();
while(st.hasMoreTokens()) {
String sql = st.nextToken();
if (isDDL(sql)) {
con.commit(); // commit previous statements
stmt.execute(sql);
con.commit();
} else
stmt.execute(sql);
}
con.commit();
Best regards,
Roman Rokytskyy