[fpc-pascal] Boring problem when I try to create a database using	SQLdb (again)
    silvioprog 
    silvioprog at gmail.com
       
    Sat May 16 18:09:44 CEST 2015
    
    
  
Hello,
I need to create numbered databases like 09_0025, 09_0026 etc., that using
any SQL tool like pgAdmin, I just execute this script, and it works fine:
CREATE DATABASE "09_0025" WITH ENCODING='UTF-8'
  OWNER="postgres" TEMPLATE="template1" LC_COLLATE='English_United
States.1252' LC_CTYPE='English_United States.1252'
  CONNECTION LIMIT=-1 TABLESPACE="pg_default"
Notice that I need to specify some details, like ENCODING, OWNER,
LC_COLLATE/LC_CTYPE etc., so the TPQConnection.CreateDB can't be used
because it doesn't allows to configure those details.
Another information before show my tests: this script above works fine in
other libs like Zeos, UniDAC and JDBC, I tested it yesterday.
Now, please see my tests and their respective errors.
Test 1:
[code]
var
  VCon: TPQConnection;
begin
  VCon := TPQConnection.Create(nil);
  try
    VCon.HostName := '127.0.0.1';
    VCon.DatabaseName := 'postgres';
    VCon.UserName := 'postgres';
    VCon.Password := 'postgres';
    VCon.ExecuteDirect(
      'CREATE DATABASE "09_0025" WITH ENCODING=''UTF8'' ' +
      '  OWNER="postgres" TEMPLATE="template1" LC_COLLATE=''English_United
States.1252'' LC_CTYPE=''English_United States.1252'' ' +
      '  CONNECTION LIMIT=-1 TABLESPACE="pg_default"');
  finally
    VCon.Free;
  end;
end;
[/code]
Error:
Transaction not set.
Test 2:
[code]
var
  VCon: TPQConnection;
begin
  VCon := TPQConnection.Create(nil);
  VCon.Transaction := TSQLTransaction.Create(VCon);
  try
    VCon.HostName := '127.0.0.1';
    VCon.DatabaseName := 'postgres';
    VCon.UserName := 'postgres';
    VCon.Password := 'postgres';
    VCon.ExecuteDirect(
      'CREATE DATABASE "09_0025" WITH ENCODING=''UTF8'' ' +
      '  OWNER="postgres" TEMPLATE="template1" LC_COLLATE=''English_United
States.1252'' LC_CTYPE=''English_United States.1252'' ' +
      '  CONNECTION LIMIT=-1 TABLESPACE="pg_default"');
  finally
    VCon.Free;
  end;
end;
[/code]
Error:
TPQConnection : Execution of query failed  (PostgreSQL: ERROR:  CREATE
DATABASE cannot run inside a transaction block
Severity: ERROR
SQL State: 25001
Primary Error: CREATE DATABASE cannot run inside a transaction block).
And the code that works fine in Zeos:
[code]
var
  VCon: TZConnection;
begin
  VCon := TZConnection.Create(nil);
  try
    VCon.Protocol := 'postgresql-9';
    VCon.HostName := '127.0.0.1';
    VCon.Database := 'postgres';
    VCon.User := 'postgres';
    VCon.Password := 'postgres';
    VCon.Connect;
    VCon.ExecuteDirect(
      'CREATE DATABASE "mydatabase" WITH ENCODING=''UTF8'' ' +
      '  OWNER="postgres" TEMPLATE="template1" LC_COLLATE=''English_United
States.1252'' LC_CTYPE=''English_United States.1252'' ' +
      '  CONNECTION LIMIT=-1 TABLESPACE="pg_default"');
  finally
    VCon.Free;
  end;
end;
[code/]
Taking a look at the internal TPQConnection code, I found the method
"ExecuteDirectPG", and propositally I moved it to public area and tested
again using it:
[code]
var
  VCon: TPQConnection;
begin
  VCon := TPQConnection.Create(nil);
  try
    VCon.HostName := '127.0.0.1';
    VCon.DatabaseName := 'postgres';
    VCon.UserName := 'postgres';
    VCon.Password := 'postgres';
    VCon.ExecuteDirectPG(
      'CREATE DATABASE "09_0025" WITH ENCODING=''UTF8'' ' +
      '  OWNER="postgres" TEMPLATE="template1" LC_COLLATE=''English_United
States.1252'' LC_CTYPE=''English_United States.1252'' ' +
      '  CONNECTION LIMIT=-1 TABLESPACE="pg_default"');
  finally
    VCon.Free;
  end;
end;
[/code]
Finally, it worked fine. So I have two questions:
Using SQLdb, how to execute scripts directly in the driver outside a
transaction?
Why methods like "ExecuteDirectPG", "CheckConnectionStatus",
"CheckResultError", "TranslateFldType" and "GetExtendedFieldInfo" are not
declared as protected methods?
Thank you!
PS. please apply this patch to fix a typo in dbconsts unit:
http://bugs.freepascal.org/view.php?id=28107
-- 
Silvio Clécio
My public projects - github.com/silvioprog
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20150516/10ff828f/attachment.html>
    
    
More information about the fpc-pascal
mailing list