99from iris_utils ._module_exports import copy_public_exports
1010
1111from . import _bootstrap
12+ from ._byref import ByRef
1213from ._dbapi import make_dbapi
1314
1415_WRAPPER_EXPORTS = {
1718 "dbapi" ,
1819 "cls" ,
1920 "connect" ,
21+ "execute" ,
22+ "gref" ,
23+ "ref" ,
2024 "ByRef" ,
2125 "make_ref" ,
2226 "IRISVector" ,
@@ -287,8 +291,20 @@ def public_cls(class_name):
287291 def public_connect (* args , path = None , ** kwargs ):
288292 return self .connect (* args , path = path , ** kwargs )
289293
294+ def public_execute (statements ):
295+ return self .execute (statements )
296+
297+ def public_gref (global_name ):
298+ return self .gref (global_name )
299+
300+ def public_ref (value = "" ):
301+ return self .ref (value )
302+
290303 public_cls .__name__ = "cls"
291304 public_connect .__name__ = "connect"
305+ public_execute .__name__ = "execute"
306+ public_gref .__name__ = "gref"
307+ public_ref .__name__ = "ref"
292308 self ._public_cls = public_cls
293309 self ._public_connect = public_connect
294310
@@ -297,6 +313,9 @@ def public_connect(*args, path=None, **kwargs):
297313 self .module_globals ["dbapi" ] = self .dbapi
298314 self .module_globals ["cls" ] = public_cls
299315 self .module_globals ["connect" ] = public_connect
316+ self .module_globals ["execute" ] = public_execute
317+ self .module_globals ["gref" ] = public_gref
318+ self .module_globals ["ref" ] = public_ref
300319
301320 def finalize_all (self ) -> None :
302321 existing_all = self .module_globals .get ("__all__" )
@@ -313,6 +332,9 @@ def finalize_all(self) -> None:
313332 "dbapi" ,
314333 "cls" ,
315334 "connect" ,
335+ "execute" ,
336+ "gref" ,
337+ "ref" ,
316338 "ByRef" ,
317339 "make_ref" ,
318340 "IRISVector" ,
@@ -378,6 +400,9 @@ def sync_public_modules(self):
378400 "cls" ,
379401 "connect" ,
380402 "system" ,
403+ "execute" ,
404+ "gref" ,
405+ "ref" ,
381406 "ByRef" ,
382407 "make_ref" ,
383408 "IRISVector" ,
@@ -454,6 +479,82 @@ def get_dbapi_embedded_cls(self):
454479 return cls_candidate
455480 return None
456481
482+ def _get_embedded_module_attr (self , current_runtime , name , * , required = False ):
483+ current_runtime = self .ensure_embedded_backend (
484+ current_runtime ,
485+ required = required ,
486+ )
487+ module = getattr (current_runtime , "embedded_module" , None )
488+ if module is not None :
489+ attr = getattr (module , name , None )
490+ if callable (attr ):
491+ return attr
492+ return None
493+
494+ def execute (self , statements ):
495+ current_runtime = self .runtime_manager .get ()
496+ if current_runtime .mode == "native" :
497+ if current_runtime .iris is None :
498+ raise RuntimeError ("iris.runtime is configured for native mode, but no native IRIS handle is bound" )
499+ raise RuntimeError ("iris.execute requires an embedded runtime" )
500+
501+ if current_runtime .mode == "embedded" :
502+ embedded_execute = self ._get_embedded_module_attr (
503+ current_runtime ,
504+ "execute" ,
505+ required = True ,
506+ )
507+ if callable (embedded_execute ):
508+ return embedded_execute (statements )
509+ raise RuntimeError ("iris.runtime is configured for embedded mode, but embedded execute is unavailable" )
510+
511+ if current_runtime .embedded_available :
512+ embedded_execute = self ._get_embedded_module_attr (current_runtime , "execute" )
513+ if callable (embedded_execute ):
514+ return embedded_execute (statements )
515+
516+ raise RuntimeError ("iris.execute requires an embedded runtime" )
517+
518+ def gref (self , global_name ):
519+ current_runtime = self .runtime_manager .get ()
520+ if current_runtime .mode == "native" :
521+ if current_runtime .iris is None :
522+ raise RuntimeError ("iris.runtime is configured for native mode, but no native IRIS handle is bound" )
523+ raise RuntimeError ("iris.gref requires an embedded runtime" )
524+
525+ if current_runtime .mode == "embedded" :
526+ embedded_gref = self ._get_embedded_module_attr (
527+ current_runtime ,
528+ "gref" ,
529+ required = True ,
530+ )
531+ if callable (embedded_gref ):
532+ return embedded_gref (global_name )
533+ raise RuntimeError ("iris.runtime is configured for embedded mode, but embedded gref is unavailable" )
534+
535+ if current_runtime .embedded_available :
536+ embedded_gref = self ._get_embedded_module_attr (current_runtime , "gref" )
537+ if callable (embedded_gref ):
538+ return embedded_gref (global_name )
539+
540+ raise RuntimeError ("iris.gref requires an embedded runtime" )
541+
542+ def ref (self , value = "" ):
543+ current_runtime = self .runtime_manager .get ()
544+ if current_runtime .mode == "embedded" or (
545+ current_runtime .mode == "auto" and current_runtime .embedded_available
546+ ):
547+ embedded_ref = self ._get_embedded_module_attr (
548+ current_runtime ,
549+ "ref" ,
550+ required = current_runtime .mode == "embedded" ,
551+ )
552+ if callable (embedded_ref ):
553+ return embedded_ref (value )
554+ if current_runtime .mode == "embedded" :
555+ raise RuntimeError ("iris.runtime is configured for embedded mode, but embedded ref is unavailable" )
556+ return ByRef (value )
557+
457558 def cls (self , class_name ):
458559 current_runtime = self .runtime_manager .get ()
459560 if current_runtime .mode == 'native' :
0 commit comments