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");
            }
        }
Esempio n. 2
0
        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;
            }
        }