Skip to content

Commit

Permalink
Added support for SQLite. Closes #62.
Browse files Browse the repository at this point in the history
  • Loading branch information
hisystems committed Jul 25, 2012
1 parent 08d2655 commit 431ec4c
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 3 deletions.
3 changes: 2 additions & 1 deletion Database/Database.cs
Expand Up @@ -38,7 +38,8 @@ public enum ConnectionType
MySQL,
Pervasive,
SQLServerCompactEdition,
HyperSQL
HyperSQL,
SQLite
}

private ConnectionController pobjConnection;
Expand Down
1 change: 1 addition & 0 deletions DatabaseObjects.csproj
Expand Up @@ -223,6 +223,7 @@
<Compile Include="SQL\Serializers\MySqlSerializer.cs" />
<Compile Include="SQL\Serializers\PervasiveSerializer.cs" />
<Compile Include="SQL\Serializers\Serializers.cs" />
<Compile Include="SQL\Serializers\SQLiteSerializer.cs" />
<Compile Include="SQL\TableDefinition\SQLTableFields.cs" />
<Compile Include="SQL\TableDefinition\SQLAlterTable.cs" />
<Compile Include="SQL\SQLStatements.cs" />
Expand Down
139 changes: 139 additions & 0 deletions SQL/Serializers/SQLiteSerializer.cs
@@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DatabaseObjects.SQL.Serializers
{
internal class SQLiteSerializer : Serializer
{
public override Database.ConnectionType Type
{
get
{
return Database.ConnectionType.SQLite;
}
}

public override string SerializeByteArray(byte[] bytData)
{
return SerializeByteArray("X'", bytData, "'");
}

public override string SerializeAlterTableFieldsModifier(SQLTableFields.AlterModeType alterMode)
{
if (alterMode == SQLTableFields.AlterModeType.Drop)
throw new NotSupportedException("SQLite does not support dropping a column");
else
return base.SerializeAlterTableFieldsModifier(alterMode);
}

public override string SerializeDropIndex(SQLDropIndex dropIndex)
{
if (String.IsNullOrEmpty(dropIndex.Name))
throw new Exceptions.DatabaseObjectsException("IndexName has not been set.");

// Table name is NOT used as in other database systems - it must be a globably unique index name
return "DROP INDEX " + SerializeIdentifier(dropIndex.Name);
}

public override string SerializeTableField(SQLTableField field, SQLTableFields.AlterModeType alterMode)
{
// if altering or creating a field append the AUTOINCREMENT. Field format: name datatype default nullable keytype AUTOINCREMENT
if (alterMode != SQLTableFields.AlterModeType.Drop && field.AutoIncrements)
return base.SerializeTableField(field, alterMode) + " AUTOINCREMENT";
else
return base.SerializeTableField(field, alterMode);
}

public override string SerializeAutoIncrementValue(SQLAutoIncrementValue autoIncrementValue)
{
return "SELECT last_insert_rowid() AS " + autoIncrementValue.ReturnFieldName;
}

public override string SerializeTableExists(SQLTableExists tableExists)
{
var select = new SQLSelect();

select.Tables.Add("sqlite_master");
select.Where.Add("type", ComparisonOperator.EqualTo, "table");
select.Where.Add("name", ComparisonOperator.EqualTo, tableExists.Name);

return SerializeSelect(select);
}

public override string SerializeViewExists(SQLViewExists viewExists)
{
var select = new SQLSelect();

select.Tables.Add("sqlite_master");
select.Where.Add("Type", ComparisonOperator.EqualTo, "View");
select.Where.Add("Name", ComparisonOperator.EqualTo, viewExists.ViewName);

return SerializeSelect(select);
}

public override string SerializeIdentifier(string strIdentifierName)
{
return "\"" + strIdentifierName + "\"";
}

public override string SerializeDataType(SQL.DataType dataType, int size, int precision, int scale)
{
switch (dataType)
{
case DataType.TinyInteger:
return "TINYINT";
case DataType.SmallInteger:
return "SMALLINT";
case DataType.Integer:
return "INTEGER";
case DataType.BigInteger:
return "BIGINT";
case DataType.Character:
return "CHARACTER(" + size.ToString() + ")";
case DataType.UnicodeCharacter:
return "NCHAR(" + size.ToString() + ")";
case DataType.VariableCharacter:
return "VARCHAR(" + size.ToString() + ")";
case DataType.UnicodeVariableCharacter:
return "NVARCHAR(" + size.ToString() + ")";
case DataType.Decimal:
return "DECIMAL(" + precision.ToString() + "," + scale.ToString() + ")";
case DataType.Real:
return "FLOAT";
case DataType.Float:
return "DOUBLE";
case DataType.SmallMoney:
return "DECIMAL(10,4)";
case DataType.Money:
return "DECIMAL(19,4)";
case DataType.Boolean:
return "INTEGER";
case DataType.SmallDateTime:
// TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS")
return "DATETIME ";
case DataType.DateTime:
// TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS")
return "DATETIME";
case DataType.TimeStamp:
return "DATETIME";
case DataType.Text:
return "TEXT";
case DataType.UnicodeText:
return "TEXT";
case DataType.Binary:
return "BLOB";
case DataType.VariableBinary:
return "BLOB";
case DataType.Image:
return "BLOB";
case DataType.UniqueIdentifier:
return "GUID";
default:
return base.SerializeDataType(dataType, size, precision, scale);
}

}
}
}
4 changes: 2 additions & 2 deletions SQL/Serializers/Serializer.cs
Expand Up @@ -1173,10 +1173,10 @@ public virtual string SerializeDateTimeValue(DateTime dateTime)
if (dateTime.Day == 1 && dateTime.Month == 1 && dateTime.Year == 1)
dateTimeString = "1899-12-30";
else
dateTimeString = dateTime.Year + "-" + dateTime.Month + "-" + dateTime.Day;
dateTimeString = dateTime.ToString("yyyy-MM-dd");

if (dateTime.Hour != 0 || dateTime.Minute != 0 || dateTime.Second != 0)
dateTimeString += " " + dateTime.Hour + ":" + dateTime.Minute + ":" + dateTime.Second + "." + dateTime.Millisecond;
dateTimeString += " " + dateTime.ToString("HH:mm:ss.fff");

return dateTimeString;
}
Expand Down
1 change: 1 addition & 0 deletions SQL/Serializers/Serializers.cs
Expand Up @@ -24,6 +24,7 @@ static Serializers()
Items.Add(Database.ConnectionType.MySQL, new MySqlSerializer());
Items.Add(Database.ConnectionType.HyperSQL, new HyperSqlSerializer());
Items.Add(Database.ConnectionType.Pervasive, new PervasiveSerializer());
Items.Add(Database.ConnectionType.SQLite, new SQLiteSerializer());
}
}
}

0 comments on commit 431ec4c

Please sign in to comment.