/// <summary>Gets the revision of a specified directory.</summary> /// <param name="path">The path to check.</param> /// <returns>The revision number.</returns> public static int GetRevision(string path) { var svnRoot = GetRootPath(path); if (GetVersion(path) > 10) { using (var storage = new SQLiteStorage(@"file:///" + svnRoot)) { var revision = (long)storage.QueryValue(database: "wc", table: "nodes", cmd: "SELECT MAX(revision) FROM " + storage.FQTN("wc", "nodes")); return((int)revision); } } if (!Directory.Exists(svnRoot)) { throw new DirectoryNotFoundException(); } try { var svnEntries = ReadEntries(svnRoot); return(int.Parse(svnEntries[3])); } catch { throw new InvalidDataException("Cannot determine svn revision!"); } }
/// <summary>Initializes a new instance of the <see cref="SQLiteDatabase" /> class.</summary> /// <param name="storage">The storage engine.</param> /// <param name="name">The name of the database.</param> public SQLiteDatabase(SQLiteStorage storage, string name) : base(storage, name) { var fields = new List <FieldProperties> { new FieldProperties { Index = 0, DataType = DataType.String, Name = "type" }, new FieldProperties { Index = 1, DataType = DataType.String, Name = "name" }, new FieldProperties { Index = 2, DataType = DataType.String, Name = "tbname" }, new FieldProperties { Index = 3, DataType = DataType.Int64, Name = "rootpage" }, new FieldProperties { Index = 4, DataType = DataType.String, Name = "sql" } }; foreach (var field in fields) { field.NameAtDatabase = field.Name; field.TypeAtDatabase = field.DataType; field.Validate(); } var expected = RowLayout.CreateUntyped(name, fields.ToArray()); var schema = SqlStorage.QuerySchema(Name, "sqlite_master"); SqlStorage.CheckLayout(expected, schema); }
/// <inheritdoc /> public override ITable CreateTable(RowLayout layout, TableFlags flags) { if (layout == null) { throw new ArgumentNullException(nameof(layout)); } if ((flags & TableFlags.InMemory) != 0) { throw new NotSupportedException($"Table '{layout.Name}' does not support TableFlags.{flags}"); } if (layout.Name.HasInvalidChars(ASCII.Strings.SafeName)) { throw new ArgumentException($"Table name {layout.Name} contains invalid chars!"); } var queryText = new StringBuilder(); queryText.Append($"CREATE TABLE {SqlStorage.FQTN(Name, layout.Name)} ("); for (var i = 0; i < layout.FieldCount; i++) { var fieldProperties = layout[i]; if (i > 0) { queryText.Append(","); } queryText.Append(fieldProperties.NameAtDatabase); queryText.Append(" "); var valueType = SQLiteStorage.GetValueType(fieldProperties.DataType); switch (valueType) { case SQLiteValueType.BLOB: queryText.Append("BLOB"); break; case SQLiteValueType.INTEGER: queryText.Append("INTEGER"); break; case SQLiteValueType.REAL: queryText.Append("REAL"); break; case SQLiteValueType.TEXT: queryText.Append("TEXT"); break; default: throw new NotImplementedException($"Unknown ValueType {valueType}!"); } if ((fieldProperties.Flags & FieldFlags.ID) != 0) { queryText.Append(" PRIMARY KEY"); } if ((fieldProperties.Flags & FieldFlags.AutoIncrement) != 0) { queryText.Append(" AUTOINCREMENT"); } if ((fieldProperties.Flags & FieldFlags.Unique) != 0) { queryText.Append(" UNIQUE"); } } queryText.Append(")"); SqlStorage.Execute(database: Name, table: layout.Name, cmd: queryText.ToString()); for (var i = 0; i < layout.FieldCount; i++) { var fieldProperties = layout[i]; if ((fieldProperties.Flags & FieldFlags.ID) != 0) { continue; } if ((fieldProperties.Flags & FieldFlags.Index) != 0) { var command = $"CREATE INDEX {"idx_" + layout.Name + "_" + fieldProperties.Name} ON {layout.Name} ({fieldProperties.Name})"; SqlStorage.Execute(database: Name, table: layout.Name, cmd: command); } } return(GetTable(layout)); }