Examples
Here are some examples demonstrating how to use Parseltongue to interact with GemStone/S 64.
Basic Session Management
from reahl.ptongue import LinkedSession
# Create a linked session
session = LinkedSession(
username="DataCurator",
password="swordfish",
stone_name="gs64stone"
)
try:
# Start a transaction
session.begin()
# Do some work...
# Commit the transaction
session.commit()
except Exception as e:
# In case of error, abort the transaction
session.abort()
raise
finally:
# Always log out
session.log_out()
Working with Collections
from reahl.ptongue import LinkedSession
session = LinkedSession(username="DataCurator", password="swordfish")
try:
session.begin()
# Create different types of collections
array = session.execute("Array new: 3")
dictionary = session.resolve_symbol('Dictionary').new()
set = session.resolve_symbol('IdentitySet').new()
# Working with arrays
array.at_put(1, "First")
array.at_put(2, "Second")
array.at_put(3, "Third")
# Working with dictionaries
dictionary.at_put(session.new_symbol('key1'), "Value 1")
dictionary.at_put(session.new_symbol('key2'), "Value 2")
# Working with sets
set.add("Item 1")
set.add("Item 2")
set.add("Item 1") # Won't add duplicate
# Convert to Python
py_array = array.to_py
py_dict = dictionary.to_py
py_set = set.to_py
print(f"Array: {py_array}")
print(f"Dictionary: {py_dict}")
print(f"Set: {py_set}")
session.commit()
finally:
session.log_out()
Converting Between Python and GemStone
from reahl.ptongue import LinkedSession
session = LinkedSession(username="DataCurator", password="swordfish")
try:
session.begin()
# Python to GemStone
py_int = 42
py_float = 3.14159
py_string = "Hello, GemStone!"
py_list = [1, 2, 3, 4]
py_dict = {"a": 1, "b": 2}
py_set = {1, 2, 3}
gs_int = session.from_py(py_int)
gs_float = session.from_py(py_float)
gs_string = session.from_py(py_string)
gs_list = session.from_py(py_list)
gs_dict = session.from_py(py_dict)
gs_set = session.from_py(py_set)
# GemStone to Python
assert gs_int.to_py == py_int
assert gs_float.to_py == py_float
assert gs_string.to_py == py_string
assert gs_list.to_py == py_list
assert gs_dict.to_py == py_dict
assert gs_set.to_py == py_set
# Working with dates
today = session.resolve_symbol('Date').today()
py_date_string = today.asString().to_py
print(f"Today is: {py_date_string}")
session.commit()
finally:
session.log_out()
Database Operations
from reahl.ptongue import LinkedSession
session = LinkedSession(username="DataCurator", password="swordfish")
try:
session.begin()
# Store data in UserGlobals
user_globals = session.resolve_symbol('UserGlobals')
# Create a persistent object
person_class = session.execute('''
Object subclass: 'Person'
instVarNames: #('name' 'age')
classVars: #()
classInstVars: #()
poolDictionaries: #()
inDictionary: UserGlobals
constraints: #()
''')
# Add methods to the class
session.execute('''
Person compile: 'name: aString
name := aString'
classified: 'accessing'
''')
session.execute('''
Person compile: 'age: anInteger
age := anInteger'
classified: 'accessing'
''')
session.execute('''
Person compile: 'printString
^ name, '' (age: '', age printString, '')''''
classified: 'printing'
''')
# Create an instance
person = person_class.new()
person.name_("John Doe")
person.age_(30)
# Store in UserGlobals
user_globals.at_put(session.new_symbol('myPerson'), person)
# Retrieve and use the object
retrieved_person = user_globals.at(session.new_symbol('myPerson'))
print(f"Person: {retrieved_person.printString().to_py}")
session.commit()
finally:
session.log_out()
These examples demonstrate the basic functionality of Parseltongue. For more advanced usage, refer to the API documentation.