Esempio n. 1
0
 public bool StopTransaction()
 {
     transaction.Commit();
     transaction.Dispose();
     transaction = null;
     cnn.Close();
     cnn.Dispose();
     cnn = null;
     return(true);
 }
        public static JSONArray ExecuteQuerySync(string sql, Dictionary <string, object> parameters, bool useTransaction)
        {
            // Force transaction if it is an update, insert or delete.
            if (GAUtilities.StringMatch(sql.ToUpperInvariant(), "^(UPDATE|INSERT|DELETE)"))
            {
                useTransaction = true;
            }

            // Get database connection from singelton sharedInstance
            SqliteConnection sqlDatabasePtr = Instance.SqlDatabase;

            // Create mutable array for results
            JSONArray results = new JSONArray();

            SqliteTransaction transaction = null;
            SqliteCommand     command     = null;

            try
            {
                if (useTransaction)
                {
                    transaction = sqlDatabasePtr.BeginTransaction();
                }

                command = sqlDatabasePtr.CreateCommand();

                if (useTransaction)
                {
                    command.Transaction = transaction;
                }
                command.CommandText = sql;
                command.Prepare();

                // Bind parameters
                if (parameters.Count != 0)
                {
                    foreach (KeyValuePair <string, object> pair in parameters)
                    {
                        command.Parameters.AddWithValue(pair.Key, pair.Value);
                    }
                }

                using (SqliteDataReader reader = command.ExecuteReader())
                {
                    // Loop through results
                    while (reader.Read())
                    {
                        // get columns count
                        int columnCount = reader.FieldCount;

                        JSONObject row = new JSONObject();
                        for (int i = 0; i < columnCount; i++)
                        {
                            string column = reader.GetName(i);

                            if (string.IsNullOrEmpty(column))
                            {
                                continue;
                            }

                            row[column] = reader.GetValue(i).ToString();
                        }
                        results.Add(row);
                    }
                }

                if (useTransaction)
                {
                    transaction.Commit();
                }
            }
            catch (SqliteException e)
            {
                // TODO(nikolaj): Should we do a db validation to see if the db is corrupt here?
                GALogger.E("SQLITE3 ERROR: " + e);
                results = null;

                if (useTransaction)
                {
                    if (transaction != null)
                    {
                        try
                        {
                            transaction.Rollback();
                        }
                        catch (SqliteException ex)
                        {
                            GALogger.E("SQLITE3 ROLLBACK ERROR: " + ex);
                        }
                        finally
                        {
                            transaction.Dispose();
                        }
                    }
                }
            }
            finally
            {
                if (command != null)
                {
                    command.Dispose();
                }

                if (transaction != null)
                {
                    transaction.Dispose();
                }
            }

            // Return results
            return(results);
        }