Changes required to work with mono 1.2.6 and recent unixodbc.
[schedulator.git] / wvdbi.cs
blobb104e7d86bfe69c69aec4f669799222d19fa724b
1 using System;
2 using System.Data;
3 using System.Data.Odbc;
4 using System.Collections.Specialized;
5 using Wv.Utils;
7 namespace Wv.Dbi
9 public class Db
11 IDbConnection db;
12 static Ini settings = new Ini("wvodbc.ini");
14 public Db(string odbcstr)
16 string real;
18 if (settings[odbcstr].Count > 0)
20 StringDictionary sect = settings[odbcstr];
22 string s = wv.fmt("driver={0};server={1};database={2};"
23 + "uid={3};pwd={4};",
24 sect["driver"], sect["server"],
25 sect["database"],
26 sect["user"], sect["password"]);
27 real = s;
29 else if (String.Compare(odbcstr, 0, "dsn=", 0, 4, true) == 0)
30 real = odbcstr;
31 else if (String.Compare(odbcstr, 0, "driver=", 0, 7, true) == 0)
32 real = odbcstr;
33 else
34 throw new ArgumentException
35 ("unrecognized odbc string '" + odbcstr + "'");
36 db = new OdbcConnection(real);
37 db.Open();
40 public IDbCommand prepare(string sql, int nparams)
42 IDbCommand cmd = db.CreateCommand();
43 cmd.CommandText = sql;
44 for (int i = 0; i < nparams; i++)
45 cmd.Parameters.Add(cmd.CreateParameter());
46 cmd.Prepare();
47 return cmd;
50 void bind(IDbCommand cmd, params object[] args)
52 int i = 0;
53 foreach (IDataParameter param in cmd.Parameters)
55 object o = args[i++];
56 if (o is DateTime)
57 param.DbType = DbType.DateTime;
58 else
59 param.DbType = DbType.String; // I sure hope so...
60 param.Value = o;
64 public IDataReader select(string sql, params object[] args)
66 return select(prepare(sql, args.Length), args);
69 public IDataReader select(IDbCommand cmd, params object[] args)
71 bind(cmd, args);
72 return cmd.ExecuteReader();
75 public int execute(string sql, params object[] args)
77 return execute(prepare(sql, args.Length), args);
80 public int execute(IDbCommand cmd, params object[] args)
82 bind(cmd, args);
83 return cmd.ExecuteNonQuery();
86 public int try_execute(string sql, params object[] args)
88 try
90 return execute(sql, args);
92 catch (OdbcException)
94 // well, I guess no rows were affected...
95 return 0;