Path: news.cs.au.dk!not-for-mail From: Kasper Ligaard Nielsen Newsgroups: daimi.beta Subject: BetaDBC og PostgreSQL Date: Tue, 16 Feb 1999 11:09:01 +0100 Organization: University of Aarhus, Department of Computer Science (DAIMI) Lines: 362 Message-ID: <36C943BD.D6A0F9EF@cs.au.dk> NNTP-Posting-Host: decius.cs.au.dk Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------DFD4224832E658718C362D1A" X-Trace: xinwen.cs.au.dk 919159743 9454 255.255.255.255 (16 Feb 1999 10:09:03 GMT) X-Complaints-To: news@cs.au.dk NNTP-Posting-Date: 16 Feb 1999 10:09:03 GMT X-Mailer: Mozilla 4.05C-SGI [en] (X11; I; IRIX 6.5 IP32) Xref: news.cs.au.dk daimi.beta:10389 This is a multi-part message in MIME format. --------------DFD4224832E658718C362D1A Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Hej, Hjemme har jeg fået sat Postgresql 6.4.2 op på min linux maskine, da mit dProg2 projekt benytter BetaDBC. Jeg har også hentet /users/dprog2/* på daimis system og lagt det ind tilsvarende sted på min egen maskine i.e. jeg kan nu compile mit dProg2 projekt hjemme hvilket går fint: [~/temp/projekt]$ beta DatabaseServer.bet Mjolner BETA Compiler version 5.4.3 (640) for Linux (Intel 386/486/586/Pentium) (elf) Target machine type linux Building dependency graph for: 'DatabaseServer' ... Translating fragments ... ....Linking Object program on file: DatabaseServer .... [~/temp/projekt]$ .... MEN når jeg udfører DatabaseServer får jeg følgende (selvom startensemble er oppe at køre): [~/temp/projekt]$ DatabaseServer ******************************************************************* * Note: This program was compiled using a Personal Edition of the * * Mjolner BETA System and may not be used for commercial purposes * ******************************************************************* **** Exception processing openConnectionException Could not connect to the server; Could not connect to remote socket. IM0021 # Beta execution aborted: Stop is called. # Look at 'DatabaseServer.dump' [~/temp/projekt]$ Jeg havde i første omgang startet med at åbne Postgres postmaster til at modtage unix sockets og da det ikke virkede prøvede jeg med inet, men lige lidt hjalp det. Min .odbc.ini ser ud som følger: [~]$ less .odbc.ini [MotorRegister] # data source containing the 'HvidePlader' database on localhost # this database contains the register tables from MotorRegisteret Driver = /users/kursus/dprog2/RDB/lib/libcliPG.so Database = HvidePlader Servername = localhost ReadOnly = 0 Så altså hvad er problemet? - Skal jeg gøre yderligere med Postgres? - Har postgres automatisk et odbc interface? (jeg kan godt oprette og nedlægge databaser og brugere + køre psql etc.) - Er der en bestemt abresse hardcoded ind i BetaDBC eller libcliPG.so, som jeg ikke kan komme til eller ... ? Jeg attacher mine beta-filer: DatabaseServer.bet, DatabaseServerBody.bet og ClientServerShared.bet (sidstnævnte deles mellem DB Server og en klient vha. -- mvh Kasper L. Nielsen --------------DFD4224832E658718C362D1A Content-Type: text/plain; charset=us-ascii; name="DatabaseServer.bet" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="DatabaseServer.bet" ORIGIN '~beta/distribution/shell'; INCLUDE '/users/kursus/dprog2/BetaDBC/betadbc'; INCLUDE 'lib/ClientServerShared'; INCLUDE '~beta/process/processmanager'; INCLUDE '~beta/basiclib/file'; BODY 'private/DatabaseServerBody'; -- program: descriptor -- shellEnv (# shellType:: sqlServer (# newSqlAccessImpl:: (# do &DBaccess[] -> theSqlAccess[]; #); SqlAccessDoneImpl:: (# do theSqlAccess[] -> withdraw; #); #); Ref2Txt: @ (* converts a dynamic text into a static ditto *) (# t1: ^text; t2: @text enter t1[] exit t1->t2 #); DBaccess: sqlAccess (# IndkaldImpl:: (# sqlCon: @connection; stmt: @sqlCon.directSqlStatement; rs: ^sqlCon.resultset; Today: @time; do (* MotorRegister is defined in .odbc.ini - the name is arbitrary *) ('MotorRegister', 'ligaard', 'foobar') -> sqlCon.open; 'Today'->sqlCon.declareDate (# set:: (# do value->Today #); get:: (# do Today->value #); #); timenow->Today; (* make a relation from hvideplader which contains the components we are interested in: *) 'SELECT RegNr, Ejer, IndRegDato, NaesteSyn, Synstype, Fabrikat, Model FROM HvidePlader WHERE NaesteSyn=:Today OR Synstype=\'tvunget\'' -> stmt; stmt.getexpanded -> putline; stmt.execute -> rs[]; (* From this new relation, select those car-owners, whose car is up for inspection: *) rs.scan (# RegNr, Ejer, Fabrikat, Model: ^text; IndRegDato, SynsDato: @time; latex, dvips: @process; f: @file; SynsType: ^text; <> #); stmt.close; sqlCon.close; #); getCarImpl:: (# sqlCon: @connection; stmt: @sqlCon.directSqlStatement; rs: ^sqlCon.resultset; enter RegNr <> exit aCar[] #); ApproveCarImpl:: (# sqlCon: @connection; stmt: @sqlCon.directSqlStatement; rs: ^sqlCon.resultset; SidstSynet: @time; NaesteSyn: @time; enter RegNr <> #); #); Indkald: @DBaccess; do Indkald.IndkaldImpl; #) --------------DFD4224832E658718C362D1A Content-Type: text/plain; charset=iso-8859-1; name="DatabaseServerBody.bet" Content-Transfer-Encoding: 8bit Content-Disposition: inline; filename="DatabaseServerBody.bet" ORIGIN '../DatabaseServer'; -- FindCarsReadyForInspection: DoPart -- do current.s -> RegNr[]; current.s -> Ejer[]; current.d -> IndRegDato; current.d -> SynsDato; current.s -> Synstype[]; current.s -> Fabrikat[]; current.s -> Model[]; (* '/tmp/'->RegNr.prepend;'.tex'->RegNr.append->f.name; * f.OpenWrite; * '\\documentclass[a4paper,12pt]{article}\\usepackage{latexsym}\\usepackage{doublespace}\\usepackage[danish]{babel}\\usepackage[latin1]{inputenc}\\usepackage{moreverb}\\begin{document}\\titlepage\\begin{spacing}{2}\\begin{flushright}\\today\\end{flushright}\\section*{Statens Bilinspektion}Godmorgen\\footnote{Vi antager De læser Deres post om morgenen}'->f.putline; * Ejer[]->f.putline; * ', her er en påmindelse om at De skal stille til '->f.putline; * (if NOT('omsyn'->Synstype.equal) then ' syn '->Synstype.append if); * Synstype[]->f.putline; * 'inden for en måned.\\\\ Derfor bedes De omgående kontakte vores bookingcenter, for at aftale en tid hos deres lokale inspektions center\\begin{center} \\begin{tabular}{|l|l|l|r|} \\hline Fabrikat & Model & Indregistreret & Pris for syn \\\\ \\hline '->f.putline; * Fabrikat[]->f.putline; ' & '->f.putline; * Model[]->f.putline; ' & '->f.putline; * IndRegDato->f.putdate; ' & '->f.putline; * 'kr. '->f.putline; * (if 'omsyn'->Synstype.equal then '175'->f.putline * else '350'->f.putline; * if); * ',-\\\\ \\hline\\end{tabular}\\end{center} NB: Det vedlagte girokort \\emph{skal} være betalt inden synsdagen og kvitteringen herfor medbringes ved synet.\\\\ Har De ikke aftalt en tid inden for en måned sendes sagen til politiet.\\\\ Med venlig hilsen\\\\ Staten Bilinspektion\\end{spacing}\\end{document}'->f.putline; * f.close; * *) -- FindCarInDataBase: DoPart -- do (* MotorRegister is defined in .odbc.ini - the name is arbitrary *) ('MotorRegister', 'ligaard', 'foobar') -> sqlCon.open; 'RegNr'->sqlCon.declareText (# set:: (# do value->RegNr #); get:: (# do RegNr[]->value[] #) #); &Car[]->aCar[]; 'SELECT RegNr, Fabrikat, Model, StelNummer, Ejer, IndRegDato, SidstSynet, NaesteSyn FROM hvideplader WHERE RegNr=:RegNr'->stmt; stmt.execute->rs[]; rs.scan (# do (* here I strongly rely on the order in which the above query selects attributes *) current.s -> Ref2Txt -> aCar.RegNr; current.s -> Ref2Txt -> aCar.Fabrikat; current.s -> Ref2Txt -> aCar.Model; current.s -> Ref2Txt -> aCar.Stelnummer; current.s -> Ref2Txt -> aCar.Ejer; current.d -> aCar.indregistreret_dato; current.d -> aCar.SidstSynet; current.d -> aCar.NaesteSyn; #); stmt.close; sqlCon.close; -- UpdateDataBaseForThisCar: DoPart -- do (* MotorRegister is defined in .odbc.ini - the name is arbitrary *) ('MotorRegister', 'ligaard', 'foobar') -> sqlCon.open; 'RegNr'->sqlCon.declareText (# set:: (# do value->RegNr #); get:: (# do RegNr[]->value[] #) #); 'SidstSynet'->sqlCon.declareDate (# set:: (# do value->SidstSynet #); get:: (# do SidstSynet->value #); #); 'NaesteSyn'->sqlCon.declareDate (# set:: (# do value->NaesteSyn #); get:: (# do NaesteSyn->value #); #); timenow->SidstSynet->NaesteSyn; SidstSynet.year+2->NaesteSyn.year; (* ok, now we are set; lets send this to the database: *) 'UPDATE hvideplader SET synstype=\'periodisk\' , SidstSynet=:SidstSynet , NaesteSyn=:NaesteSyn WHERE RegNr=:RegNr'->stmt; stmt.execute; stmt.close; sqlCon.close; --------------DFD4224832E658718C362D1A Content-Type: text/plain; charset=us-ascii; name="ClientServerShared.bet" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ClientServerShared.bet" ORIGIN '~beta/distribution/basicshell'; INCLUDE '~beta/basiclib/timedate'; --- shellEnvLib:attributes --- (* WARNING: Since this file is shared by both Client and Server you will have to recompile both * if you edit this file; at least if you edit the sqlAccess pattern, which is the shared pattern. *) (* First we define the shared datatypes: *) Car: (# RegNr: @text; Fabrikat: @text; Model: @text; StelNummer: @text; Ejer: @text; indregistreret_dato: @time; SidstSynet: @time; NaesteSyn: @time; Show: (# do RegNr[]->putline; Fabrikat[]->putline; StelNummer[]->putline; indregistreret_dato->puttime; newline; #); #); sqlAccess: Remoteable (# ResultSet: (* Intended to hold results from requests *) (# #); (* Now we define the shared methods (or more precisely: patterns): *) Request: entry (* alpha version, i.e. only interface description *) (# Select, From, Where: @text; ResSet: ^ResultSet enter (Select, From, Where) do (Select, From, Where)->RequestImpl; exit ResSet[] #); Indkald: entry (# do IndkaldImpl #); getCar: entry (# RegNr: @text; aCar: ^Car; enter RegNr do RegNr -> getCarImpl -> aCar[] exit aCar[] #); ApproveCar: entry (# RegNr: @text; enter RegNr do RegNr -> ApproveCarImpl #); (* Here are all the implementing-ready virtuals *) RequestImpl:< (# Select, From, Where: @text; ResSet: ^ResultSet enter (Select, From, Where) do INNER exit ResSet[] #); IndkaldImpl:< (# do INNER #); getCarImpl:< (# RegNr: @text; aCar: ^Car; enter RegNr do INNER exit aCar[] #); ApproveCarImpl:< (# RegNr: @text; enter RegNr do INNER #); #); sqlServer: Shell (# newSqlAccess: entry (# theSqlAccess: ^sqlAccess; do newSqlAccessImpl -> theSqlAccess[] exit theSqlAccess[] #); SqlAccessDone: entry (# theSqlAccess: ^sqlAccess; enter theSqlAccess[] do theSqlAccess[] -> SqlAccessDoneImpl #); newSqlAccessImpl:< (# theSqlAccess: ^SqlAccess; do INNER exit theSqlAccess[] #); SqlAccessDoneImpl:< (# theSqlAccess: ^sqlAccess; enter theSqlAccess[] do INNER #); do (THIS(sqlServer)[],'sqlServer') -> myEnsemble.ns.put(# overwrite:: (# do true -> value #)#); #); --------------DFD4224832E658718C362D1A--