import socket
import struct
class TeradataClient:
def __init__(self, host='localhost', port=1025):
self.host = host
self.port = port
self.socket = None
def connect(self, username, password, database='test'):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
logon_data = struct.pack('>H', 1) logon_data += self._encode_string(username)
logon_data += self._encode_string(password)
logon_data += self._encode_string(database)
logon_data += self._encode_string("UTF8")
logon_parcel = struct.pack('>HI', 100, len(logon_data) + 6)
logon_parcel += logon_data
message = struct.pack('>IIH', len(logon_parcel) + 10, 1, 1)
message += logon_parcel
self.socket.send(message)
response = self.socket.recv(4096)
return self._check_auth_response(response)
def execute(self, sql):
run_data = struct.pack('>HH', 1, 0) run_data += struct.pack('>I', len(sql))
run_data += sql.encode('utf-8')
run_parcel = struct.pack('>HI', 1, len(run_data) + 6)
run_parcel += run_data
message = struct.pack('>IIH', len(run_parcel) + 10, 1, 1)
message += run_parcel
self.socket.send(message)
return self._read_response()
def close(self):
if self.socket:
logoff_parcel = struct.pack('>HI', 101, 6)
message = struct.pack('>IIH', 16, 1, 1)
message += logoff_parcel
self.socket.send(message)
self.socket.close()
def _encode_string(self, s):
b = s.encode('utf-8')
return struct.pack('>H', len(b)) + b
def _check_auth_response(self, data):
return b'\x00\x66' in data
def _read_response(self):
response = self.socket.recv(8192)
return response
def main():
print("YamlBase Teradata Protocol Example")
print("=" * 40)
client = TeradataClient(port=1025)
print("\n1. Connecting to YamlBase...")
if client.connect('admin', 'password', 'EnterpriseDB'):
print(" ✓ Connected successfully")
else:
print(" ✗ Connection failed")
return
print("\n2. Testing Teradata SEL syntax...")
response = client.execute("SEL * FROM employees WHERE department = 'Engineering'")
if response:
print(" ✓ Query executed successfully")
print("\n3. Testing Teradata date functions...")
response = client.execute("""
SEL employee_id,
first_name,
ADD_MONTHS(hire_date, 12) AS anniversary_date,
EXTRACT(YEAR FROM hire_date) AS hire_year
FROM employees
""")
if response:
print(" ✓ Teradata functions working")
print("\n4. Testing Teradata operators...")
response = client.execute("""
SEL project_id,
budget,
budget MOD 100000 AS budget_remainder
FROM projects
WHERE status = 'active'
""")
if response:
print(" ✓ Teradata operators working")
print("\n5. Testing system table emulation...")
response = client.execute("SEL * FROM DBC.Tables")
if response:
print(" ✓ System tables accessible")
print("\n6. Closing connection...")
client.close()
print(" ✓ Connection closed")
print("\n" + "=" * 40)
print("Example completed successfully!")
print("\nTo use with real Teradata tools:")
print(" - BTEQ: .logon localhost:1025/admin,password")
print(" - Python: import teradatasql")
print(" - JDBC: jdbc:teradata://localhost:1025/EnterpriseDB")
if __name__ == "__main__":
main()