def executeSql(self):
		
		if self.editSql.toPlainText().isEmpty():
			return

		txt = unicode(self.editSql.toPlainText())
		
		QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))

		try:
			c = self.db.con.cursor()
			t = QTime()
			t.start()
			self.db._exec_sql(c, txt)
			secs = t.elapsed() / 1000.0
			
			self.viewResult.setModel( SqlTableModel(c, self.viewResult) )
			
			# commit before closing the cursor to make sure that the changes are stored
			self.db.con.commit()
			c.close()
			
			self.lblResult.setText("%d rows, %.1f seconds" % (c.rowcount, secs))
			
			QApplication.restoreOverrideCursor()
		
		except postgis_utils.DbError, e:
			QApplication.restoreOverrideCursor()
			
			DlgDbError.showError(e, self)
    def onOK(self):

        if self.radLength.isChecked():
            fct = "length"
        elif self.radArea.isChecked():
            fct = "area"
        else:
            QMessageBox.information(self, "error", "No function selected!")
            return

        addTrigger = self.chkUpdateTrigger.isChecked()

        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))

        try:
            schema, table = unicode(self.cboSchema.currentText()), unicode(self.cboTable.currentText())
            resColumn, geomColumn = unicode(self.cboResColumn.currentText()), unicode(self.cboGeomColumn.currentText())
            self.db.table_apply_function(schema, table, resColumn, fct, geomColumn)

            if addTrigger:
                self.db.table_add_function_trigger(schema, table, resColumn, fct, geomColumn)

            QApplication.restoreOverrideCursor()

        except postgis_utils.DbError, e:
            QApplication.restoreOverrideCursor()

            DlgDbError.showError(e, self)
            return
	def addColumn(self):
		""" open dialog to set column info and add column to table """
		
		dlg = DlgFieldProperties(self)
		if not dlg.exec_():
			return
		
		name = unicode(dlg.editName.text())
		data_type = unicode(dlg.cboType.currentText())
		is_null = dlg.chkNull.isChecked()
		default = unicode(dlg.editDefault.text())
		if dlg.editLength.text().count() > 0:
			x = dlg.editLength.text().toInt()
			modifier = x[0] if x[1] else None
		else:
			modifier = None
		
		new_field = postgis_utils.TableField(name, data_type, is_null, default, modifier)
		
		self.emit(SIGNAL("aboutToChangeTable()"))
	
		try:
			# add column to table
			self.db.table_add_column(self.table, new_field, self.schema)
			self.populateFields()
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
	def deleteColumn(self):
		""" delete currently selected column """
		
		num = self.currentColumn()
		if num == -1:
			return
		
		m = self.viewFields.model()
		column = m.item(num, 1).text()
		data_type = m.item(num, 2).text()
		
		res = QMessageBox.question(self, "are you sure", "really delete column '%s' ?" % column, QMessageBox.Yes | QMessageBox.No)
		if res != QMessageBox.Yes:
			return
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			if data_type == "geometry":
				self.db.table_delete_geometry_column(self.table, column, self.schema)
			else:
				self.db.table_delete_column(self.table, column, self.schema)
				
			self.populateFields()
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
예제 #5
0
	def createTable(self):
		""" create table with chosen fields, optionally add a geometry column """
		
		schema = unicode(self.cboSchema.currentText())
		if len(schema) == 0:
			QMessageBox.information(self, "sorry", "select schema!")
			return
		
		table = unicode(self.editName.text())
		if len(table) == 0:
			QMessageBox.information(self, "sorry", "enter table name!")
			return
		
		m = self.fields.model()
		if m.rowCount() == 0:
			QMessageBox.information(self, "sorry", "add some fields!")
			return
		
		useGeomColumn = self.chkGeomColumn.isChecked()
		if useGeomColumn:
			geomColumn = unicode(self.editGeomColumn.text())
			geomType = str(self.cboGeomType.currentText())
			geomDim = self.spinGeomDim.value()
			try:
				geomSrid = int(self.editGeomSrid.text())
			except ValueError:
				geomSrid = -1
			useSpatialIndex = self.chkSpatialIndex.isChecked()
			if len(geomColumn) == 0:
				QMessageBox.information(self, "sorry", "set geometry column name")
				return
		
		flds = []
		for row in xrange(m.rowCount()):
			fldName = unicode(m.data(m.index(row,0,QModelIndex())).toString())
			fldType = unicode(m.data(m.index(row,1,QModelIndex())).toString())
			fldNull = m.data(m.index(row,2,QModelIndex())).toBool()
			
			flds.append( postgis_utils.TableField(fldName, fldType, fldNull) )
			
		pkey = unicode(self.cboPrimaryKey.currentText())
				
		if self.db:
			
			# commit to DB
			try:
				self.db.create_table(table, flds, pkey, schema)
				if useGeomColumn:
					self.db.add_geometry_column(table, geomType, schema, geomColumn, geomSrid, geomDim)
					# commit data definition changes, otherwise index can't be built
					self.db.con.commit()
					if useSpatialIndex:
						self.db.create_spatial_index(table, schema, geomColumn)
				self.emit(SIGNAL("databaseChanged()"))
			except postgis_utils.DbError, e:
				DlgDbError.showError(e, self)
				return
예제 #6
0
	def onOK(self):

		# execute and commit the code
		try:
			sql = "\n".join(self.updateSql())
			self.db._exec_sql_and_commit( sql )
			
			QMessageBox.information(self, "good!", "everything went fine!")
			self.accept()
			
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
	def constructTreeFromDb(self, db):
		""" creates a tree of schemas and tables from current DB connection """
		
		self.tableCount = 0
		
		if not db:
			return
		
		try:
			list_schemas = db.list_schemas()
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, None)
			return
	def editColumn(self):
		""" open dialog to change column info and alter table appropriately """

		num = self.currentColumn()
		if num == -1:
			return
		
		m = self.viewFields.model()
		# get column in table
		# (there can be missing number if someone deleted a column)
		column = unicode(m.item(num, 1).text())
		for col in self.fields:
			if col.name == column:
				break
		print col.num, col.name
		
		dlg = DlgFieldProperties(self, col)
		if not dlg.exec_():
			return
		
		new_name = unicode(dlg.editName.text())
		new_data_type = unicode(dlg.cboType.currentText())
		new_is_null = dlg.chkNull.isChecked()
		new_default = unicode(dlg.editDefault.text())
		
		if dlg.editLength.text().count() > 0:
			x = dlg.editLength.text().toInt()
			new_modifier = x[0] if x[1] else -1
		else:
			new_modifier = -1
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			if new_name != col.name:
				self.db.table_column_rename(self.table, col.name, new_name, self.schema)
			if new_data_type != col.data_type or new_modifier != col.modifier:
				if new_modifier >= 0:
					new_data_type += "(%d)" % new_modifier
				self.db.table_column_set_type(self.table, new_name, new_data_type, self.schema)
			if new_is_null == col.notnull:
				self.db.table_column_set_null(self.table, new_name, new_is_null, self.schema)
			if len(new_default) > 0 and new_default != col.default:
				self.db.table_column_set_default(self.table, new_name, new_default, self.schema)
			if len(new_default) == 0 and col.hasdefault:
				self.db.table_column_set_default(self.table, new_name, None, self.schema)
			
			self.populateFields()
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
예제 #9
0
	def createIndex(self):

		column = unicode(self.cboColumn.currentText())
		name = unicode(self.editName.text())
		if not name:
			QMessageBox.critical(self, "error", "Please enter some name for the index")
			return
		
		# now create the index
		try:
			self.db.create_index(self.table, name, column, self.schema)
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
			return
	def createSpatialIndex(self):
		""" asks for every geometry column whether it should create an index for it """
		
		# TODO: first check whether the index doesn't exist already
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			for fld in self.fields:
				if fld.data_type == 'geometry':
					res = QMessageBox.question(self, "create?", "create spatial index for field "+fld.name+"?", QMessageBox.Yes | QMessageBox.No)
					if res == QMessageBox.Yes:
						self.db.create_spatial_index(self.table, self.schema, fld.name)
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
			return
예제 #11
0
	def do_dbf_import(self):
		""" last step: create table and import data """
		
		QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))

		tablename = unicode(self.field("tablename").toString())
		pkey = unicode(self.field("pkey").toString())
		if pkey == "(none)": pkey = None
		
		try:
			# create the table
			self.db.create_table(tablename, self.dbf_fields, pkey)
			
			cursor = self.db.con.cursor()
				
			# now let's get the features and import them to database
			pr = self.vlayer.dataProvider()
			flds = pr.fields()
			pr.enableGeometrylessFeatures(True)
			pr.select(pr.attributeIndexes(), QgsRectangle(), False) # all attrs, no geometry
			f = QgsFeature()
			while pr.nextFeature(f):
				attrs = f.attributeMap()
				values = []
				for (i,val) in attrs.iteritems():
					vartype = flds[i].type()
					if val.isNull():
						values.append("NULL")
					elif vartype == QVariant.Int:
						values.append(str(val.toInt()[0]))
					elif vartype == QVariant.Double:
						values.append(str(val.toDouble()[0]))
					else: # string or something else
						values.append("'%s'" % str(val.toString().toUtf8()).replace("'","''").replace("\\", "\\\\"))
				self.db.insert_table_row(tablename, values, None, cursor)
				
			# commit changes to DB
			self.db.con.commit()

		except postgis_utils.DbError, e:
			QApplication.restoreOverrideCursor()
			
			DlgDbError.showError(e, self)
			return False
	def setData(self, index, value, role):
		if role != Qt.EditRole or index.column() != 0:
			return False
			
		item = index.internalPointer()
		new_name = unicode(value.toString())
		if new_name == item.name:
			return False
		
		if isinstance(item, TableItem):
			# rename table or view
			try:
				schema = item.parentItem.name
				self.db.rename_table(item.name, new_name, schema)
				self.emit(SIGNAL('dataChanged(const QModelIndex &, const QModelIndex &)'), index, index)
				return True
			except postgis_utils.DbError, e:
				DlgDbError.showError(e, None)
				return False
	def addConstraint(self):
		""" add primary key or unique constraint """
		
		dlg = DlgCreateConstraint(self, self.db, self.table, self.schema)
		if not dlg.exec_():
			return
		
		column = unicode(dlg.cboColumn.currentText())
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			if dlg.radPrimaryKey.isChecked():
				self.db.table_add_primary_key(self.table, column, self.schema)
			else:
				self.db.table_add_unique_constraint(self.table, column, self.schema)
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
			return
	def deleteIndex(self):
		""" delete currently selected index """
		
		num = self.currentIndex()
		if num == -1:
			return

		m = self.viewIndexes.model()
		idx_name = m.item(num, 0).text()

		res = QMessageBox.question(self, "are you sure", "really delete index '%s' ?" % idx_name, QMessageBox.Yes | QMessageBox.No)
		if res != QMessageBox.Yes:
			return
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			self.db.delete_index(idx_name, self.schema)
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
			return
	def deleteConstraint(self):
		""" delete a constraint """
		
		num = self.currentConstraint()
		if num == -1:
			return

		m = self.viewConstraints.model()
		con_name = m.item(num, 0).text()

		res = QMessageBox.question(self, "are you sure", "really delete constraint '%s' ?" % con_name, QMessageBox.Yes | QMessageBox.No)
		if res != QMessageBox.Yes:
			return
		
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			self.db.table_delete_constraint(self.table, con_name, self.schema)
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)
			return
	def addGeometryColumn(self):
		""" open dialog to add geometry column """
		
		dlg = DlgAddGeometryColumn(self)
		if not dlg.exec_():
			return
		
		name = unicode(dlg.editName.text())
		geom_type = str(dlg.cboType.currentText())
		dim = dlg.spinDim.value()
		try:
			srid = int(dlg.editSrid.text())
		except ValueError:
			srid = -1
			
		self.emit(SIGNAL("aboutToChangeTable()"))
		
		try:
			self.db.add_geometry_column(self.table, geom_type, self.schema, name, srid, dim)
			self.populateFields()
		except postgis_utils.DbError, e:
			DlgDbError.showError(e, self)