diff --git a/AppExamples/misc/SQLExample/doc/Documentation.md b/AppExamples/misc/SQLExample/doc/Documentation.md
new file mode 100644
index 0000000..5f96d8d
--- /dev/null
+++ b/AppExamples/misc/SQLExample/doc/Documentation.md
@@ -0,0 +1,272 @@
+# SQLExample
+
+![SQL Example Figure](sql_example.png)
+
+## Short description
+
+This example demonstrates how to access an SQL database from an App. For demonstration purposes, project keywords are written to or read from a database, respectively.
+
+The database access is implemented using [mysql-connector-python](https://pypi.org/project/mysql-connector-python/). A test database server is set up using [MySQL Community Server](https://dev.mysql.com/downloads/mysql/).
+
+Besides, gom.api.settings is used to save and restore entries made in a dialog.
+
+## Highlights
+
+![SQL Example Dialog](sql_example_dialog_annotated.png)
+
+### 1. Accessing project keywords
+
+A project must be loaded to access project keywords. This is checked with the following code:
+
+```{code-block} python
+if not hasattr(gom.app, 'project'):
+ gom.script.sys.execute_user_defined_dialog (file='no_project.gdlg')
+ quit(0)
+```
+
+This App handles the project variables `user_project`, `user_company`, `user_department` and `user_part`.
+For each of these variables, two text widgets are used - one for the value in ZEISS INSPECT (e.g. `project_zi`) and one for the value in the database (e.g. `project_db`).
+
+If available, the project keywords are written to the text widgets in the column 'INSPECT' (`*_zi`):
+
+```{code-block} python
+if 'user_project' in gom.app.project.project_keywords:
+ DIALOG.project_zi.value = getattr(gom.app.project, 'user_project')
+```
+
+The text widget entries in the column 'INSPECT' can be edited or loaded from the database (the database entry is selected by 'Project').
+
+Finally the project keywords are updated from the text widgets, if the dialog is closed with the 'Ok' button:
+
+```{code-block} python
+try:
+ RESULT = gom.script.sys.show_user_defined_dialog (dialog=DIALOG)
+except gom.BreakError as e:
+ # Dialog window was closed or 'Cancel' button was pressed
+ pass
+else:
+ # 'Ok' button was pressed
+ gom.script.sys.set_project_keywords (keywords = {
+ 'project': RESULT.project_zi,
+ 'company': RESULT.company_zi,
+ 'department': RESULT.department_zi,
+ 'part': RESULT.part_zi
+ })
+```
+
+### 2. Installing a test database server
+
+Install the [MySQL Community Server](https://dev.mysql.com/downloads/mysql/) as shown in [Install MySQL Community Server on Windows](https://www.youtube.com/watch?v=2HQC94la6go).
+
+### 3. Accessing the database
+
+After the database server has been installed and started, you can try to connect to it, but the 'Connection Status' will show 'Unknown database "\"', because no database has been created yet.
+
+#### Creating a database
+
+A new database is created using the function `create_database()`, which calls [MySQLConnection.connect()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-connect.html).
+
+1. A connection is established without specifying a database
+
+```{code-block} python
+def create_database(host_name, user_name, user_password, database):
+ try:
+ connection = mysql.connector.connect(
+ host=host_name,
+ user=user_name,
+ passwd=user_password
+ )
+ except Error as err:
+ print(f"Error: '{err}'")
+ return err
+```
+
+2. The database is created
+
+The SQL command `CREATE DATABASE {database} DEFAULT CHARACTER SET 'utf8'` is passed as a parameter to the [MySQLCursor.execute()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html) method.
+
+```{code-block} python
+cursor = connection.cursor()
+try:
+ cursor.execute("CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(database))
+except mysql.connector.Error as err:
+ print(f"Failed creating database: {err}")
+ #return err
+else:
+ print(f"Created database {database}")
+```
+
+3. The database is selected
+
+Again, the method [MySQLCursor.execute()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html) is called — this time with the SQL command `USE {database}`.
+
+```{code-block} python
+try:
+ cursor.execute("USE {}".format(database))
+except mysql.connector.Error as err:
+ print(f"Database {database} does not exists.")
+ print(err)
+else:
+ print(f"Using database {database}")
+```
+
+4. A database table is created
+
+Table: `projects`
+
+| project_no | project_name (unique) | company_name | department_name | part_name |
+| ------------------------------- | --------------------------- | -------------------- | --------------- | -------------------- |
+| int(11) NOT NULL AUTO_INCREMENT | varchar(80) NOT NULL UNIQUE | varchar(80) NOT NULL | varchar(80) | varchar(80) NOT NULL |
+
+```{code-block} python
+# Database - projects table
+TABLES = {}
+TABLES['projects'] = (
+ "CREATE TABLE `projects` ("
+ " `project_no` int(11) NOT NULL AUTO_INCREMENT,"
+ " `project_name` varchar(80) NOT NULL UNIQUE,"
+ " `company_name` varchar(80) NOT NULL,"
+ " `department_name` varchar(80),"
+ " `part_name` varchar(80) NOT NULL,"
+ " PRIMARY KEY (`project_no`)"
+ ") ENGINE=InnoDB")
+```
+
+The table data structure is passed as the SQL command to the method [MySQLCursor.execute()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html).
+
+```{code-block} python
+for table_name in TABLES:
+ table_description = TABLES[table_name]
+ try:
+ print("Creating table {}: ".format(table_name), end='')
+ cursor.execute(table_description)
+ except mysql.connector.Error as err:
+ if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
+ print("already exists.")
+ else:
+ print(err.msg)
+ return err
+ else:
+ print("OK")
+```
+
+5. Final steps
+
+The methods [MySQLCursor.close()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-close.html) and [MySQLConnection.close()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-close.html) are called.
+
+```{code-block} python
+cursor.close()
+connection.close()
+return None
+```
+
+#### Connecting the database
+
+The function `create_server_connection()` creates a connection to the server and selects the database by calling [MySQLConnection.connect()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-connect.html).
+
+```{code-block} python
+def create_server_connection(host_name, user_name, user_password, database):
+ connection = None
+ error = None
+ try:
+ connection = mysql.connector.connect(
+ host=host_name,
+ user=user_name,
+ passwd=user_password,
+ database=database
+ )
+ print("MySQL Database connection successful")
+ except Error as err:
+ print(f"Error: '{err}'")
+ error = err
+
+ return connection, error
+```
+
+#### Querying the database
+
+In this example, whe only use the project name for selecting database entries. The project names must be unique, so we use [MySQLCursor.fetchone()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchone.html) to get a single row from the `projects` table as result.
+
+```{code-block} python
+query = """SELECT company_name, department_name, part_name FROM projects
+ WHERE project_name=%s"""
+values = (DIALOG.project_zi.value, )
+result, err = execute_query(CONNECTION, query, values)
+```
+
+With:
+
+```{code-block} python
+def execute_query(connection, query, values):
+ cursor = connection.cursor(buffered=True, dictionary=True)
+ err = None
+ try:
+ cursor.execute(query, values)
+ result = cursor.fetchone()
+ print("Query successful")
+ except Error as err:
+ print(f"Error: '{err}'")
+ return None, err
+
+ cursor.close()
+ return result, err
+```
+
+As specified in `connection.cursor()` above, the result is a dictionary, e.g. `{'company_name': 'Carl Zeiss GOM Metrology GmbH', 'department_name': 'A2', 'part_name': 'ZEISS Training Object'}`.
+
+#### Inserting / Updating
+
+Both inserting a new and updating an existing table row are based on [MySQLCursor.execute()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html) and [MySQLConnection.commit()](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html) —
+
+Inserting:
+
+```{code-block} python
+# New project, insert
+query = """INSERT INTO projects
+ (project_name, company_name, department_name, part_name)
+ VALUES (%s, %s, %s, %s)"""
+values = (DIALOG.project_zi.value, DIALOG.company_zi.value, DIALOG.department_zi.value, DIALOG.part_zi.value)
+result, err = execute_commit(CONNECTION, query, values)
+```
+
+Updating:
+
+```{code-block} python
+# Project already exists, update
+query = """UPDATE projects SET company_name=%s, department_name=%s, part_name=%s
+ WHERE project_name=%s;"""
+values = (DIALOG.company_zi.value, DIALOG.department_zi.value, DIALOG.part_zi.value, DIALOG.project_zi.value)
+result, err = execute_commit(CONNECTION, query, values)
+```
+
+Both transactions use the function `execute_commit()`:
+
+```{code-block} python
+def execute_commit(connection, query, values):
+ cursor = connection.cursor(buffered=True)
+ err = None
+ try:
+ cursor.execute(query, values)
+ connection.commit()
+ print("Query successful")
+ except Error as err:
+ print(f"Error: '{err}'")
+ return None, err
+
+ cursor.close()
+ return cursor, err
+```
+
+#### Deleting
+
+Deleting a table row implemented using `execute_query()`.
+
+```{code-block} python
+query = """DELETE FROM projects WHERE project_name=%s"""
+values = (DIALOG.project_zi.value, )
+result, err = execute_query(CONNECTION, query, values)
+```
+
+## Related
+
+* How-to: [User-defined Dialogs](https://zeissiqs.github.io/zeiss-inspect-addon-api/2025/howtos/python_api_introduction/user_defined_dialogs.md)
diff --git a/AppExamples/misc/SQLExample/doc/README.md b/AppExamples/misc/SQLExample/doc/README.md
new file mode 100644
index 0000000..78028d9
--- /dev/null
+++ b/AppExamples/misc/SQLExample/doc/README.md
@@ -0,0 +1,9 @@
+## SQLExample
+
+This App is part of the [ZEISS INSPECT Python API App Examples](https://github.com/ZEISS/zeiss-inspect-app-examples/tree/main/AppExamples).
+
+See [App documentation](Documentation.md) for details.
+
+You can [download this App](https://software-store.zeiss.com/products/apps/SQLExample) from the [ZEISS Quality Software Store](https://software-store.zeiss.com).
+
+The ZEISS INSPECT App develomment documentation can be found on [ZEISS IQS GitHub](https://zeissiqs.github.io/zeiss-inspect-addon-api/2025/index.html).
\ No newline at end of file
diff --git a/AppExamples/misc/SQLExample/doc/sql_example.png b/AppExamples/misc/SQLExample/doc/sql_example.png
new file mode 100644
index 0000000..a68b409
Binary files /dev/null and b/AppExamples/misc/SQLExample/doc/sql_example.png differ
diff --git a/AppExamples/misc/SQLExample/doc/sql_example_dialog_annotated.png b/AppExamples/misc/SQLExample/doc/sql_example_dialog_annotated.png
new file mode 100644
index 0000000..5d60ec7
Binary files /dev/null and b/AppExamples/misc/SQLExample/doc/sql_example_dialog_annotated.png differ
diff --git a/AppExamples/misc/SQLExample/icon.png b/AppExamples/misc/SQLExample/icon.png
new file mode 100644
index 0000000..42dbd76
Binary files /dev/null and b/AppExamples/misc/SQLExample/icon.png differ
diff --git a/AppExamples/misc/SQLExample/license/license.txt b/AppExamples/misc/SQLExample/license/license.txt
new file mode 100644
index 0000000..bb42913
--- /dev/null
+++ b/AppExamples/misc/SQLExample/license/license.txt
@@ -0,0 +1,296 @@
+ZEISS Add-Ons / Apps End User License Agreement (EULA)
+======================================================
+
+English version. See below for German version.
+Englische Version. Siehe unten für die Deutsche Version.
+
+1. Introduction
+
+1.1 General information
+
+This End User License Agreement for Add-Ons / Apps ("EULA Add-Ons / Apps") is a legal agreement between "you" (either an individual or a legal entity, hereinafter referred to as "licensee" or "customer") and ZEISS ("ZEISS" or "licensor") (each individually a "party" and collectively the "parties") for your use of ZEISS software products. The agreement sets forth all rights and obligations for both licensee and ZEISS and governs your use of all Software Products installed or provided by ZEISS. Any amendment to this agreement must be in writing and in accordance with the terms and conditions contained herein. By paying the applicable license fee(s) and by downloading, installing or using the software, you agree that this agreement shall be enforceable against you in the same manner as a written, negotiated contract signed by you. If you do not agree to the terms of this agreement, you are not authorized and may not download, install or use any ZEISS software products.
+
+In order to use the ZEISS software products and services, the licensee must have the following:
+
+(a) a so-called valid subscription agreement or
+
+(b) a valid license from ZEISS.
+
+Furthermore, individual software products
+
+(a) which are based on a subscription agreement and / or
+
+(b) with a server-based licensing solution
+
+require and use a secure connection of the application computer to the ZEISS infrastructure and/or the "Cloud Services".
+
+1.2 The licensor is ZEISS, the licensee is the end customer. The licensor grants the licensee a non-exclusive, non-transferable right to use the "software product", which includes the specific software program and the subsequent extensions, updates, patches and associated documentation for internal company operation, as well as the associated manuals and software documentation.
+
+1.3 The software product may contain codes, objects and other intellectual property developed and licensed by licensors or third parties and integrated into the software product ("embedded third party software"). Any embedded third party software or open source code and open source licenses used shall not limit or impair the rights of use granted to licensee and may be accessed at any time within the respective software used. In individual cases, the respective license conditions can be made available by the licensor upon request at any time.
+
+1.4 Any terms and conditions of purchase of the licensee that conflict with or deviate from this agreement shall not become part of the agreement, even if the licensor does not expressly object to them. Amendments to the EULA must be expressly agreed in writing by both parties.
+
+
+2. Term and termination / license fees
+
+2.1 The license agreement begins with license activation and ends with the period of use of the Pro Version or with the end of the payment period.
+
+2.2 The Licensor shall be entitled to terminate this license agreement and the corresponding rights of use with immediate effect if the licensee violates any provision of this license agreement or tacitly tolerates a violation of this license agreement by third parties or fails to fulfill its obligations under this license agreement or if the licensee files for insolvency or a change of control occurs at the licensee.
+
+2.3 Notwithstanding the foregoing, and unless otherwise agreed in this license agreement, this license agreement shall terminate automatically upon licensee's breach of any of its provisions.
+
+2.4 Under no circumstances shall license fees be fully or partially refundable upon termination or mutually agreed termination of this agreement, unless ZEISS is responsible for the early termination of this agreement.
+
+
+3. Reproduction rights
+
+3.1 The licensee may reproduce the delivered software to the extent that the reproduction is necessary to use the software. Necessary reproductions of the software include, but are not limited to, the installation of the software product on the mass storage of the device in accordance with this license agreement and the loading of the software into the main memory of the computer.
+
+3.2 In addition, licensee shall be entitled to make copies for data backup purposes. This backup copy of the licensed software product must be marked as such.
+
+3.3 If, for reasons of data security or backup, a quick reactivation of the computer system, including the subject matter of the agreement, and the backup of the entire data stock, including the installed software product, are required after a total failure, licensee may create the maximum required number of backup copies. The data media concerned shall be appropriately marked. The backup copies may only be used for archiving purposes.
+
+3.4 The licensee is not entitled to make further copies or to instruct third parties to make further copies, in particular the licensee is not entitled to print out the program code with a printer or to make photocopies of the manual.
+
+
+4. Resale and transfer
+
+4.1 The licensee is not entitled to rent, lease, lend or make the software product available to third parties within the scope of hosting or download options, unless the Licensor has expressly indicated or permitted this in writing.
+
+4.2 However, it is permitted to grant a right of use to third parties if they have to use the software product to the licensee’s specifications (like own employees). Independent third parties are excluded from use in any case.
+
+4.3 Transfer within legal entities or global groups of licensee: Provided that the transferring licensee and the receiving party are part of one legal entity or part of affiliated companies, the transfer is permitted provided that the receiving party agrees to these license terms. "Affiliate" means any legal entity that is directly or indirectly controlled by a Legal Entity or its parent company. "Control" for purposes of this license agreement means direct or indirect ownership of more than fifty percent (50%) of the stock of such entity or more than fifty percent (50%) direct or indirect participation in the decision-making body of such entity.
+
+
+5. Back translation and program changes
+
+5.1 As a matter of principle, the licensee may not make any changes to the software product unless this is necessary to correct errors. The prerequisite is that this is done solely for the purpose of correcting errors that impair the functioning of the software.
+In the latter case and if important program functions and working methods could be disclosed during the repair process, licensee may commission a commercially active third party to carry out the repair if this third party is not a potential competitor of licensor.
+Insofar as the licensee makes changes to the software product in order to rectify errors, the licensor shall not assume any liability for the resulting consequences, in particular not through this authorization.
+
+5.2 The reverse translation of the licensed program code into other code forms (decompilation) and other types of reverse engineering of various different phases of software creation are permitted only to the extent that they serve to correct errors that impair the functioning of the software (in accordance with section 5.1). However, licensee may perform such decompilation only to the extent necessary for correction and, if applicable, in compliance with the terms and conditions contractually agreed with the owner of the copyright in this program.
+Further, decompilation is permitted in cases to obtain information necessary for interoperability with an independently created computer program and only if such information cannot be obtained otherwise.
+
+5.3 A further prerequisite for the permission to reverse engineer is the performance of reverse engineering or program observation exclusively by means of procedures which the licensee is authorized to perform in accordance with this license agreement. In particular, the program code may in no case be printed out.
+
+5.4 All property rights and copyrights relating to the software product, the printed accompanying materials and all copies of the software product shall remain with the licensor or its suppliers. This software product is protected under German copyright law, U.S. copyright law and the provisions of international treaties. The licensee is not entitled to reproduce the printed materials accompanying the software.
+
+
+5.5 The licensee shall not be entitled to remove, modify or add to any copyright notices or trademark notices placed by licensor. This includes, without limitation, all references in physical and/or electronic media or documents, in "setup wizards" or in "about..." dialog boxes, and/or in other references displayed on or activated via the Internet, in program code or other embodiments originally included in the software or otherwise created by licensor.
+
+6. Warranty and right of termination
+
+6.1 The licensor warrants with respect to the software product licensed to the licensee the performance set forth in the description, provided that the software product is installed in the intended system in compliance with the licensor's guidelines.
+
+6.2 The licensor shall correct errors in the software product, and in all manuals and other documents, within a reasonable period of time after receiving from the licensee the corresponding information on the error necessary to correct the error. Errors shall be remedied by rectification, which shall not be invoiced, or by replacement of the delivery, at the option of the licensor.
+
+6.3 The licensee's right of termination due to the non-executability of the software product may only be exercised after rectifications or replacements have been made twice without success.
+
+6.4 The licensor neither warrants nor guarantees the functionality of the programs created by third parties or the licensee / customer, nor the error-free execution of the programs with the software or on the licensor's systems.
+
+
+7. Liability
+
+7.1 If the licensee is unable to use the software product in the manner specified in the agreement and the licensee is responsible for this due to the failure to implement or the incorrect implementation of suggestions and advice before or after signing the agreement or due to the breach of other contractual obligations, the provisions set forth in this agreement shall apply mutatis mutandis to the exclusion of any further claims by the licensee.
+
+For damages that do not occur to the software product, respectively not to the hardware and the connected device, the liability obligation of the licensor applies exclusively in the following cases, regardless of the respective legal ground:
+
+- willful misconduct,
+
+- gross negligence of its executive bodies or officers,
+
+- culpable damage to life, limb and health, in the event of errors, which the lLicensor has fraudulently concealed or which it has excluded under warranty,
+
+- software errors within the scope of liability for personal injury and property damage due to personally implemented objects, as set out in the product liability regulations applicable to them
+
+7.2 In the event of culpable breach of material contractual obligations, the licensor shall also be liable for gross negligence on the part of non-executive employees and for slight negligence. In the latter case, liability shall be limited to damages that are foreseeable and typical for this type of contract.
+
+7.3 In addition, the licensor, its employees and its vicarious agents shall be liable for data loss or changes due to program errors, limited to the extent that this would have been unavoidable if the licensee had complied with its obligation to make back-up copies regularly and at least once a day.
+
+7.4 In the event of claims based on copyright infringement, the licensor shall grant the licensee the right to continue using the software product or to make modifications to the software product so that copyright protection is ensured. If this is not commercially reasonable, the licensor shall take back the subject matter of the agreement and refund the license fee paid, less an amount corresponding to the duration of the previous use. This shall apply provided that the licensee notifies the licensor of this type of claim in writing without delay and allows licensor all legal remedies and out-of-court settlements.
+
+7.5 The licensee or its IT provider shall be liable for server interruptions, interruption of license allocation and other support cases that are not clearly attributable to an incorrectly created license.
+
+The licensee or its IT provider is responsible for maintaining the necessary number of licenses to provide its services. The licensor is not liable for interruptions in use and subsequent work / production stoppages.
+
+
+7.6 Further liability claims of the licensee are expressly excluded.
+7.7 The licensee is responsible for all problems arising from the use of the software product that are not directly caused by the licensor. Therefore, licensee is responsible for all data generated and produced during the use of the software product. Accordingly, licensee is obligated and responsible for compliance with the terms and conditions set forth in this license agreement.
+
+
+8. Security measures
+
+The licensee shall take suitable measures to secure the software and, if applicable, the access data for online access against access by unauthorized third parties. In particular, all copies of the software as well as the access data shall be kept in a protected place.
+
+
+9. Industrial property rights and copyrights
+
+9.1 If a third party asserts claims for infringement of an industrial property right or a copyright against the customer because the customer uses a software version, firmware supplement or associated documentation supplied by ZEISS, ZEISS shall be obligated to pay any cost and damage compensation amounts awarded to the owner of the property right by a court or awarded with the prior consent of ZEISS. This is subject to the condition that the customer informs ZEISS immediately in writing of such claims and that ZEISS reserves the right to all defensive measures and out-of-court settlements. The customer is obligated to support ZEISS in the defense to the best of its ability. Under these conditions, ZEISS shall generally procure for the customer the right to continue using the software version, firmware supplement or documentation. If this should not be possible under economically reasonable conditions, ZEISS shall be obligated, at its own discretion and at its own expense, either to modify or replace the relevant item in such a way that the property right is not infringed, or to take back the item and refund the remuneration paid for it less an amount taking into account the benefits derived.
+
+9.2 ZEISS shall have no obligations if property right infringements are caused by the fact that software versions , firmware supplements or documentation supplied by ZEISS are not used in the intended manner or are not used on the specific systems.
+
+
+10. Export Control
+
+Licensee assumes responsibility for compliance with all applicable rules and regulations, including but not limited to the export control and sanctions regulations of the Federal Republic of Germany, the European Union and the United States of America. In particular, licensee agrees not to provide the software or any related technology or documentation or any part thereof, directly or indirectly, to any sanctioned country or to any sanctioned person or entity in violation of the foregoing.
+
+Licensee represents and guarantees that it will not use the software or any related technology or documentation or any portion thereof in violation of any applicable law or regulation. The licensee further agrees to indemnify and hold harmless licensor from and against any and all claims resulting from licensee's failure to comply with any of the foregoing applicable provisions.
+
+
+11. Miscellaneous
+
+11.1 All verbal agreements, amendments, extensions or concretizations of these license conditions as well as the special characteristics of the assurances or agreements or arrangements made must be in writing to be legally effective. If these are drafted by representatives or vicarious agents of the Licensor, they shall only become legally binding upon approval by the Licensor.
+
+11.2 Should parts of this contract become invalid, this shall not affect the validity of the remaining parts of this contract. The ineffective part of this contract shall be replaced by its parties with legally permissible provisions that come as close as possible to the intention of the ineffective provisions.
+
+11.3 The laws of the Federal Republic of Germany shall apply to this contract, excluding the law on the international sale of goods and the rules of conflict of laws.
+
+Version from October 2023
+
+-----------------------------------------------------------------------------
+
+ZEISS Add-Ons / Apps End User License Agreement (EULA)
+======================================================
+
+German version. See above for English version.
+Deutsche Version. Siehe oben für die Englische Version.
+
+1. Einführung
+
+1.1 Allgemeine Informationen
+
+Diese Endbenutzer-Lizenzvereinbarung für Add-Ons / Apps (End User License Agreement, „EULA Add-Ons / Apps“) ist eine rechtsgültige Vereinbarung zwischen „Ihnen“ (entweder eine natürliche oder juristische Person, im Folgenden als „Lizenznehmer“ oder „Kunde“ bezeichnet) und ZEISS („ZEISS“ oder „Lizenzgeber“) (jeweils einzeln eine „Partei“ und zusammen die „Parteien“) für Ihre Nutzung von ZEISS Softwareprodukten. Die Vereinbarung legt alle Rechte und Pflichten sowohl für den Lizenznehmer als auch für ZEISS fest und regelt Ihre Nutzung aller Softwareprodukte, die von ZEISS installiert oder zur Verfügung gestellt werden. Jede Änderung dieser Vereinbarung muss schriftlich erfolgen und mit den hierin enthaltenen Bestimmungen und Bedingungen übereinstimmen. Durch die Zahlung der geltenden Lizenzgebühr(en) und durch das Herunterladen, die Installation oder die Nutzung der Software erklären Sie sich damit einverstanden, dass diese Vereinbarung Ihnen gegenüber gleichermaßen durchsetzbar ist wie ein schriftlicher, ausgehandelter und von Ihnen unterzeichneter Vertrag. Wenn Sie den Bedingungen dieser Vereinbarung nicht zustimmen, sind Sie nicht berechtigt und dürfen keine ZEISS Softwareprodukte herunterladen, installieren oder verwenden.
+
+Für die Nutzung der ZEISS Softwareprodukte und Leistungen muss der Lizenznehmer über Folgendes verfügen:
+
+(a) einen sog. gültigen Subscriptionvertrag oder
+
+(b) eine gültige Lizenz von ZEISS.
+
+Ferner erfordern und verwenden einzelne Softwareprodukte
+
+(a) die auf einem Subscriptionvertrag basieren und / oder
+
+(b) mit einer serverbasierten Lizenzlösung
+
+eine sichere Verbindung des Applikationsrechners mit der ZEISS Infrastruktur und / oder den „Cloud Services“.
+
+1.2 Lizenzgeber ist ZEISS Lizenznehmer ist der Endkunde. Der Lizenzgeber gewährt dem Lizenznehmer ein nicht ausschließliches, nicht übertragbares Nutzungsrecht für das „Softwareprodukt“, welches das spezielle Softwareprogramm und die damit nachfolgenden Erweiterungen, Updates, Patches und zugehörige Dokumentation für den unternehmensinternen Betrieb, wie auch die dazugehörigen Handbücher und Softwaredokumentation, einschließt.
+
+1.3 Das Softwareprodukt kann Codes, Objekte und anderes geistiges Eigentum enthalten, das von Lizenzgebern oder Dritter entwickelt und von diesen lizenziert und in das Softwareprodukt integriert wurde („Embedded Third Party Software“). Etwaig verwendete Embedded Third Party Software oder Open Source-Code und Open Source-Lizenzen beschränken oder beeinträchtigen die gewährten Nutzungsrechte des Lizenznehmers nicht und können jederzeit innerhalb der jeweils genutzten Software abgerufen werden. Im Einzelfall können die jeweiligen Lizenzbedingungen vom Lizenzgeber auf Anforderung jederzeit zur Verfügung gestellt werden.
+
+1.4 Entgegenstehende oder von dieser Vereinbarung abweichende Kaufbedingungen des Lizenznehmers werden nicht Vereinbarungsbestandteil, auch wenn der Lizenzgeber diesen nicht ausdrücklich widerspricht. Änderungen der EULA müssen schriftlich und ausdrücklich durch beide Parteien vereinbart werden.
+
+
+2. Laufzeit und Kündigung / Lizenzgebühren
+
+2.1 Die Lizenzvereinbarung beginnt mit Lizenzaktivierung und endet mit der Nutzungsdauer der Pro Version oder mit dem Ende der Bezahldauer.
+
+2.2 Der Lizenzgeber ist berechtigt, diese Lizenzvereinbarung und die entsprechenden Nutzungsrechte mit sofortiger Wirkung zu kündigen, falls der Lizenznehmer eine Bestimmung dieser Lizenzvereinbarung verletzt oder eine Verletzung dieser Lizenzvereinbarung durch Dritte stillschweigend duldet oder seine Verpflichtungen aus dieser Lizenzvereinbarung nicht erfüllt oder falls der Lizenznehmer Insolvenz anmeldet oder bei dem Lizenznehmer ein Kontrollwechsel stattfindet.
+
+2.3 Ungeachtet der vorstehenden Bestimmungen und sofern in dieser Lizenzvereinbarung nicht anderweitig vereinbart, endet diese Lizenzvereinbarung automatisch bei Verletzung einer seiner Bestimmungen durch den Lizenznehmer.
+
+2.4 Unter keinen Umständen sind bei Kündigung oder einvernehmlicher Beendigung dieses Vertrages Lizenzgebühren vollständig oder teilweise erstattungsfähig, es sei denn ZEISS hat die vorzeitige Beendigung dieses Vertrages zu vertreten.
+
+
+3. Vervielfältigungsrechte
+
+3.1 Der Lizenznehmer darf die gelieferte Software in dem Umfang vervielfältigen, in dem die Vervielfältigung zur Nutzung der Software erforderlich ist. Erforderliche Vervielfältigungen der Software sind unter anderem die Installation des Softwareprodukts auf dem Massenspeicher des Geräts gemäß diesem Lizenzvertrag und das Laden der Software in den Hauptspeicher des Computers.
+
+3.2 Außerdem ist der Lizenznehmer zur Anfertigung von Kopien zur Datensicherung berechtigt. Diese Sicherungskopie des lizenzierten Softwareprodukts muss als solche gekennzeichnet sein.
+
+3.3 Sind aus Gründen der Datensicherheit oder -sicherung nach einem Totalausfall eine schnelle Reaktivierung des Computersystems, des Vertragsgegenstands eingeschlossen, sowie die Sicherung des gesamten Datenbestands, des installierten Softwareprodukts eingeschlossen, erforderlich, so kann der Lizenznehmer die maximal erforderliche Anzahl an Sicherungskopien erstellen. Die betreffenden Datenmedien sind angemessen zu kennzeichnen. Die Sicherungskopien dürfen ausschließlich zu Archivierungszwecken genutzt werden.
+
+3.4 Der Lizenznehmer ist nicht berechtigt, weitere Kopien zu erstellen oder Dritte anzuweisen, weitere Kopien zu erstellen, insbesondere ist er nicht berechtigt, den Programmcode mit einem Drucker auszudrucken oder Fotokopien des Handbuchs zu erstellen.
+
+
+4. Weiterverkauf und Übertragung
+
+4.1 Der Lizenznehmer ist nicht berechtigt, das Softwareprodukt Dritten im Rahmen von Hosting- oder Downloadoptionen zu vermieten, verleasen, verleihen oder zur Verfügung zu stellen, es sei denn, der Lizenzgeber hat dies ausdrücklich schriftlich angegeben oder erlaubt.
+
+4.2 Es ist jedoch gestattet, Dritten ein Nutzungsrecht einzuräumen, wenn diese das Softwareprodukt nach Maßgabe des Lizenznehmers (wie eigene Mitarbeiter) nutzen müssen. Von der Nutzung auf jeden Fall ausgeschlossen sind unabhängige Dritte.
+
+4.3 Übertragung innerhalb von Rechtspersonen oder globalen Konzernen des Lizenznehmers: Sofern der übertragende Lizenznehmer und die empfangende Partei Teil einer Rechtsperson oder Teil verbundener Unternehmen sind, ist die Übertragung gestattet, sofern die empfangende Partei diesen Lizenzbedingungen zustimmt. „Verbundene Unternehmen“ bedeutet jede Rechtsperson, die direkt oder indirekt von einer Rechtsperson oder deren Muttergesellschaft kontrolliert wird. „Kontrolle“ im Sinne dieses Lizenzvertrags bedeutet direkter oder indirekter Besitz von mehr als fünfzig Prozent (50 %) der Anteile an diesem Unternehmen oder mehr als fünfzig Prozent (50 %) direkter oder indirekter Beteiligung am Entscheidungsorgan dieses Unternehmens.
+
+
+5. Rückübersetzung und Programmänderungen
+
+5.1 Der Lizenznehmer darf grundsätzlich keine Änderungen am Softwareprodukt vornehmen, außer wenn dies zur Behebung von Fehlern erforderlich ist. Voraussetzung ist, dass dies ausschließlich zum Zweck der Korrektur von Fehlern geschieht, die das Funktionieren der Software beeinträchtigen.
+Im letzteren Fall und wenn beim Reparaturvorgang wichtige Programmfunktionen und Arbeitsmethoden offengelegt werden könnten, kann der Lizenznehmer einen gewerblich tätigen Dritten mit der Reparatur beauftragen, wenn dieser Dritte nicht ein potenzieller Wettbewerber des Lizenzgebers ist.
+Soweit der Lizenznehmer zur Behebung von Fehlern Änderungen am Softwareprodukt vornimmt, übernimmt der Lizenzgeber, insb. auch nicht durch diese Freigabe, für die daraus resultierende Folgen keine Haftung.
+
+5.2 Die Rückübersetzung des lizenzierten Programmcodes in andere Codeformen (Dekompilierung) und andere Arten des Reverse Engineering verschiedener unterschiedlicher Phasen der Software-Erstellung sind nur insoweit zulässig, wie sie dazu dienen, Fehler zu korrigieren, die das Funktionieren der Software beeinträchtigen (entsprechend Ziffer 5.1). Der Lizenznehmer darf eine solche Dekompilierung jedoch nur in dem für die Berichtigung erforderlichen Ausmaß und gegebenenfalls unter Einhaltung der mit dem Inhaber des Urheberrechts an diesem Programm vertraglich festgelegten Bedingungen vornehmen.
+Weiter ist eine Dekompilierung in Fällen zulässig, um Informationen zu gewinnen, die zur Interoperabilität mit einem unabhängig geschaffenen Computerprogramm erforderlich sind, und nur falls diese Informationen nicht anderweitig beschafft werden können.
+
+5.3 Weitere Voraussetzung für die Genehmigung zur Rückübersetzung ist die Durchführung des Reverse Engineering oder der Programmbeobachtung ausschließlich durch Verfahren, zu deren Ausführung der Lizenznehmer gemäß diesem Lizenzvertrag berechtigt ist. Insbesondere darf der Programmcode in keinem Fall ausgedruckt werden. 5.4 Alle Eigentums- und Urheberrechte in Bezug auf das Softwareprodukt, die gedruckten Begleitmaterialien und sämtliche Kopien des Softwareprodukts verbleiben beim Lizenzgeber oder seinen Lieferanten. Das vorliegende Softwareprodukt ist nach deutschem Urheberrecht, US-amerikanischem Urheberrecht und den Bestimmungen internationaler Verträge geschützt. Der Lizenznehmer ist nicht berechtigt, die der Software beiliegenden gedruckten Materialien zu vervielfältigen.
+
+5.5 Der Lizenznehmer ist nicht berechtigt, Hinweise zum Urheberrecht oder Markennennungen, die der Lizenzgeber angebracht hat, zu entfernen, zu ändern oder zu ergänzen. Dies beinhaltet ohne Einschränkungen alle Verweise in physischen und / oder elektronischen Medien oder Dokumenten, in „Setup-Assistenten" oder in den Dialogfeldern „Über...“ und / oder in anderen Verweisen, die im Internet dargestellt oder über das Internet aktiviert werden, im Programmcode oder anderen Ausführungsformen, die ursprünglich in der Software enthalten waren oder anderweitig vom Lizenzgeber erstellt wurden.
+
+
+6. Gewährleistung und Kündigungsrecht
+
+6.1 Der Lizenzgeber gewährleistet in Bezug auf das für den Lizenznehmer lizenzierte Softwareprodukt die in der Beschreibung festgelegte Leistung, insofern das Softwareprodukt in dem vorgesehenen System unter Einhaltung der Richtlinien des Lizenzgebers installiert wird.
+
+6.2 Der Lizenzgeber beseitigt Fehler an dem Softwareprodukt, und in allen Handbüchern sowie anderen Dokumenten, innerhalb einer angemessenen Frist nach Erhalt der zur Fehlerbeseitigung notwendigen entsprechender Angaben vom zum Fehler Lizenznehmer. Fehler werden durch Nachbesserungen, die nicht in Rechnung gestellt werden, oder durch Ersatz der Lieferung, nach Wahl des Lizenzgebers, behoben.
+
+6.3 Das Kündigungsrecht des Lizenznehmers aufgrund der Nichtausführbarkeit des Softwareprodukts kann erst ausgeübt werden, wenn Nachbesserungen bzw. Ersatz zweimal erfolglos erfolgt sind.
+
+6.4 Der Lizenzgeber gibt weder eine Garantie noch eine Gewährleistung für die Funktionalität der von Drittanbietern oder dem Lizenznehmer / Kunden erstellten Programme, ebenso wenig wie auf das fehlerfreie Ausführen der Programme mit der Software oder auf den Systemen des Lizenzgebers.
+
+
+7. Haftung
+
+7.1 Falls der Lizenznehmer das Softwareprodukt nicht auf die vertraglich festgelegte Weise nutzen kann und der Lizenznehmer dies aufgrund der unterlassenen oder falschen Umsetzung von Vorschlägen und Ratschlägen vor oder nach der Unterzeichnung des Vertrages oder aufgrund der Verletzung sonstiger vertraglicher Pflichten zu vertreten hat, so gelten unter Ausschluss weiterer Ansprüche des Lizenznehmers entsprechend die in diesem Vertrag dargelegten Regelungen.
+
+Für Schäden, die nicht am Softwareprodukt, beziehungsweise nicht an der Hardware und dem angeschlossenen Gerät entstehen, gilt die Haftungsverpflichtung des Lizenzgebers ausschließlich in den folgenden Fällen, unabhängig vom jeweiligen Rechtsgrund:
+
+- vorsätzliches Fehlverhalten,
+
+- grobe Fahrlässigkeit seiner ausführenden Organe oder leitenden Angestellten,
+
+- schuldhaft herbeigeführter Schaden des Lebens, des Körpers und der Gesundheit, bei Fehlern, die der Lizenzgeber arglistig verschwiegen, oder die er unter Gewährleistung ausgeschlossen hat,
+
+- Softwarefehler im Rahmen der Haftung bei Personen- und Sachschäden aufgrund persönlich implementierter Objekte, wie in den dafür zutreffenden Produkthaftungsregelungen dargelegt
+
+7.2 Bei schuldhafter Verletzung wesentlicher Vertragspflichten haftet der Lizenzgeber auch bei grober Fahrlässigkeit seitens nichtleitender Angestellter und bei leichter Fahrlässigkeit. Im letzteren Fall ist die Haftung auf Schäden begrenzt, die vorhersehbar und typisch für diese Art von Vertrag sind.
+
+7.3 Außerdem haften der Lizenzgeber, seine Mitarbeiter und seine Erfüllungsgehilfen für Datenverlust oder -änderungen aufgrund von Programmfehlern, beschränkt auf den Umfang, in dem dies unvermeidbar gewesen wäre, wenn der Lizenznehmer seiner Verpflichtung, regelmäßig und mindestens einmal täglich Sicherungskopien zu erstellen, nachgekommen wäre.
+
+7.4 Bei Ansprüchen aufgrund von Urheberrechtsverletzungen gewährt der Lizenzgeber dem Lizenznehmer das Recht zur weiteren Nutzung des Softwareprodukts oder zur Vornahme von Änderungen am Softwareprodukt, so dass der Schutz der Urheberrechte gewährleistet ist. Wenn dies nicht wirtschaftlich sinnvoll ist, so nimmt der Lizenzgeber den Vertragsgegenstand zurück und erstattet die gezahlte Lizenzgebühr, abzüglich eines der Dauer der vorherigen Nutzung entsprechenden Betrags. Dies gilt unter der Voraussetzung, dass der Lizenznehmer dem Lizenzgeber diese Art der Ansprüche unverzüglich schriftlich mitteilt und dem Lizenzgeber alle Rechtsmittel und außergerichtlichen Regelungen gestattet.
+
+7.5 Für Serverunterbrechungen, Unterbrechung der Lizenzzuteilung und sonstige Support-Fälle, die nicht eindeutig auf eine fehlerhaft erstellte Lizenz zurückzuführen sind, haftet der Lizenznehmer bzw. dessen IT-Provider..
+Der Lizenznehmer oder dessen IT-Provider ist verantwortlich für die Vorhaltung der notwendigen Anzahl an Lizenzen zur Erbringung seiner Leistungen. Der Lizenzgeber haftet nicht für Nutzungsunterbrechungen und nachfolgende Arbeits- / Produktionsausfälle.
+
+7.6 Weitergehende Haftungsansprüche des Lizenznehmers sind ausdrücklich ausgeschlossen.
+
+7.7 Der Lizenznehmer ist für alle aus der Nutzung des Softwareprodukts entstehenden Probleme verantwortlich, die nicht direkt durch den Lizenzgeber verursacht werden. Daher ist der Lizenznehmer für alle Daten verantwortlich, die bei der Nutzung des Softwareprodukts erzeugt und hergestellt werden. Der Lizenznehmer ist demnach zur beziehungsweise für die Einhaltung der in dieser Lizenzvereinbarung genannten Bedingungen verpflichtet und verantwortlich.
+
+
+8. Sicherungsmaßnahmen
+
+Der Lizenznehmer wird die Software sowie gegebenenfalls die Zugangsdaten für den Onlinezugriff durch geeignete Maßnahmen vor dem Zugriff durch unbefugte Dritte sichern. Insbesondere sind sämtliche Kopien der Software sowie die Zugangsdaten an einem geschützten Ort zu verwahren.
+
+
+9. Gewerbliche Schutzrechte und Urheberrechte
+
+9.1 Macht ein Dritter Ansprüche aus Verletzung eines gewerblichen Schutzrechtes oder eines Urheberrechts gegen den Kunden geltend, weil dieser eine von ZEISS gelieferte Softwareversion, Firmwareergänzung oder dazugehörige Dokumentation benutzt, ist ZEISS verpflichtet, etwaige dem Schutzrechtsinhaber gerichtlich zugesprochene oder mit vorheriger Zustimmung von ZEISS zugestandene Kosten- und Schadenersatzbeträge zu bezahlen. Vorausgesetzt ist dabei, dass der Kunde ZEISS unverzüglich schriftlich über derartige Ansprüche unterrichtet und ZEISS alle Abwehrmaßnahmen und außergerichtlichen Regelungen vorbehalten bleiben. Der Kunde ist verpflichtet, ZEISS bei der Abwehr nach besten Kräften zu unterstützen. Unter diesen Voraussetzungen wird ZEISS dem Kunden grundsätzlich das Recht zum weiteren Gebrauch der Softwareversion, Firmwareergänzung oder Dokumentation verschaffen. Falls dies zu wirtschaftlich angemessenen Bedingungen nicht möglich sein sollte, ist ZEISS verpflichtet, nach eigener Wahl und auf eigene Kosten den entsprechenden Gegenstand entweder derart abzuändern oder zu ersetzen, dass das Schutzrecht nicht verletzt wird, oder den Gegenstand zurückzunehmen und das dafür bezahlte Entgelt abzüglich eines die gezogenen Nutzungen berücksichtigenden Betrages zu erstatten.
+
+9.2 ZEISS hat keine Verpflichtungen, falls Schutzrechtsverletzungen dadurch hervorgerufen werden, dass von ZEISS gelieferte Softwareversionen, Firmwareergänzungen oder Dokumentation nicht in der vorgesehenen Weise verwendet oder nicht auf den bestimmten Systemen eingesetzt wird.
+
+
+10. Exportkontrolle
+
+Der Lizenznehmer übernimmt die Verantwortung für die Einhaltung aller anwendbaren Bestimmungen und Vorschriften, einschließlich, aber nicht beschränkt auf die Exportkontroll- und Sanktionsbestimmungen der Bundesrepublik Deutschland, der Europäischen Union sowie der Vereinigten Staaten von Amerika. Insbesondere bestätigt der Lizenznehmer, die Software sowie jedwede damit verbundene Technologie oder Dokumentation oder Teile davon weder direkt noch indirekt unter Nichtbefolgung der vorgenannten Bestimmungen in sanktionierte Länder oder an sanktionierte natürliche oder juristische Personen bereitzustellen.
+
+Der Lizenznehmer sichert dem Lizenzgeber zu, dass er die Software sowie jedwede damit verbundene Technologie oder Dokumentation oder Teile davon nicht unter Verletzung vorgenannter anwendbarer Gesetze oder Vorschriften verwenden wird. Weiterhin verpflichtet sich der Lizenznehmer den Lizenzgeber von allen Ansprüchen freizustellen und schadlos zu halten, welche aus der Nichteinhaltung vorgenannter anwendbarer Bestimmungen resultiert.
+
+
+11. Sonstiges
+
+11.1 Sämtliche mündliche Vereinbarungen, Änderungen, Erweiterungen oder Konkretisierungen dieser Lizenzbedingungen sowie die besonderen Eigenschaften der getroffenen Zusicherungen oder Vereinbarungen oder Absprachen bedürfen zu ihrer Rechtswirksamkeit der Schriftform. Falls diese von Vertretern oder Erfüllungsgehilfen des Lizenzgebers abgefasst sind, so werden sie erst mit der Genehmigung des Lizenzgebers rechtlich bindend.
+
+11.2 Sollten Teile dieses Vertrags unwirksam werden, so berührt dies nicht die Wirksamkeit der übrigen Teile dieses Vertrags. Der unwirksame Teil dieses Vertrags soll durch seine Parteien durch gesetzlich zulässige Bestimmungen ersetzt werden, die der Absicht der unwirksamen Bestimmungen am nächsten kommt.
+
+11.3 Auf diesen Vertrag sind die Gesetze der Bundesrepublik Deutschland anwendbar, unter Ausschluss des Gesetzes über den internationalen Warenkauf und der Regeln des Kollisionsrechts.
+
+Stand Oktober 2023
diff --git a/AppExamples/misc/SQLExample/metainfo.json b/AppExamples/misc/SQLExample/metainfo.json
new file mode 100644
index 0000000..6d16223
--- /dev/null
+++ b/AppExamples/misc/SQLExample/metainfo.json
@@ -0,0 +1,20 @@
+{
+ "author": "Cals Zeiss GOM Metrology GmbH",
+ "description": "Example for SQL Database Access",
+ "labels": [
+ ],
+ "licensing": {
+ "licenses": [
+ ],
+ "product-codes": [
+ ]
+ },
+ "software-revision": "0000",
+ "software-version": "ZEISS INSPECT 2025",
+ "tags": [
+ "sql-database", "project-keywords"
+ ],
+ "title": "SQLExample",
+ "uuid": "58c970e7-c01d-4e72-88a2-7e8db7cd1dec",
+ "version": "1.0.0"
+}
diff --git a/AppExamples/misc/SQLExample/scripts/SQL_Example.metainfo b/AppExamples/misc/SQLExample/scripts/SQL_Example.metainfo
new file mode 100644
index 0000000..c592503
--- /dev/null
+++ b/AppExamples/misc/SQLExample/scripts/SQL_Example.metainfo
@@ -0,0 +1,25 @@
+{
+ "display_name": "SQL_Example",
+ "folded_blocks": [
+ ],
+ "icon": "",
+ "iinspect_condition": "",
+ "interactive": false,
+ "main_menu_path": {
+ "anchor": {
+ "item": "",
+ "submenu": [
+ ],
+ "type": "command"
+ },
+ "script": "userscript.SQL_Example",
+ "submenu": [
+ ]
+ },
+ "multicreation_script": false,
+ "script_check_type": "none",
+ "script_element_type": "none",
+ "show_in_iinspect": false,
+ "show_in_menu": true,
+ "uuid": "e3a84dc8-7119-4260-b1a3-8c8f3e1dfa42"
+}
diff --git a/AppExamples/misc/SQLExample/scripts/SQL_Example.py b/AppExamples/misc/SQLExample/scripts/SQL_Example.py
new file mode 100644
index 0000000..c6c0f27
--- /dev/null
+++ b/AppExamples/misc/SQLExample/scripts/SQL_Example.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+
+import gom
+import mysql.connector
+from mysql.connector import Error
+import pandas as pd
+
+PW = 'SqlT3st!'
+HOST_NAME =
+USER_NAME
+PASSWORD
+DATABASE
+
+DIALOG=gom.script.sys.create_user_defined_dialog (file='dialog.gdlg')
+DIALOG=gom.script.sys.create_user_defined_dialog (file='dialog.gdlg')
+
+#
+# Event handler function called if anything happens inside of the dialog
+#
+def dialog_event_handler (widget):
+ pass
+
+DIALOG.handler = dialog_event_handler
+
+RESULT=gom.script.sys.show_user_defined_dialog (dialog=DIALOG)
+
+#
+# Event handler function called if anything happens inside of the dialog
+#
+def dialog_event_handler (widget):
+ pass
+
+DIALOG.handler = dialog_event_handler
+
+RESULT=gom.script.sys.show_user_defined_dialog (dialog=DIALOG)
+
+def create_server_connection(host_name, user_name, user_password):
+ connection = None
+ try:
+ connection = mysql.connector.connect(
+ host=host_name,
+ user=user_name,
+ passwd=user_password
+ )
+ print("MySQL Database connection successful")
+ except Error as err:
+ print(f"Error: '{err}'")
+
+ return connection
+
+def create_database(connection, query):
+ cursor = connection.cursor()
+ try:
+ cursor.execute(query)
+ print("Database created successfully")
+ except Error as err:
+ print(f"Error: '{err}'")
+
+def execute_query(connection, query):
+ cursor = connection.cursor()
+ try:
+ cursor.execute(query)
+ connection.commit()
+ print("Query successful")
+ except Error as err:
+ print(f"Error: '{err}'")
+
+connection = create_server_connection("localhost", "root", PW)
+
+
+create_database_query = "CREATE DATABASE school" # FIXME
+create_database(connection, create_database_query)
+
+
+
diff --git a/AppExamples/misc/SQLExample/scripts/dialog.gdlg b/AppExamples/misc/SQLExample/scripts/dialog.gdlg
new file mode 100644
index 0000000..0fe3645
--- /dev/null
+++ b/AppExamples/misc/SQLExample/scripts/dialog.gdlg
@@ -0,0 +1,621 @@
+{
+ "content": [
+ [
+ {
+ "columns": 4,
+ "name": "label",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "SQL Database Connection",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 4,
+ "name": "separator",
+ "rows": 1,
+ "title": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "separator"
+ },
+ {
+ },
+ {
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "name": "label_1",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "SQL Server (Host)",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ "columns": 2,
+ "name": "in_host",
+ "password": false,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "name": "label_2",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "User",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ "columns": 2,
+ "name": "in_user",
+ "password": false,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "name": "label_3",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Password",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ "columns": 2,
+ "name": "in_password",
+ "password": false,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "name": "label_4",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Database",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ "columns": 2,
+ "name": "in_database",
+ "password": true,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ }
+ ],
+ [
+ {
+ "button_type": "push",
+ "columns": 2,
+ "icon": "AAAAAA==",
+ "icon_file_name": "",
+ "icon_size": {
+ "value": "icon"
+ },
+ "icon_system_size": {
+ "value": "default"
+ },
+ "icon_system_type": {
+ "value": "ok"
+ },
+ "icon_type": {
+ "value": "none"
+ },
+ "name": "bt_connect",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Connect",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "button::pushbutton"
+ },
+ {
+ },
+ {
+ "columns": 2,
+ "name": "out_status",
+ "password": false,
+ "read_only": true,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 4,
+ "name": "label_5",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Project Keywords",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ },
+ {
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 4,
+ "name": "separator_1",
+ "rows": 1,
+ "title": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "separator"
+ },
+ {
+ },
+ {
+ },
+ {
+ }
+ ],
+ [
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ "columns": 1,
+ "name": "label_7",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "INSPECT",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_1",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ "columns": 1,
+ "name": "label_8",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Database",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_4",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ },
+ {
+ "button_type": "push",
+ "columns": 1,
+ "icon": "AAAAAA==",
+ "icon_file_name": "",
+ "icon_size": {
+ "value": "icon"
+ },
+ "icon_system_size": {
+ "value": "default"
+ },
+ "icon_system_type": {
+ "value": "ok"
+ },
+ "icon_type": {
+ "value": "none"
+ },
+ "name": "bt_save",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": ">",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "Save to Database",
+ "translatable": true
+ },
+ "type": "button::pushbutton"
+ },
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_6",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ }
+ ],
+ [
+ {
+ "columns": 2,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_5",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ },
+ {
+ "button_type": "push",
+ "columns": 1,
+ "icon": "AAAAAA==",
+ "icon_file_name": "",
+ "icon_size": {
+ "value": "icon"
+ },
+ "icon_system_size": {
+ "value": "default"
+ },
+ "icon_system_type": {
+ "value": "ok"
+ },
+ "icon_type": {
+ "value": "none"
+ },
+ "name": "bt_load",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "<",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "Load from Database",
+ "translatable": true
+ },
+ "type": "button::pushbutton"
+ },
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_7",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ }
+ ],
+ [
+ {
+ "columns": 1,
+ "name": "label_6",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Key1",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ "columns": 1,
+ "name": "out_k1_local",
+ "password": false,
+ "read_only": true,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_2",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ "columns": 1,
+ "name": "out_k1_db",
+ "password": false,
+ "read_only": true,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ }
+ ],
+ [
+ {
+ "columns": 1,
+ "name": "label_9",
+ "rows": 1,
+ "text": {
+ "id": "",
+ "text": "Key2",
+ "translatable": true
+ },
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "label",
+ "word_wrap": false
+ },
+ {
+ "columns": 1,
+ "name": "out_k2_local",
+ "password": false,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ },
+ {
+ "columns": 1,
+ "maximum_size": -1,
+ "minimum_size": 0,
+ "name": "spacer_3",
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "spacer::horizontal"
+ },
+ {
+ "columns": 1,
+ "name": "out_k2_db",
+ "password": false,
+ "read_only": false,
+ "rows": 1,
+ "tooltip": {
+ "id": "",
+ "text": "",
+ "translatable": true
+ },
+ "type": "input::string",
+ "value": ""
+ }
+ ]
+ ],
+ "control": {
+ "id": "OkCancel"
+ },
+ "embedding": "always_toplevel",
+ "position": "",
+ "size": {
+ "height": 485,
+ "width": 347
+ },
+ "sizemode": "automatic",
+ "style": "",
+ "title": {
+ "id": "",
+ "text": "SQL Database Example",
+ "translatable": true
+ }
+}
diff --git a/AppExamples/misc/SQLExample/scripts/modules/requirements.txt b/AppExamples/misc/SQLExample/scripts/modules/requirements.txt
new file mode 100644
index 0000000..5bb5574
--- /dev/null
+++ b/AppExamples/misc/SQLExample/scripts/modules/requirements.txt
@@ -0,0 +1 @@
+mysql-connector-python
\ No newline at end of file