internal virtual void CreateTableFromObject(string tableName, IEnumerable <ColumnDefinition> columns) { ColumnDefinition idColumn = columns.FirstOrDefault(c => c.Name.Equals(MobileServiceSystemColumns.Id)); var colDefinitions = columns.Where(c => c != idColumn).Select(c => String.Format("{0} {1}", SqlHelpers.FormatMember(c.Name), c.StoreType)).ToList(); if (idColumn != null) { colDefinitions.Insert(0, String.Format("{0} {1} PRIMARY KEY", SqlHelpers.FormatMember(idColumn.Name), idColumn.StoreType)); } String tblSql = string.Format("CREATE TABLE IF NOT EXISTS {0} ({1})", SqlHelpers.FormatTableName(tableName), String.Join(", ", colDefinitions)); this.ExecuteNonQuery(tblSql, parameters: null); string infoSql = string.Format("PRAGMA table_info({0});", SqlHelpers.FormatTableName(tableName)); IDictionary <string, JObject> existingColumns = this.ExecuteQuery((TableDefinition)null, infoSql, parameters: null) .ToDictionary(c => c.Value <string>("name"), StringComparer.OrdinalIgnoreCase); // new columns that do not exist in existing columns var columnsToCreate = columns.Where(c => !existingColumns.ContainsKey(c.Name)); foreach (ColumnDefinition column in columnsToCreate) { string createSql = string.Format("ALTER TABLE {0} ADD COLUMN {1} {2}", SqlHelpers.FormatTableName(tableName), SqlHelpers.FormatMember(column.Name), column.StoreType); this.ExecuteNonQuery(createSql, parameters: null); } // NOTE: In SQLite you cannot drop columns, only add them. }
public override QueryNode Visit(MemberAccessNode nodeIn) { string memberName = SqlHelpers.FormatMember(nodeIn.MemberName); this.sql.Append(memberName); return(nodeIn); }
public string FormatDelete() { var delQuery = this.query.Clone(); // create a copy to avoid modifying the original delQuery.Selection.Clear(); delQuery.Selection.Add(MobileServiceSystemColumns.Id); delQuery.IncludeTotalCount = false; var formatter = new SqlQueryFormatter(delQuery); string selectIdQuery = formatter.FormatSelect(); string idMemberName = SqlHelpers.FormatMember(MobileServiceSystemColumns.Id); string tableName = SqlHelpers.FormatTableName(delQuery.TableName); string command = string.Format("DELETE FROM {0} WHERE {1} IN ({2})", tableName, idMemberName, selectIdQuery); this.Parameters = formatter.Parameters; return(command); }
private void BatchUpdate(string tableName, IEnumerable <JObject> items, List <ColumnDefinition> columns) { if (columns.Count <= 1) { return; // For update to work there has to be at least once column besides Id that needs to be updated } ValidateParameterCount(columns.Count); string sqlBase = String.Format("UPDATE {0} SET ", SqlHelpers.FormatTableName(tableName)); foreach (JObject item in items) { var sql = new StringBuilder(sqlBase); var parameters = new Dictionary <string, object>(); ColumnDefinition idColumn = columns.FirstOrDefault(c => c.Name.Equals(MobileServiceSystemColumns.Id)); if (idColumn == null) { continue; } foreach (var column in columns.Where(c => c != idColumn)) { string paramName = AddParameter(item, parameters, column); sql.AppendFormat("{0} = {1}", SqlHelpers.FormatMember(column.Name), paramName); sql.Append(","); } if (parameters.Any()) { sql.Remove(sql.Length - 1, 1); // remove the trailing comma } sql.AppendFormat(" WHERE {0} = {1}", SqlHelpers.FormatMember(MobileServiceSystemColumns.Id), AddParameter(item, parameters, idColumn)); this.ExecuteNonQuery(sql.ToString(), parameters); } }
public string FormatSelect() { var command = new StringBuilder("SELECT "); if (this.query.Selection.Any()) { string columnNames = String.Join(", ", this.query.Selection.Select(c => SqlHelpers.FormatMember(c))); command.Append(columnNames); } else { command.Append("*"); } return(FormatQuery(command.ToString())); }