long AcquireNextRangeInternal() { // TODO - fix me, this is hack using (Sooda.Sql.SqlDataSource sds = (Sooda.Sql.SqlDataSource)dataSourceInfo.CreateDataSource()) { sds.Open(); IDbConnection conn = sds.Connection; bool gotKey = false; bool justInserted = false; int maxRandomTimeout = 2; for (int i = 0; i < 10 && !gotKey; ++i) { string query = "select " + key_value_column + " from " + table_name + " where " + key_name_column + " = '" + keyName + "'"; IDbCommand cmd = conn.CreateCommand(); if (!sds.DisableTransactions) { cmd.Transaction = sds.Transaction; } cmd.CommandText = query; long keyValue = -1; using (IDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { keyValue = Convert.ToInt64(reader.GetValue(0)); } } if (keyValue == -1) { if (justInserted) { throw new Exception("FATAL DATABASE ERROR - cannot get new key value"); } cmd.CommandText = "insert into " + table_name + "(" + key_name_column + ", " + key_value_column + ") values('" + keyName + "', 1)"; cmd.ExecuteNonQuery(); justInserted = true; continue; } //Console.WriteLine("Got key: {0}", keyValue); //Console.WriteLine("Press any key to update database (simulating possible race condition here)."); //Console.ReadLine(); long nextKeyValue = keyValue + poolSize; cmd.CommandText = "update " + table_name + " set " + key_value_column + " = " + nextKeyValue + " where " + key_name_column + " = '" + keyName + "' and " + key_value_column + " = " + keyValue; int rows = cmd.ExecuteNonQuery(); // Console.WriteLine("{0} row(s) affected", rows); if (rows != 1) { // Console.WriteLine("Conflict on write, sleeping for random number of milliseconds ({0} max)", maxRandomTimeout); System.Threading.Thread.Sleep(1 + random.Next(maxRandomTimeout)); maxRandomTimeout = maxRandomTimeout * 2; // conflict on write continue; } else { sds.Commit(); //Console.WriteLine("New key range for {0} [{1}:{2}]", keyName, currentValue, maxValue); return(keyValue); } } throw new Exception("FATAL DATABASE ERROR - cannot get new key value"); } }
public void RunQuery() { try { string inputText = null; if (inputText == null || inputText.Length == 0) { inputText = TextEditorControl1.Text; } //translator.StripComments = true; DateTime translationStart = DateTime.Now; StringWriter sw = new StringWriter(); StringWriter sw2 = new StringWriter(); Sooda.Sql.SoqlToSqlConverter converter = new Sooda.Sql.SoqlToSqlConverter(sw, schemaInfo, new Sooda.Sql.SqlServerBuilder()); Sooda.QL.SoqlPrettyPrinter prettyPrinter = new Sooda.QL.SoqlPrettyPrinter(sw2); Sooda.QL.SoqlQueryExpression query = Sooda.QL.SoqlParser.ParseQuery(inputText); converter.ConvertQuery(query); prettyPrinter.PrintQuery(query); string sqlquery = sw.ToString(); string prettysoql = sw2.ToString(); DateTime translationEnd = DateTime.Now; translatedSql.Text = sqlquery; //.Replace("\n\n", "\n").Replace("\n\n", "\n").Replace("\n\n", "\n").Replace("\n", "\r\n"); translatedSql.Document.ReadOnly = true; translatedSql.Refresh(); soqlPrettyPrint.Text = prettysoql; //.Replace("\n\n", "\n").Replace("\n\n", "\n").Replace("\n\n", "\n").Replace("\n", "\r\n"); soqlPrettyPrint.Document.ReadOnly = true; soqlPrettyPrint.Refresh(); toolBarButtonRun.Enabled = false; toolBar1.Update(); DateTime t0 = DateTime.Now; // HACK DataSourceInfo dsi = schemaInfo.GetDataSourceInfo("default"); Sooda.Sql.SqlDataSource sds = (Sooda.Sql.SqlDataSource)dsi.CreateDataSource(); sds.Open(); try { IDbConnection conn = sds.Connection; IDbCommand cmd = conn.CreateCommand(); if (!sds.DisableTransactions) { cmd.Transaction = sds.Transaction; } cmd.CommandText = sqlquery; resultSet.Items.Clear(); resultSet.Columns.Clear(); IDataReader reader = cmd.ExecuteReader(); for (int i = 0; i < reader.FieldCount; ++i) { string name = reader.GetName(i); ColumnHeader ch = new ColumnHeader(); ch.Text = name; ch.TextAlign = HorizontalAlignment.Left; ch.Width = 100; resultSet.Columns.Add(ch); } resultSet.HeaderStyle = ColumnHeaderStyle.Nonclickable; StringBuilder csvText = new StringBuilder(); System.IO.StringWriter xmlStringWriter = new System.IO.StringWriter(); XmlTextWriter xmlWriter = new XmlTextWriter(xmlStringWriter); xmlWriter.Formatting = Formatting.Indented; xmlWriter.WriteStartDocument(true); xmlWriter.WriteStartElement("results"); while (reader.Read()) { xmlWriter.WriteStartElement("item"); object v = reader.GetValue(0); string text = (v is DBNull) ? "(null)" : v.ToString(); ListViewItem item = resultSet.Items.Add(text); AppendCsvValue(csvText, v); //if (!(v is DBNull)) xmlWriter.WriteAttributeString(reader.GetName(0), text); for (int i = 1; i < reader.FieldCount; ++i) { csvText.Append(";"); v = reader.GetValue(i); text = (v is DBNull) ? "(null)" : v.ToString(); item.SubItems.Add(text); //if (!(v is DBNull)) xmlWriter.WriteAttributeString(reader.GetName(i), text); AppendCsvValue(csvText, v); } csvText.Append("\r\n"); xmlWriter.WriteEndElement(); } xmlWriter.WriteEndElement(); csvResults.Text = csvText.ToString(); xmlResults.Text = xmlStringWriter.ToString(); foreach (ColumnHeader ch in resultSet.Columns) { ch.Width = -2; } } finally { sds.Close(); } DateTime t1 = DateTime.Now; messagesTextBox.Text = String.Format("Got {0} row(s)\r\nQuery took {1}\r\nTranslation took {2}", resultSet.Items.Count, t1 - t0, translationEnd - translationStart); } catch (Exception e) { messagesTextBox.Text = e.ToString(); MessageBox.Show(this, e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { toolBarButtonRun.Enabled = true; } }