Skip to content

Commit

Permalink
added support for DDL and Properties in SQLite
Browse files Browse the repository at this point in the history
  • Loading branch information
barthisrael committed Nov 9, 2020
1 parent 05d5007 commit c74a03e
Show file tree
Hide file tree
Showing 3 changed files with 212 additions and 88 deletions.
150 changes: 139 additions & 11 deletions OmniDB/OmniDB_app/include/OmniDatabase/SQLite.py
Original file line number Diff line number Diff line change
Expand Up @@ -411,8 +411,6 @@ def QueryTablesUniques(self, p_table=None):
''', True)

for v_table in v_tables.Rows:
v_unique_count = -1

v_uniques = self.v_connection.Query('''
PRAGMA index_list('{0}')
'''.format(
Expand All @@ -421,10 +419,8 @@ def QueryTablesUniques(self, p_table=None):

for v_unique in v_uniques.Rows:
if v_unique['origin'] == 'u':
v_unique_count += 1

v_uniques_all.AddRow([
'unique_{0}'.format(v_unique_count),
v_unique['name'],
v_table['name']
])

Expand Down Expand Up @@ -455,8 +451,6 @@ def QueryTablesUniquesColumns(self, p_unique, p_table=None):
''', True)

for v_table in v_tables.Rows:
v_unique_count = -1

v_uniques = self.v_connection.Query('''
PRAGMA index_list('{0}')
'''.format(
Expand All @@ -465,9 +459,7 @@ def QueryTablesUniquesColumns(self, p_unique, p_table=None):

for v_unique in v_uniques.Rows:
if v_unique['origin'] == 'u':
v_unique_count += 1

if ('unique_{0}'.format(v_unique_count)) == p_unique:
if v_unique['name'] == p_unique:
v_unique_columns = self.v_connection.Query('''
PRAGMA index_info('{0}')
'''.format(
Expand All @@ -476,7 +468,7 @@ def QueryTablesUniquesColumns(self, p_unique, p_table=None):

for v_unique_column in v_unique_columns.Rows:
v_uniques_all.AddRow([
'unique_{0}'.format(v_unique_count),
v_unique['name'],
v_unique_column['name'],
v_table['name']
])
Expand Down Expand Up @@ -925,3 +917,139 @@ def GetErrorPosition(self, p_error_message):
}

return v_return

def GetPropertiesTable(self, p_object):
return self.v_connection.Query('''
SELECT type AS "Type",
name AS "Name",
rootpage AS "Root Page"
FROM sqlite_master
WHERE type = 'table'
AND name = '{0}'
'''.format(p_object))

def GetPropertiesTableField(self, p_table, p_object):
return self.v_connection.Query('''
SELECT 'Column' AS "Type",
'{0}' AS "Name"
'''.format(p_object))

def GetPropertiesIndex(self, p_object):
return self.v_connection.Query('''
SELECT type AS "Type",
name AS "Name",
rootpage AS "Root Page"
FROM sqlite_master
WHERE type = 'index'
AND name = '{0}'
'''.format(p_object))

def GetPropertiesView(self, p_object):
return self.v_connection.Query('''
SELECT type AS "Type",
name AS "Name",
rootpage AS "Root Page"
FROM sqlite_master
WHERE type = 'view'
AND name = '{0}'
'''.format(p_object))

def GetPropertiesTrigger(self, p_table, p_object):
return self.v_connection.Query('''
SELECT type AS "Type",
name AS "Name",
rootpage AS "Root Page"
FROM sqlite_master
WHERE type = 'trigger'
AND name = '{0}'
AND tbl_name = '{1}'
'''.format(p_object, p_table))

def GetPropertiesPK(self, p_table, p_object):
return self.v_connection.Query('''
SELECT 'PK' AS "Type",
'{0}' AS "Name"
'''.format(p_object))

def GetPropertiesFK(self, p_table, p_object):
return self.v_connection.Query('''
SELECT 'FK' AS "Type",
'{0}' AS "Name"
'''.format(p_object))

def GetPropertiesUnique(self, p_table, p_object):
return self.v_connection.Query('''
SELECT 'Unique' AS "Type",
'{0}' AS "Name"
'''.format(p_object))

def GetProperties(self, p_table, p_object, p_type):
try:
if p_type == 'table':
return self.GetPropertiesTable(p_object).Transpose('Property', 'Value')
elif p_type == 'table_field':
return self.GetPropertiesTableField(p_table, p_object).Transpose('Property', 'Value')
elif p_type == 'index':
return self.GetPropertiesIndex(p_object).Transpose('Property', 'Value')
elif p_type == 'view':
return self.GetPropertiesView(p_object).Transpose('Property', 'Value')
elif p_type == 'trigger':
return self.GetPropertiesTrigger(p_table, p_object).Transpose('Property', 'Value')
elif p_type == 'pk':
return self.GetPropertiesPK(p_table, p_object).Transpose('Property', 'Value')
elif p_type == 'foreign_key':
return self.GetPropertiesFK(p_table, p_object).Transpose('Property', 'Value')
elif p_type == 'unique':
return self.GetPropertiesUnique(p_table, p_object).Transpose('Property', 'Value')
else:
return None
except Spartacus.Database.Exception as exc:
if str(exc) == 'Can only transpose a table with a single row.':
raise Exception('Object {0} does not exist anymore. Please refresh the tree view.'.format(p_object))
else:
raise exc

def GetDDLTable(self, p_object):
return self.v_connection.ExecuteScalar('''
SELECT sql
FROM sqlite_master
WHERE type = 'table'
AND name = '{0}'
'''.format(p_object))

def GetDDLIndex(self, p_object):
return self.v_connection.ExecuteScalar('''
SELECT sql
FROM sqlite_master
WHERE type = 'index'
AND name = '{0}'
'''.format(p_object))

def GetDDLView(self, p_object):
return self.v_connection.ExecuteScalar('''
SELECT sql
FROM sqlite_master
WHERE type = 'view'
AND name = '{0}'
'''.format(p_object))

def GetDDLTrigger(self, p_object, p_table):
return self.v_connection.ExecuteScalar('''
SELECT sql
FROM sqlite_master
WHERE type = 'trigger'
AND name = '{0}'
AND tbl_name = '{1}'
'''.format(p_object, p_table))

def GetDDL(self, p_table, p_object, p_type):
if p_type == 'table':
return self.GetDDLTable(p_object)
elif p_type == 'index':
return self.GetDDLIndex(p_object)
elif p_type == 'view':
return self.GetDDLView(p_object)
elif p_type == 'trigger':
return self.GetDDLTrigger(p_object, p_table)
else:
return ''
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,6 @@ function getTreeSqlite(p_div) {
node.tree.tag.create_table
);
}
}, {
text: 'Doc: Create Table',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: Create Table',
'https://sqlite.org/lang_createtable.html'
);
}
}]
},
'cm_table': {
Expand Down Expand Up @@ -308,17 +299,7 @@ function getTreeSqlite(p_div) {
)
);
}
}/*, {
text: 'Doc: Indexes',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: Indexes',
'https://www.sqlite.org/docs/' +
getMajorVersionSqlite(node.tree.tag.version) +
'/static/indexes.html');
}
}*/]
}]
},
'cm_index': {
elements: [{
Expand Down Expand Up @@ -396,15 +377,6 @@ function getTreeSqlite(p_div) {
)
);
}
}, {
text: 'Doc: Triggers',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: Triggers',
'https://www.sqlite.org/docs/' + getMajorVersionSqlite(node.tree.tag.version) + '/static/trigger-definition.html'
);
}
}]
},
'cm_trigger': {
Expand Down Expand Up @@ -462,17 +434,7 @@ function getTreeSqlite(p_div) {
node.tree.tag.create_view
);
}
}/*, {
text: 'Doc: Views',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: Views',
'https://www.sqlite.org/docs/' +
getMajorVersionSqlite(node.tree.tag.version) +
'/static/sql-createview.html');
}
}*/]
}]
},
'cm_view': {
elements: [{
Expand Down Expand Up @@ -699,40 +661,6 @@ function getTreeDetailsSqlite(node) {
}
});

/*node.tree.contextMenu.cm_server.elements.push({
text: 'Doc: Sqlite',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: Sqlite',
'https://www.sqlite.org/docs/' +
getMajorVersionSqlite(node.tree.tag.version) +
'/static/');
}
});
node.tree.contextMenu.cm_server.elements.push({
text: 'Doc: SQL Language',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: SQL Language',
'https://www.sqlite.org/docs/' +
getMajorVersionSqlite(node.tree.tag.version) +
'/static/sql.html');
}
});
node.tree.contextMenu.cm_server.elements.push({
text: 'Doc: SQL Commands',
icon: 'fas cm-all fa-globe-americas',
action: function(node) {
v_connTabControl.tag.createWebsiteTab(
'Documentation: SQL Commands',
'https://www.sqlite.org/docs/' +
getMajorVersionSqlite(node.tree.tag.version) +
'/static/sql-commands.html');
}
});*/

if (node.childNodes.length > 0) {
node.removeChildNodes();
}
Expand Down Expand Up @@ -2067,3 +1995,69 @@ function TemplateUpdateSqlite(p_table) {
true
);
}

/// <summary>
/// Retrieving properties.
/// </summary>
/// <param name="node">Node object.</param>
function getPropertiesSqlite(node) {
if (node.tag != undefined) {
if (node.tag.type == 'table') {
getProperties('/get_properties_sqlite/', {
p_table: null,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'table_field') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'view') {
getProperties('/get_properties_sqlite/', {
p_table: null,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'trigger') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'index') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text.replace(' (Non Unique)', '').replace(' (Unique)', ''),
p_type: node.tag.type
});
} else if (node.tag.type == 'pk') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'foreign_key') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text,
p_type: node.tag.type
});
} else if (node.tag.type == 'unique') {
getProperties('/get_properties_sqlite/', {
p_table: node.parent.parent.text,
p_object: node.text,
p_type: node.tag.type
});
} else {
clearProperties();
}
}

//Hooks
if (v_connTabControl.tag.hooks.sqliteTreeNodeClick.length>0) {
for (var i=0; i<v_connTabControl.tag.hooks.sqliteTreeNodeClick.length; i++)
v_connTabControl.tag.hooks.sqliteTreeNodeClick[i](node);
}
}
8 changes: 5 additions & 3 deletions OmniDB/OmniDB_app/views/tree_sqlite.py
Original file line number Diff line number Diff line change
Expand Up @@ -641,13 +641,15 @@ def get_properties(request, v_database):
v_ddl = ''

try:
v_properties = v_database.GetProperties(v_data['p_schema'],v_data['p_table'],v_data['p_object'],v_data['p_type'])
v_properties = v_database.GetProperties(v_data['p_table'], v_data['p_object'], v_data['p_type'])

for v_property in v_properties.Rows:
v_list_properties.append([v_property['Property'],v_property['Value']])
v_list_properties.append([v_property['Property'], v_property['Value']])

v_ddl = v_database.GetDDL(v_data['p_schema'],v_data['p_table'],v_data['p_object'],v_data['p_type'])
v_ddl = v_database.GetDDL(v_data['p_table'], v_data['p_object'], v_data['p_type'])
except Exception as exc:
import traceback
print(traceback.format_exc())
v_return['v_data'] = {'password_timeout': False, 'message': str(exc) }
v_return['v_error'] = True
return JsonResponse(v_return)
Expand Down

0 comments on commit c74a03e

Please sign in to comment.