# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# RECIPE CATEGORY: PostgreSQL
# RECIPE KEYWORDS: autocommit, transactions
# RECIPE STARTS HERE
#: You can enable autocommit mode by passing the ``autocommit`` parameter
#: to the ``connect`` function. When autocommit is enabled, each statement
#: is automatically committed without needing to call ``commit()`` explicitly.
#: This is useful for operations that cannot be run inside a transaction,
#: or when you want each statement to be committed immediately.

import os

import adbc_driver_postgresql.dbapi

uri = os.environ["ADBC_POSTGRESQL_TEST_URI"]

# Enable autocommit mode
conn = adbc_driver_postgresql.dbapi.connect(uri, autocommit=True)

with conn.cursor() as cur:
    # In autocommit mode, this statement is automatically committed
    cur.execute("CREATE TEMP TABLE IF NOT EXISTS autocommit_test (id INTEGER)")
    cur.execute("INSERT INTO autocommit_test VALUES (1)")

# Verify the data was committed
with conn.cursor() as cur:
    cur.execute("SELECT * FROM autocommit_test")
    assert cur.fetchone() == (1,)

conn.close()
