Tartalom beküldés hibás PostgreSQL alatt

Sweetchuck képe

Sziasztok
Azt vettem észre hogy PostgreSQL adatbázis esetén gondok vannak a fórum téma létrehozásánál. Most kénkért hiba üzenetet nem tudom mutatni, de az IF függvénnyel van a baja.
(nem PHP függbény hanem pgsql ben tárolt eljárás.)
Nem olyan tipusú datatokat amit szeretne.
A problémát orvosoltam egy másik IF() fügvénnyel

CREATE OR REPLACE FUNCTION if(int4, text, text)
  RETURNS text AS
$BODY$
    SELECT CASE WHEN ($1<>0) THEN $2 ELSE $3 END;
$BODY$
LANGUAGE 'sql' VOLATILE;

Így működik és létre lehet hozni "fórum csoportokat" és "fórumokat" de nem lehet új támát nyítni mert
hibaüzenet:
warning: pg_query() [function.pg-query]: Query failed: ERROR: invalid input syntax for integer: ""

INSERT INTO node (title, body, format, uid, type, teaser, status, moderate, promote, sticky, comment, created, changed, nid) VALUES('level küldés', 'törzs', '1', '2', 'forum', 'törzs', '1', '', '1', '', '2', '1124185792', '1124185792', '4')

A moderate és a sticky mezők kapnak ürest stirnget szám helyett.
A furcsa az, hogy már a db tábla deklarációja is különbözik a mysql-től, de nem a kérdéses mezőknél.

pg moderate integer   NOT NULL default '0',
my moderate int(2)    NOT NULL default '0',
pg teaser text        NOT NULL default '',
my teaser longtext    NOT NULL,
pg body text          NOT NULL default '',
my body longtext      NOT NULL,
pg revisions text     NOT NULL default '',
my revisions longtext NOT NULL,
pg sticky integer     NOT NULL default '0',
my sticky int(2)      NOT NULL default '0', 

A probléma helyszíne:
WinXP PostgreSQL 8.03
Drupal 4.6.(0-3) Nem most vettem észre, csak most jelzem/ kérdezem hogy mi a megoldás, illetve hogy tapasztalt-e valaki hasonlót?

Sweetchuck képe

nem csak fórumnál hanem bármilyen node INSERT esetében fenn áll a probléma.

0
0
Sweetchuck képe

Nem biztos hogy a legszebb megoldás, de müködik.
Kicsit átírtam a node.module fájlt.
Nem bizos hogy szükség van a statikusan tárolni a parse_url($db_url) függvény eredményét mert gyakran csak 1 node insert történik egy oldal lekérésközben, de asszem hogy én olyan modult írok ami többet is fog egyszere insertálni.
Szóval a módosítások Drupal 4.6.3 esetén:
410. sor környékén van egy ilyen elágazás a node_save() függvényben.

// Apply filters to some default node fields:
if (empty($node->nid)) {
  // Insert a new node.

itt ágazik el az a rész hogy INSERT vagy UPDATE
és az elágazás elé ezt írtam:

static $db_url_array=NULL;
if($db_url_array==NULL){
  global $db_url;
  $db_url_array = parse_url($db_url);
}//if
 
az elágazás mindkét részében van egy ehez hasonló rész:
<code>
// Prepare the query:
foreach ($node as $key => $value) {
  if (in_array((string) $key, $fields)) {
    $k[] = db_escape_string($key);
    $v[] = $value;
    $s[] = "'%s'";
  }
}

csere erre:

// Prepare the query:
foreach ($node as $key => $value) {
  if (in_array((string) $key, $fields)) {
    if(($url['scheme'] = 'pgsql')
    && ($key == 'moderate' || $key == 'sticky')
    && ($value == '' || $value == NULL)
    ){
      $value=0;
    }
    $k[] = db_escape_string($key);
    $v[] = $value;
    $s[] = "'%s'";
  }
}

most így müködik rendesen.

Azért gyanítom, hogy csak nálam van a hiba mert ez olyan dolog ami 1 perc alatt kiderül ha nem müködik.
Szeretnék visszajelzést, hogy más tapasztala-e ezt a jelenséget.
PostgreSQL sever telepítéssel együtt is csak 10 perc.
Köszönöm :)

0
0
Sweetchuck képe

most látom hogy rosszult jelent meg a témanyitó hozzászólásomban a pgsql függvény:

CREATE OR REPLACE FUNCTION if(int4, text, text)
RETURNS text AS
$BODY$
  SELECT CASE WHEN ($1&lt;&gt;0) THEN $2 ELSE $3 END;
$BODY$
LANGUAGE 'sql' VOLATILE;

a kisebb/nagyobb jelek hiányoztak

0
0
Hojtsy Gábor képe

Ezt jó lenne megfogalmazni egy bug report formájában, és szépen beküldeni a drupal.org-on, hogy ha már te megoldottad, mások ne szenvedjenek vele.

0
0
Sweetchuck képe

Olvasni tudok angolul de írni már kevésbé. :-\
Lehet hogy hamarabb észreveszik a hibát és kijavítják mint ahogy megfejtik az angolomat. :D
Jó azért eltudnám mutogatni.

Miközben írtam ezt az üzenetet erőt vettem magamon (az előzö sor után) és megírtam életem első bug reportját. :)
Tehettem volna elöbb is, mert kb 2 hónapja észrevettem a hibát. Rögtön az elején ahogy elkezdtem a drupallal ismerkedni.
Nem tudom megmerjem-e mutatni :)
http://drupal.org/node/28996

0
0
Hojtsy Gábor képe

Nagyon jó úton haladsz :) Azt kellenne még megtapasztalni, hogy a szükséges változtatásokat hogyan küldöd be. Használj mondjuk Tortoise CVS-t, ahogy leírtuk a kézikönyvben, és szedd le vele a 4.6.x-es verziót, amit használsz. Javítsd ki a modulban a hibákat, és a jobb klikkes menüben válaszd a diffet, az elő fogja állítani azt, amit mindenki megért, és amit a bugreporthoz tudsz csatolni. Akkor sokkal hamarabb érsz el eredményeket a hibajavításoddal.

0
0
Sweetchuck képe

Egy fórum topicnak a hozzászólását (comment) akartam moderálni, mint Admin.
A users tábla UPDATE-jénél ugyan az a hiba mint a node tábla esetén.
Szám tipusú mezőbe üres sztriget próbál belegyömöszölni.

Gyanítom hogy a teljes redszerben jelen van ez a híba. :(

0
0
djula képe

Nagyon nem stimmel ez a pgsql a 4.6.3 drupalban, pedig nem akarok mysql-t használni.
A fentieket alkalmazva a fórum probléma megoldódott, de van még egy az elfogadási sornál:

warning: pg_query() [function.pg-query]: Query failed: ERROR:  function if(boolean, integer, integer) does not exist
HINT:  No function matches the given name and argument types. You may need to add explicit type casts. in /usr/local/www/hostname.hu/drupal/includes/database.pgsql.inc on line 45.
 
user error: 
query: SELECT n.nid, n.title, n.type, u.name, u.uid, SUM(IF(q.uid = 1, 1, 0)) AS voted, SUM(q.vote) AS score FROM node n INNER JOIN users u ON n.uid = u.uid INNER JOIN queue q ON n.nid = q.nid WHERE n.moderate = 1 GROUP BY n.nid, n.title, n.type, u.name, u.uid, q.uid, q.vote LIMIT 10 OFFSET 0 in /usr/local/www/hostname.hu/drupal/includes/database.pgsql.inc on line 62.

Van erre is megoldása valakinek?
0
0
Sweetchuck képe

CREATE OR REPLACE FUNCTION "if"(boolean, int, int)
RETURNS int AS
'
  SELECT CASE WHEN ($1) THEN $2 ELSE $3 END;
'
LANGUAGE 'sql';

Ez talán megoldja a problémát.
A Drupal-nak azon a részén még nem jártam. (Elfogadásisor)

0
0
djula képe

Köszi, ezzel már tökéletesen működik minden!

0
0